antlr4 - 如何在antlr的python访问者中迭代
问题描述
我正在尝试使用 python 目标的访问者创建对象。对于以下语法规则:
prog : stat+ ;
我有这个用于创建相应对象的访问者代码:
def visitProg(self, ctx:ExprParser.ProgContext):
stat_list = []
for s in ctx.stat():
stat_list.append(self.visit(s))
node = ObjProg(stat_list)
return node
上面的代码工作正常。但是,当我将规则更改为此:
prog : s1=stat (',' s2=stat)* ;
对应的访客代码应该是什么?我试着这样写,但我得到了编译错误:
def visitProg(self, ctx:ExprParser.ProgContext):
stat_list = []
stat_list.append(self.visit(ctx.s1))
for s in ctx.s2:
stat_list.append(self.visit(s))
node = ObjProg(stat_list)
return node
解决方案
在规则中:
prog : s1=stat (',' s2=stat)* ;
两者s1
和s2
都是单一的stat
上下文。所以代码for s in ctx.s2
不正确。
如果您使用+=
运算符:
prog : stats+=stat (',' stats+=stat)* ;
那么你可以这样做:
def visitProg(self, ctx:ExprParser.ProgContext):
stat_list = []
for s in ctx.stats:
stat_list.append(self.visit(s))
return ObjProg(stat_list)
如果需要将第一个stat
与其他分开,您可以这样做:
prog : first_stat=stat (',' stats+=stat)* ;
然后是这样的:
def visitProg(self, ctx:ExprParser.ProgContext):
stat_list = [self.visit(ctx.first_stat)]
for s in ctx.stats:
stat_list.append(self.visit(s))
return ObjProg(stat_list)
也许您需要检查是否ctx.stats is None
,我不确定。
推荐阅读
- java - 在 maven 解决其依赖关系之前在本地 maven 中安装第三方 jar?
- google-analytics - 使用 UTM 查询进行预缓存时重复获取请求
- ios - 如何使用基于 PHPhotoLibraryAuthorizationStatus 的 SwiftUI 显示/隐藏视图?
- html - 我的 Span 元素没有响应移动设备上的 CSS
- python - 没有在python中获得确切值的原因是什么?
- swift - 条件中的变量绑定需要一个初始化器-Swift
- javascript - 使用 AJAX 从 HTML 调用 .js 文件
- android - BLE 支持的安卓手机
- java - 是否最好传递整个对象或调用它的方法并传递返回值?
- llvm - 在某些函数 llvm 中查找局部变量