在 ANTLR4 Tree-Listener 中访问 Main-Context 的子上下文
Access Sub-Contexts of Main-Context in ANTLR4 Tree-Listener
目前我正在使用这样的代码来访问我的 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
电话之类的?
我得到的结果很好,一切正常。不过我很好奇有没有更好的解决办法
是的,这就是您访问各个子部分的方式。或者,您可以只使用主上下文的 childrens
属性,它包含 ParseTree 实例(实际上是 TerminalNode 或 RuleContext 实例,具体取决于它是否是终端)。这样你就不需要检查单独的子上下文(这只是 childrens
列表的另一种视图)。
旁注:除了子上下文,您还可以在语法中使用变量,例如
expr:
left = INT op = ('+' | '-') right = INT
| left = INT op = ('*' | '/') right = INT
;
这将创建变量 left
和 right
,您可以直接访问它们而无需转到子上下文。
目前我正在使用这样的代码来访问我的 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
电话之类的?
我得到的结果很好,一切正常。不过我很好奇有没有更好的解决办法
是的,这就是您访问各个子部分的方式。或者,您可以只使用主上下文的 childrens
属性,它包含 ParseTree 实例(实际上是 TerminalNode 或 RuleContext 实例,具体取决于它是否是终端)。这样你就不需要检查单独的子上下文(这只是 childrens
列表的另一种视图)。
旁注:除了子上下文,您还可以在语法中使用变量,例如
expr:
left = INT op = ('+' | '-') right = INT
| left = INT op = ('*' | '/') right = INT
;
这将创建变量 left
和 right
,您可以直接访问它们而无需转到子上下文。