在ANTLR4树监听器中访问主上下文的子上下文

时间:2016-07-28 08:21:30

标签: antlr4

目前,我正在使用这样的代码在ANTLR4的树监听器实现中访问主上下文的子上下文:

ctx.children.forEach(function(child) {
    if (child.ITALIC != undefined) {
        var text = child.ITALIC().getText();

        ...
    } else if (child.LABELREF != undefined) {
        var text = child.LABELREF().getText();

        ...
    }

    ...

由于我使用的是JavaScript ANTLR4目标,我不太确定这是否是访问此类信息的正确方法。

如果这是C#或Java目标,我想我会找到最好的方法。或者这会导致

child.ITALIC != null
那些电话和类似的东西?

我得到的结果很好,一切都正常。但我很好奇是否有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

是的,这是您访问各个子部分的方式。另外,您可以只使用主上下文的childrens属性,该属性包含ParseTree实例(实际上是TerminalNode或RuleContext实例,具体取决于它是否是终端)。这样您就不需要检查单个子上下文(这只是childrens列表的另一个视图)。

旁注:除了子语境外,您还可以在语法中使用变量,例如

expr:
  left = INT op = ('+' | '-') right = INT
  | left = INT op = ('*' | '/') right = INT
;

这将创建变量leftright,您可以直接访问这些变量而无需转到子上下文。