Я строю оценщик выражений, используя Java, JFlex (lexer gen) и Jacc (genser parser).Мне нужно:
- сгенерировать лексер
- сгенерировать парсер
- сгенерировать AST
- отобразить график AST
- оценить выражение
Мне удалось создать лексер и парсер и AST.Сейчас я пытаюсь сделать график AST, используя шаблон посетителя, но это сделало проблему с моим сгенерированным AST очевидной (так сказать).В моем калькуляторе мне нужно обрабатывать скобки, и они создают пустые узлы в моем AST (и это делает мое дерево разбора не AST, я полагаю).Вот соответствующая часть моей грамматики:
Calc : /* empty */
| AddExpr { ast = new Calc($1); }
;
AddExpr : ModExpr
| AddExpr '+' ModExpr { $$ = new AddExpr($1, $3, "+"); }
| AddExpr '-' ModExpr { $$ = new AddExpr($1, $3, "-"); }
;
ModExpr : IntDivExpr
| ModExpr MOD IntDivExpr { $$ = new ModExpr($1, $3); }
;
IntDivExpr : MultExpr
| IntDivExpr DIV MultExpr { $$ = new IntDivExpr($1, $3); }
;
MultExpr : UnaryExpr
| MultExpr '*' UnaryExpr { $$ = new MultExpr($1, $3, "*"); }
| MultExpr '/' UnaryExpr { $$ = new MultExpr($1, $3, "/"); }
;
UnaryExpr : ExpExpr
| '-' UnaryExpr { $$ = new UnaryExpr($2, "-"); }
| '+' UnaryExpr { $$ = new UnaryExpr($2, "+"); }
;
ExpExpr : Value
| ExpExpr '^' Value { $$ = new ExpExpr($1, $3); }
;
Value : DoubleLiteral
| '(' AddExpr ')' { $$ = new Value($2); }
;
DoubleLiteral : DOUBLE { $$ = $1; }
;
Вот пример выражения:
1*(2+3)/(4-5)*((((6))))
и полученное изображение:
![enter image description here](https://i.stack.imgur.com/TZ6sw.png)
Это оставляет мне Value
узлов для каждой пары скобок.У меня есть несколько идей о том, как с этим справиться, но я не уверен, что делать дальше:
- Попытайтесь обработать это в моей грамматике (не уверен, как, поскольку мне не разрешено использовать директивы приоритетов)
- Обработайте это в моем оценщике