java - AST如何处理空节点

标签 java parsing abstract-syntax-tree interpreter

我正在使用 Java、JFlex(lexer gen) 和 Jacc(parser 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 节点。我对如何处理这个问题有一些想法,但我不确定如何进行:

  • 尝试在我的语法中处理这个问题(不确定如何处理,因为我不允许使用优先指令)
  • 在我的评估器中处理这个

最佳答案

如果您不想要 Value 节点,则只需替换 { $$ = new Value($2); }{ $$ = $2;

关于java - AST如何处理空节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55297463/

相关文章:

Java - 从属性文件读取对象

python - 从 csv 中读取 python 的标题

java - 使用 JDT 将注释附加到类

c++ - clang -cc1 和系统包括

java - 加载 ScriptC 脚本失败/无法加载库 - Renderscript Android

java - 使用硬盘空间作为 Java 堆?

JAVAFX——这个X/Y位置有东西吗?

c# - Visual Studio C#语法/句子结构检查方法

java - java中的简单日期格式,解析异常

scala 为抽象数据类型正确定义了一个空值