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

使用SLY构建解释器时Parser无法识别语法规则求助

SLY Parser无法匹配语法规则的排查方案

关键排查点

  • 规则方法命名规范
    SLY仅识别以_开头的方法作为语法规则,比如定义constant规则必须写成def _constant(self, p):,而非def constant(self, p):,这是最常见的错误点。
  • Token名称一致性
    确认Lexer中定义的Token名称(如NUMBER、STRING)与Parser规则中的引用完全一致,SLY对Token名称大小写敏感,拼写错误会导致规则无法匹配。
  • 调试模式定位问题
    初始化Parser时开启调试:parser = Parser(debug=True),运行后会输出Token流、规则匹配尝试过程及失败原因,能直接定位是Token未传入还是规则逻辑问题。
  • Lexer与Parser的衔接
    主程序中必须先通过Lexer生成Token序列,再传入Parser解析,示例代码:
    lexer = Lexer()
    parser = Parser()
    token_stream = lexer.tokenize(your_input_code)
    parse_result = parser.parse(token_stream)
    
    禁止直接将原始字符串传给Parser的parse方法。
  • 空规则干扰排查
    若Parser中存在空规则(如def _empty(self, p):),其优先级可能高于目标规则,导致优先匹配空规则。可暂时注释所有空规则,仅保留constant规则测试。
  • 优先级装饰器影响
    若设置了@precedence装饰器,可能打乱规则匹配顺序,可先移除该装饰器,测试基础规则是否正常工作。

示例修正

假设原constant规则写法错误,修正后:

# 正确的规则定义
def _constant(self, p):
    p[0] = Constant(p[1])

确保Lexer对应Token生成正确:

@_(r'\d+')
def NUMBER(self, t):
    t.value = int(t.value)
    return t

内容的提问来源于stack exchange,提问作者Ivan Lo Greco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:03