AST如何处理空节点
AST how to deal with empty nodes
我正在使用 Java、JFlex(lexer gen) 和 Jacc(parser gen) 构建表达式求值器。我需要:
- 生成词法分析器
- 生成解析器
- 生成 AST
- 显示 AST 图
- 计算表达式
我能够创建词法分析器、解析器和 AST。现在我正在尝试使用访问者模式制作 AST 图,但这使我生成的 AST 出现了明显的问题(可以这么说)。在我的计算器中,我需要处理括号,它们会在我的 AST 中创建空节点(这使得我的解析树不是我想的 AST)。这是我语法的相关部分:
Calc : /* empty */
| AddExpr { ast = new Calc(); }
;
AddExpr : ModExpr
| AddExpr '+' ModExpr { $$ = new AddExpr(, , "+"); }
| AddExpr '-' ModExpr { $$ = new AddExpr(, , "-"); }
;
ModExpr : IntDivExpr
| ModExpr MOD IntDivExpr { $$ = new ModExpr(, ); }
;
IntDivExpr : MultExpr
| IntDivExpr DIV MultExpr { $$ = new IntDivExpr(, ); }
;
MultExpr : UnaryExpr
| MultExpr '*' UnaryExpr { $$ = new MultExpr(, , "*"); }
| MultExpr '/' UnaryExpr { $$ = new MultExpr(, , "/"); }
;
UnaryExpr : ExpExpr
| '-' UnaryExpr { $$ = new UnaryExpr(, "-"); }
| '+' UnaryExpr { $$ = new UnaryExpr(, "+"); }
;
ExpExpr : Value
| ExpExpr '^' Value { $$ = new ExpExpr(, ); }
;
Value : DoubleLiteral
| '(' AddExpr ')' { $$ = new Value(); }
;
DoubleLiteral : DOUBLE { $$ = ; }
;
这是一个示例表达式:
1*(2+3)/(4-5)*((((6))))
以及生成的图像:
这给我留下了每对括号的 Value
个节点。我对如何处理这个问题有一些想法,但我不确定如何进行:
- 尝试在我的语法中处理这个问题(不确定如何处理,因为我不允许使用优先指令)
- 在我的评估器中处理这个
如果您不想要 Value
个节点,则只需将 { $$ = new Value(); }
替换为 { $$ = ; }
。
我正在使用 Java、JFlex(lexer gen) 和 Jacc(parser gen) 构建表达式求值器。我需要:
- 生成词法分析器
- 生成解析器
- 生成 AST
- 显示 AST 图
- 计算表达式
我能够创建词法分析器、解析器和 AST。现在我正在尝试使用访问者模式制作 AST 图,但这使我生成的 AST 出现了明显的问题(可以这么说)。在我的计算器中,我需要处理括号,它们会在我的 AST 中创建空节点(这使得我的解析树不是我想的 AST)。这是我语法的相关部分:
Calc : /* empty */
| AddExpr { ast = new Calc(); }
;
AddExpr : ModExpr
| AddExpr '+' ModExpr { $$ = new AddExpr(, , "+"); }
| AddExpr '-' ModExpr { $$ = new AddExpr(, , "-"); }
;
ModExpr : IntDivExpr
| ModExpr MOD IntDivExpr { $$ = new ModExpr(, ); }
;
IntDivExpr : MultExpr
| IntDivExpr DIV MultExpr { $$ = new IntDivExpr(, ); }
;
MultExpr : UnaryExpr
| MultExpr '*' UnaryExpr { $$ = new MultExpr(, , "*"); }
| MultExpr '/' UnaryExpr { $$ = new MultExpr(, , "/"); }
;
UnaryExpr : ExpExpr
| '-' UnaryExpr { $$ = new UnaryExpr(, "-"); }
| '+' UnaryExpr { $$ = new UnaryExpr(, "+"); }
;
ExpExpr : Value
| ExpExpr '^' Value { $$ = new ExpExpr(, ); }
;
Value : DoubleLiteral
| '(' AddExpr ')' { $$ = new Value(); }
;
DoubleLiteral : DOUBLE { $$ = ; }
;
这是一个示例表达式:
1*(2+3)/(4-5)*((((6))))
以及生成的图像:
这给我留下了每对括号的 Value
个节点。我对如何处理这个问题有一些想法,但我不确定如何进行:
- 尝试在我的语法中处理这个问题(不确定如何处理,因为我不允许使用优先指令)
- 在我的评估器中处理这个
如果您不想要 Value
个节点,则只需将 { $$ = new Value(); }
替换为 { $$ = ; }
。