首页 > 解决方案 > 未调用访问者中的方法

问题描述

我正在尝试访问者模式。我已经按照“The Definitive Antlr4 Reference”一书中的示例进行操作,现在我正在自己尝试。

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

标签: javaantlr4

解决方案


推荐阅读