You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SLY无法生成空产生式规则:解析器实现报错求助

问题解决思路与修正代码

核心问题分析

出现这两个警告的原因有两个:

  1. SLY不允许拆分定义同一个非终结符:你把Statement拆成了两个@_装饰器的函数,后面的@_('epsilon')会覆盖前面的@_('Variables'),导致Variables分支的Statement完全不可达;同时单独定义的epsilon符号因为被覆盖后的Statement没正确关联,被标记为不可达。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:45:30