从 java 中的 ANTLR 生成的解析树创建代码和令牌的映射

Create a Map of code & token from ANTLR generated parse tree in java

我正在使用 ANTLR 为使用 Java:

的 python 代码创建解析树

对于以下 python 代码:

def sum(a, b):

    return a + b

print("Hello World")

ANTLR 输出以下 AST:

file_input
  funcdef
    parameters
      typedargslist
        tfpdef
        tfpdef
    suite
      simple_stmt
        return_stmt
          arith_expr
            atom
            atom
  atom_expr
    atom
    trailer
      atom

在 Java 中有没有一种方法可以将类型映射到代码,例如:

funcdef : "def sum(a,b)"
parameters : "a,b"
simple_stmt : "return a + b"

是的。 您只需导航到所需的 ParseTree 节点并使用 PaseTree.getText()

提取文本

它不会直接在节点上,子节点包含在树中的父节点中,因此您需要特定的终端节点。 下面的代码只是主题,你必须玩弄它才能得到你想要的。

也就是说,您最好使用实现 ParseTreeListener 并在它们出现时做出响应,而不是尝试显式导航到解析树。

Python3.FuncdefContext ctx = ...;

System.out.printf( "funcdef: def %s ( %s )\n", 
     ctx.getChild(1).getText() 
     ctx.getChild(2).getChild(0).getText()
     );
System.out.printf( "parameters: %s \n", 
     ctx.getChild(2).getChild(0).getText()
     );
System.out.printf( "simple_stmt: %s \n", 
     ctx.getChild(2).getChild(1).getText()
     );