标签的ANTLR4侦听器“不同上下文”问题

时间:2019-11-20 10:30:43

标签: listener antlr antlr4

我的听众有问题:

  • 我正在使用 ParseTreeProperty 存储“任何内容”(基本上是Map ): private ParseTreeProperty parseTreeProperty;

  • 我将变量存储在 enterEveryRule 方法中: parseTreeProperty.put(ctx,myObject);

  • 我通过 exitEveryRule 方法重新获得它: MyObject myObject = parseTreeProperty.get(ctx);

除了带有标签的标签外,此方法非常有效。

任何带有标签的语法:

general_rule
    : rule_1    #label_1
    | rule_2    #label_2
    ;

问题:

  • 当侦听器输入方法 enterEveryRule(ParserRuleContext ctx)时,上下文ctx为 General_ruleContext
  • 当侦听器输入方法 exitEveryRule(ParserRuleContext ctx)时,上下文ctx为 Label_1Context / Label_2Context

由于 enterEveryRule和exitEveryRule之间的上下文不同,因此 ParseTreeProperty不能按标签的预期目的工作。 为什么进入上下文不是“标签规则”或离开上下文是“主规则”?

我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

在您的情况下,在生成的侦听器中,“ general_rule”的树漫步者替代方案的结果将使用相同的enterGeneral_rule()exitGeneral_rule()方法。

但是使用您所使用方法的标签将类似于:

void enterLabel_1();
void exitLabel_1();
void enterLabel_2();
void exitLabel_2();