如何从java中获取ANTLR AST中的所有变量

时间:2018-02-28 20:35:59

标签: java antlr abstract-syntax-tree

我使用ANTLR构建AST,用于两个简单的赋值x = 1 + 2; y = 3 + 5;

,树生成如下:

single_input
 simple_stmt
   small_stmt
     expr_stmt
       testlist_star_expr
         test
           or_test
             and_test
               not_test
                 comparison
                   expr
                     xor_expr
                       and_expr
                         shift_expr
                           arith_expr
                             term
                               factor
                                 power
                                   atom_expr
                                     atom
   testlist_star_expr
     test
       or_test
         and_test
           not_test
             comparison
               expr
                 xor_expr
                   and_expr
                     shift_expr
                       arith_expr
                         term
                           factor
                             power
                               atom_expr
                                 atom
                         term
                           factor
                             power
                               atom_expr
                                 atom
small_stmt
 expr_stmt
   testlist_star_expr
     test
       or_test
         and_test
           not_test
             comparison
               expr
                 xor_expr
                   and_expr
                     shift_expr
                       arith_expr
                         term
                           factor
                             power
                               atom_expr
                                 atom
   testlist_star_expr
     test
       or_test
         and_test
           not_test
             comparison
               expr
                 xor_expr
                   and_expr
                     shift_expr
                       arith_expr
                         term
                           factor
                             power
                               atom_expr
                                 atom
                         term
                           factor
                             power
                               atom_expr
                                 atom

我想知道如何访问atom表达式中的变量x。我该如何解析树?

我按如下方式打印了上面的树:

RuleContext r = parser.single_input();
ASTPrinter ast = new ASTPrinter();
ast.print(r);

我的ASTPrinter类如下:

public class ASTPrinter {

public void print(RuleContext ctx) {
   explore(ctx, 0);
}

private void explore(RuleContext ctx, int indentation) {
   String ruleName = Python3Parser.ruleNames[ctx.getRuleIndex()];
   for (int i=0;i<indentation;i++) {
       System.out.print("  ");
   }
   System.out.println(ruleName);
   for (int i=0;i<ctx.getChildCount();i++) {
       ParseTree element = ctx.getChild(i);
       if (element instanceof RuleContext) {
           explore((RuleContext)element, indentation + 1);
       }
   }
  }

  }

我可以从ruleNames数组中获取ruleName。有什么方法可以检索变量(x)的名称吗?

1 个答案:

答案 0 :(得分:0)

假设您正在使用Pyhton3.g4 grammar,您可以显示如下变量:

public class Main {

    public static void main(String[] args) {

        String source = "x = 1 + 2; y = 3 + 5;\n";
        Python3Lexer lexer = new Python3Lexer(CharStreams.fromString(source));
        Python3Parser parser = new Python3Parser(new CommonTokenStream(lexer));

        ParseTreeWalker.DEFAULT.walk(new Python3BaseListener() {

            // expr_stmt
            //  : testlist_star_expr ( augassign ( yield_expr | testlist)
            //                       | ( '=' ( yield_expr| testlist_star_expr ) )*
            //                       )
            //  ;
            @Override
            public void enterExpr_stmt(Python3Parser.Expr_stmtContext ctx) {
                System.out.println("variable: " + ctx.testlist_star_expr().get(0).getText());
            }
        }, parser.single_input());
    }
}

将打印:

variable: x
variable: y

如果您想了解更多关于听众的信息,以及如何&#34;装饰&#34;解析器使用标签进行规则,以便您可以微调树行走,看看这些链接: