使用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')])
关键修改说明
- 前向引用处理:在
Negation和AndFormula的grammar定义中,用字符串"Formula"代替直接引用Formula类。pyPEG2会在解析阶段自动解析该字符串对应的类,解决未定义类的依赖问题。 - 语法匹配顺序:
Formula的grammar列表中,将Negation、AndFormula这类复杂结构放在Predicate前面,确保解析器优先匹配复合表达式,避免原子谓词提前截断匹配。 - 类初始化方法:为
Negation和AndFormula添加__init__方法,方便后续将解析结果转换为你需要的And(Predicate(P),Negation(Predicate(P)))形式(可根据需求进一步扩展初始化逻辑)。
内容的提问来源于stack exchange,提问作者bahab
相关产品推荐
相关产品推荐

