【问题标题】:Java ANTLR 4 Listener enter-methods don't get calledJava ANTLR 4 侦听器输入方法不会被调用
【发布时间】:2017-11-16 12:35:25
【问题描述】:

我无耻地盗用 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是终端节点数,0variables的大小; "init" 不会打印,即使该节点/规则确实被访问过。

对于有问题的树,至少应该有一些声明(可以通过查看图形树来验证这一点)。

任何帮助或提示?

提前致谢!

【问题讨论】:

  • 我以前在开发语法的过程中更改了根规则时也发生过这种情况。你确定你的 tree walker 是从规则 init 开始的吗?
  • 我从未更改过我的顶级/根规则,所以不应该是这样。
  • 与我们分享您的语法可能会有所帮助...您使用的是哪个版本的 ANTLR?
  • 在下面查看我的答案。我只是犯了一个菜鸟的错误。

标签: java listener antlr4


【解决方案1】:

在某些方面,发布到 StackOverflow 会有所帮助,即使没有提供答案。
尤其是当问题出在你自己的时候......

Antlr 没有问题(我使用的是 4.7,顺便说一句)语法没有问题,听者也没有问题。原来项目有两个非常相似的语法,有两个非常相似的名字;我使用了错误的语法和听众匹配。

【讨论】:

猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 2022-01-19
  • 2011-03-22
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多