parsing - ANTLR的Visitor系统可以在解析文件时自动访问规则上下文吗?
问题描述
我已经使用 ANTLR 一个月了,但我仍然不是专家。我想知道BaseVisitor
生成的 ANTLR 类是否会在实现后自动访问特定的规则上下文visitRuleContext()
并且要解析的文件已完成。
解决方案
是的,如果您查看生成的访问者类,您会看到所有方法都返回visitChildren(ctx)
。因此,当您只覆盖visit...(...)
您自己的访问者中的一种方法时,您的单一方法将被调用。
快速测试表明:
grammar T;
parse
: something+ EOF
;
something
: ANY+
| number
;
number
: DIGITS
;
DIGITS
: [0-9]+
;
ANY
: .
;
和一个测试类:
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(CharStreams.fromString("mu 123"));
TParser parser = new TParser(new CommonTokenStream(lexer));
ParseTree root = parser.parse();
new TestVisitor().visit(root);
}
}
class TestVisitor extends TBaseVisitor<Object> {
@Override
public Object visitSomething(TParser.SomethingContext ctx) {
System.out.println("visitSomething: " + ctx.getText());
return super.visitChildren(ctx);
}
}
将打印:
visitSomething: mu
visitSomething: 123
推荐阅读
- sql - SAS Proc SQL - 在一组说大学及其价格中排名前 n (第 3)高?(老实说,硬件)
- snowflake-task - 比较在雪花存储过程中声明的变量
- csv - 如何将 csv 文件设置为在浏览器中打开而不是在 Site Ground 帐户上下载
- bootstrap-4 - Blazor Web 程序集边栏错误:“SfSidebar.Toggle()' 已过时:blazor”
- vba - 没有“保存更改”对话框的 Outlook VBA 草稿电子邮件
- c++ - 用 C++ 读取文本文件中的所有单词
- python - 无法找到 xpath 包含很多“div”的元素
- qt - 有没有办法在 Qt Designer 中创建两个独立的布局?
- datastage - DataStage 在作业批处理中调用用户定义的服务器例程
- c++ - clang ++ 构建失败,但 gcc 构建成功