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

使用PLY编写SQL解析器时in子句规则匹配异常的解决咨询

解决PLY编写SQL解析器时IN规则匹配异常问题

核心原因

解析器优先匹配短规则predicate -> value_expression,本质是移进/归约冲突、IN关键字未正确识别,或value_expression的定义意外包含了a in这类序列导致提前归约。

具体解决方法

  • 确保IN被标记为保留关键字
    PLY不会自动识别SQL关键字,必须手动将IN加入保留词表,否则它会被当作普通标识符,导致value_expression错误匹配a in:

    reserved = {
        'IN': 'IN',
        # 补充其他SQL关键字如SELECT、FROM、WHERE等
    }
    
    tokens = list(reserved.values()) + [
        # 你的其他token定义,比如LPAREN、NUMBER、IDENTIFIER等
    ]
    
    def t_IDENTIFIER(t):
        r'[a-zA-Z_][a-zA-Z0-9_]*'
        # 优先匹配保留关键字
        t.type = reserved.get(t.value.upper(), 'IDENTIFIER')
        return t
    
  • 调整优先级解决移进/归约冲突
    当解析到a后遇到IN,PLY默认会选择移进,但如果value_expression规则能匹配单个标识符,可能出现归约优先的情况。手动给IN设置优先级,强制解析器优先移进:

    precedence = (
        ('left', 'IN'),
        # 可补充其他运算符的优先级规则,比如AND、OR等
    )
    
  • 检查并修正value_expression定义
    确保value_expression的规则不会匹配包含IN的序列,比如不要让它支持“标识符+标识符”的组合形式。示例正确规则:

    def p_value_expression(p):
        '''value_expression : IDENTIFIER
                            | NUMBER
                            | function_call'''
        p[0] = p[1]
    
  • 调试解析过程定位问题
    开启PLY的调试模式,查看解析栈的移进/归约步骤,明确异常发生的节点:

    parser = yacc.yacc(debug=True)
    

    运行解析后会输出详细过程,可直观看到是提前归约了value_expression,还是未正确识别IN。


内容的提问来源于stack exchange,提问作者tomato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:28:16