SLY无法生成空产生式规则:解析器实现报错求助
问题解决思路与修正代码
核心问题分析
出现这两个警告的原因有两个:
- SLY不允许拆分定义同一个非终结符:你把
Statement拆成了两个@_装饰器的函数,后面的@_('epsilon')会覆盖前面的@_('Variables'),导致Variables分支的Statement完全不可达;同时单独定义的epsilon符号因为被覆盖后的Statement没正确关联,被标记为不可达。 Variables的返回值逻辑错误:当前代码只返回单个p.Variable,无法收集多个变量的结果,会丢失后续变量。
修正后的代码
# 假设Variable已正确实现 @_('Variables', '') def Statement(self, p): # 对应Variable+分支返回变量列表,epsilon分支返回空列表 return p.Variables if p.Variables else [] @_('Variable Variables', 'Variable') def Variables(self, p): # 处理多个变量的情况:把当前变量和后续变量列表合并 if len(p) == 2: return [p.Variable] + p.Variables # 单个变量的情况:返回包含该变量的列表 else: return [p.Variable]
关键修改点说明
- 合并
Statement的产生式:把Variables和空串(对应epsilon)放在同一个@_装饰器里,SLY会正确识别这两个可选分支,不会出现覆盖问题。 - 移除单独的
epsilon非终结符:不需要单独定义epsilon函数,直接用空串作为Statement的一个分支即可,更符合SLY的写法。 - 修复
Variables的返回逻辑:确保多个变量时能收集所有变量到列表中,单个变量时返回单元素列表,让Statement的返回结果统一为列表类型(非空或空),逻辑更一致。 - 处理epsilon分支的返回:当匹配空串时,返回空列表,和
Variable+分支的返回类型保持一致,方便后续处理。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

