java - 未调用访问者中的方法
问题描述
我正在尝试访问者模式。我已经按照“The Definitive Antlr4 Reference”一书中的示例进行操作,现在我正在自己尝试。
这个想法是简单地解析一个 XML 文件。我成功地使用了一个听众,但我被访客困住了。没有调用任何方法。
我将 IntelliJ 与 Antlr 插件一起使用。
以下是我遵循的步骤:
- 用插件测试语法以验证它
- 生成监听器和访问者
- 和听众一起找点乐子
- 访问者失败
为了调试我的访问者,我使用了以下步骤:
- 在我的课堂上放一个断点,但在调试中都没有调用它们
- 在基类中放一个断点,结果一样
- 尝试使用书中的语法(第 4 章,4.2 “使用访客构建计算器”),这给了我预期的结果
这是语法:
grammar ClassLoaderXML ;
root : 'Hello World' ;//node WS?;
node : startTag WS* content+ endTag WS*;
startTag : '<' identifiant (WS? attribut)* '>' ;
endTag : '</' identifiant '>' ;
attribut : identifiant WS? '=' WS? '\'' WORD (WS WORD)* '\'';
identifiant : WORD ('-' WORD)*;
content: WORD (WS? WORD)* # string
| node # childNode
;
WORD : [a-zA-Z]+ ;
COMMENT : '<!--' .*? '-->' -> skip;
WS : [ \t\n\r]+ ;
这是我的访客班:
public class ClassLoaderVisitor extends ClassLoaderXMLBaseVisitor<String> {
@Override
public String visitRoot(ClassLoaderXMLParser.RootContext ctx){
System.out.println("Hello world!");
return visitChildren(ctx);
}
@Override
public String visitNode(ClassLoaderXMLParser.NodeContext ctx){
System.out.println(ctx.getText());
visitChildren(ctx.startTag());
return ctx.getText();
}
@Override
public String visitIdentifiant(ClassLoaderXMLParser.IdentifiantContext ctx){
visitChildren(ctx);
return ctx.getText();
}
}
这是我在主课中的方法:
private static void LoadFile(String inputFile) throws IOException {
CharStream input = CharStreams.fromFileName(inputFile);
ClassLoaderXMLLexer lexer = new ClassLoaderXMLLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ClassLoaderXMLParser parser = new ClassLoaderXMLParser(tokens);
ParseTree tree = parser.node();
ClassLoaderXMLBaseVisitor visitor = new ClassLoaderXMLBaseVisitor();
visitor.visit(tree);
}
编辑 这是在最后一个代码片段中实例化的错误类:
ClassLoaderXMLBaseVisitor visitor = new ClassLoaderXMLBaseVisitor();
visitor.visit(tree);
本来应该
ClassLoaderVisitor visitor = new ClassLoaderVisitor();
visitor.visit(tree);
谢谢@Carlos Heuberger
解决方案
推荐阅读
- xamarin.ios - Xamarin Ios 15.0 无法在 WatchOS 8 中启动应用程序
- docker - ChromeDriver 在 AWS lambda 函数上给了我错误,但在本地 docker 上没有
- three.js - Three.js - DeviceOrientationControls 在某些 Android 设备中的位置不正确
- bash - 有没有办法给Baloo文件系统添加一个新属性来管理文件?
- url - 将超链接放在单元格中以转到同一工作表的另一张表的脚本
- javascript - 试图理解闰年测试 - 'year & 3' 'year & 15'
- c++ - 单个负载是否与多个商店同步?
- python - 如何在 django 模板中迭代多个列表
- php - 新的 wordpress 版本不支持 SVG
- python - 我有这个循环,它为我需要打印总的一系列交易提供“加价”金额