书中的示例LabeledExpr.g4描述了如何将访问者类用于singleton。但是,如果我想参观一个收藏的班级,我该怎么办?例如语法:
prog: stat+ ;
stat: expr NEWLINE # printExpr
;
打印的访问者功能显示为:
public Integer visitPrintExpr(LabeledExprParser.PrintExprContext ctx) {
Integer value = visit(ctx.expr()); // evaluate the expr child
System.out.println(value); // print the result
return 0; // return dummy value
}
"stat+"对应的访问者函数是什么,这样我就可以遍历"stat"的列表?
我寻找这个的原因是,我可能想先解析整个对象模型并将其存储在内存中,然后对其进行几次访问和分析(而不是像书中的示例所示那样动态评估/打印)。
一个相关的问题是,如果我在语法文件中创建一些数据结构(如书中ActionExpr.g4所示),我如何在访问者函数中访问这些数据结构?例如,如何在访问者函数中访问下面创建的Expr类?
stat [Expr e]
: expr NEWLINE # printExpr
{$e = new Expr($expr);}
;
生成的ProgContext.stat()
方法返回完整的集合。您可以从访问者的visitProg
方法中访问它。