Как мне сгенерировать список команд для оценки математического выражения на стековой машине, используя деревья разбора и токенизатор?
Поэтому я пытаюсь создать класс CalcParser, который при задании математического выражения генерирует строку, содержащую команды для оценки выражения на стековой машине. Например, 1+2*3 должно вывести:
нажмите 1.0
пуш 2.0
пуш 3.0
умножать
добавлять
Кроме того, скобки должны соблюдаться. Итак, (1+2)*3 должно вывести:
нажмите 1.0
пуш 2.0
добавлять
пуш 3.0
умножать
Я работаю с уже существующим классом CalcLexer, который содержит анализируемую строку и преобразует ее в серию токенов, используя java.util.StringTokenizer
, Единственная часть информации, необходимая для этого класса, это операторы \t\n\r+-*/() и пробелы, которые также считаются отдельными токенами.
Вот мой вопрос Если бы я использовал деревья разбора для генерации выходного кода, как бы я учел скобки, так как выражение внутри скобок всегда будет выполняться первым? Вот то, что я пока parseRootexp()
метод, и у меня есть ощущение, что я немного не в себе:
private double value;
private CalcLexer lexer = new CalcLexer();
private void parseRootexp(){
if (lexer.nextToken() == '('){
match('(');
do{
lexer.nextToken();
if (lexer.nextToken() == CalcLexer.NUMBER_TOKEN){
value = lexer.getNum();
System.out.println("push " + value + "\n");
}
} while (lexer.nextToken() != ')');
}
}
match(int token)
Метод используется просто для сопоставления текущего токена с допустимым символом терминала. Если нет, возвращается ошибка. Я знаю, что это далеко от того, что я хочу в идеале, но мне нужно что-то, чтобы подтолкнуть меня в правильном направлении. Заранее спасибо.