我正在使用Java,JFlex(lexer gen)和Jacc(parser gen)构建表达式评估器。我需要:
我能够创建词法分析器,解析器和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))))
和生成的图像:
这给我每对括号留了Value
个节点。我对如何处理有一些想法,但是我不确定如何进行:
答案 0 :(得分:3)
如果您不希望有Value
个节点,只需将{ $$ = new Value($2); }
替换为{ $$ = $2; }
。