我正在尝试访客模式。我已经按照《权威的Antlr4参考》一书中的示例进行操作,现在我自己进行尝试。
这个想法是简单地解析XML文件。我成功地使用了一个听众,但被访问者所吸引。没有一个方法被调用。
我将IntelliJ与Antlr插件一起使用。
这是我遵循的步骤:
要调试访问者,我使用了以下步骤:
这是语法:
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