代码之家  ›  专栏  ›  技术社区  ›  DoTheGenes

Java ANTLR 4侦听器enter方法未被调用

  •  1
  • DoTheGenes  · 技术社区  · 8 年前

    我无耻地盗取了(略经编辑的)标题 another question 因为我也有同样的问题,我说这个问题还没有被回答(已经快一年了)。

    enter*** 我的听众的方法不起作用。我可以用 visitTerminal 方法,我已经测试过了 enterEveryRule (如在另一个问题中)这也有效。但是 enterVariableDeclaration enterInit 未调用。

    init 是我语法的最高准则。使用时,我能够获得此树/规则的图形表示 TestRig .

    我的侦听器代码:

    class MyListener extends MyGrammarBaseListener {
    
        private int terminalCounter = 0;
        private List<String> variables = new ArrayList<>();
    
    
        @Override
        public void visitTerminal(TerminalNode node) {
            terminalCounter++;
        }
    
        @Override
        public void enterVariableDeclaration(MyGrammarParser.VariableDeclarationContext ctx) {
            variables.add(ctx.getText());
        }
    
        @Override
        public void enterInit(JavaExamGrammarParser.InitContext ctx) {
            System.out.println("init");
        }
    
        int getTerminalNodeCount() {
            return terminalCounter;
        }
    
        List<String> getVariables() {
            return variables;
        }
    
    }
    

    输出为:

    143
    0
    

    哪里 143 是终端节点数和 0 是的大小 variables ; "init" 即使该节点/规则为 肯定 已访问。

    对于所讨论的树,应该至少有几个声明(可以通过查看图形树来验证这一点)。

    提前感谢!

    1 回复  |  直到 8 年前
        1
  •  3
  •   DoTheGenes    8 年前

    在某些方面,即使没有提供答案,只需发布到StackOverflow也会有所帮助。
    特别是当问题是你自己做的时候。。。

    Antlr没有问题(我使用的是4.7,顺便说一句),语法没有问题,侦听器也没有问题。事实证明,该项目有两个 非常相似 带两个的语法 非常相似 姓名;我用错了语法和听众的搭配。