目前,我正在使用这样的代码在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
那些电话和类似的东西?
我得到的结果很好,一切都正常。但我很好奇是否有更好的解决方案。
答案 0 :(得分:1)
是的,这是您访问各个子部分的方式。另外,您可以只使用主上下文的childrens
属性,该属性包含ParseTree实例(实际上是TerminalNode或RuleContext实例,具体取决于它是否是终端)。这样您就不需要检查单个子上下文(这只是childrens
列表的另一个视图)。
旁注:除了子语境外,您还可以在语法中使用变量,例如
expr:
left = INT op = ('+' | '-') right = INT
| left = INT op = ('*' | '/') right = INT
;
这将创建变量left
和right
,您可以直接访问这些变量而无需转到子上下文。