如何将 Antlr4 自动生成的解析器树转换为 AST?

How to convert a parser tree automatically generated by Antlr4 to an AST?

提问人:WildPointer 提问时间:10/25/2023 更新时间:10/25/2023 访问量:35

问:

这是我的 Lambda.g4 文件。它判断一个表达式是否是 lambda 表达式:

// Lambda.g4
grammar Lambda;

// Lexer rules
ID : [a-zA-Z]+;                   // Identifiers (variables)
CONST : [0-9]+
      | [a-zA-Z]+;               // Predefined constants and functions

// Parser rules
expression : variable     #var
           | constant     #cons
           |'(' 'L' variable+ expression ')' #lamb
           |'(' expression+ expression ')' #comb
           ;

variable : ID;

constant : CONST;

// Ignore whitespace and newlines
WS : [ \t\r\n]+ -> skip;

现在我正在尝试将 Antlr4 生成的解析器树转换为 AST,并删除仅在解析时有意义但在逻辑上无用的元素。例如,对于 lambda 表达式:

((L m (sqr ((L n (add m n)) 2))) 4)

我希望打印一个像这样的抽象语法树:

comb(lamb(m, comb(con(sqr),
                  comb(lamb(n, comb(comb(con(add),
                                         var(m)),
                               var(n))),
                       con(2)))),
     con(4))

我知道我必须为 AST 的每个可能节点定义一个像 xxNode 这样的类,但我不知道我应该定义什么属性。我也不知道如何编写自己的 MyLambdaVisitor.java 来实现我的目标。

如何创建和打印 AST?顺便说一句,我正在使用 Java 和 IntelliJ IDEA。

java antlr4 抽象语法树 lambda-calculus

评论


答: 暂无答案