AST如何处理空节点

问题描述 投票:1回答:1

我正在使用Java,JFlex(lexer gen)和Jacc(解析器gen)构建表达式求值程序。我需要:

  • 生成词法分析器
  • 生成解析器
  • 生成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

这为我留下了每对圆括号的Value节点。我对如何处理这个问题有一些想法,但我不知道如何继续:

  • 尝试在我的语法中处理这个问题(不知道我怎么不允许使用优先级指令)
  • 在我的评估员中处理这个问题
java parsing abstract-syntax-tree interpreter
1个回答
3
投票

如果你不想要Value节点,那么只需用{ $$ = new Value($2); }替换{ $$ = $2; }

© www.soinside.com 2019 - 2024. All rights reserved.