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

使用pyPEG2实现命题逻辑解析器遇SyntaxError问题求助

pyPEG2命题逻辑解析器语法错误修复方案

问题根源

你遇到的SyntaxError: expecting Keyword('and(')错误,本质是pyPEG2语法规则定义中前向引用未正确处理:当Predicate和AndFormula直接引用尚未完整定义的Formula类时,解析器无法识别递归语法结构,导致带括号的复合表达式(如and(a,b))匹配失败。

解决方案

pyPEG2支持用字符串形式的类名做前向引用,以此规避未定义类的依赖问题。同时调整语法规则顺序,确保复杂结构优先匹配。以下是修正后的完整代码:

from pypeg2 import *

# 原子谓词(如x、P)
class Predicate(str):
    grammar = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*")

# 否定表达式(not ...)
class Negation:
    grammar = Keyword("not"), "(", "Formula", ")"
    def __init__(self, expr):
        self.expr = expr

# 合取表达式(and(...))
class AndFormula:
    grammar = Keyword("and"), "(", csl("Formula"), ")"
    def __init__(self, args):
        self.args = args

# 顶层表达式类型,包含所有合法表达式
class Formula:
    grammar = [Negation, AndFormula, Predicate]

# 测试用例
if __name__ == "__main__":
    # 单变量解析
    print(parse("x", Formula))  # 输出: x
    
    # 合取表达式解析
    result = parse("and(a,b)", Formula)
    print(result)  # 输出: AndFormula(args=['a', 'b'])
    
    # 复杂嵌套表达式解析
    complex_result = parse("and(P(),not P())", Formula)
    print(complex_result)  # 输出: AndFormula(args=['P', Negation(expr='P')])

关键修改说明

  1. 前向引用处理:在Negation和AndFormula的grammar定义中,用字符串"Formula"代替直接引用Formula类。pyPEG2会在解析阶段自动解析该字符串对应的类,解决未定义类的依赖问题。
  2. 语法匹配顺序:Formula的grammar列表中,将Negation、AndFormula这类复杂结构放在Predicate前面,确保解析器优先匹配复合表达式,避免原子谓词提前截断匹配。
  3. 类初始化方法:为Negation和AndFormula添加__init__方法,方便后续将解析结果转换为你需要的And(Predicate(P),Negation(Predicate(P)))形式(可根据需求进一步扩展初始化逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:09:58