访问者中的方法未被调用

时间:2019-03-31 08:10:32

标签: java antlr4

我正在尝试访客模式。我已经按照《权威的Antlr4参考》一书中的示例进行操作,现在我自己进行尝试。

这个想法是简单地解析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

0 个答案:

没有答案