我使用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)的名称吗?
答案 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;解析器使用标签进行规则,以便您可以微调树行走,看看这些链接: