33 lines
928 B
Python
33 lines
928 B
Python
from pyparsing import infixNotation, opAssoc, Keyword, Word, alphas, ParserElement
|
|
|
|
# 启用忽略大小写的关键字
|
|
ParserElement.enablePackrat()
|
|
|
|
# 定义基础元素
|
|
variable = Word(alphas)
|
|
predicate = variable + '(' + variable + ',' + variable + ')'
|
|
|
|
# 定义逻辑运算符
|
|
and_ = Keyword("And")
|
|
or_ = Keyword("Or")
|
|
not_ = Keyword("Not")
|
|
|
|
# 由于你的表达式使用 "&" 和 "|"
|
|
and_sym = Word("&", exact=1)
|
|
or_sym = Word("|", exact=1)
|
|
|
|
# 定义逻辑表达式的语法
|
|
expr = infixNotation(predicate,
|
|
[
|
|
(not_, 1, opAssoc.RIGHT),
|
|
(and_sym, 2, opAssoc.LEFT, and_),
|
|
(or_sym, 2, opAssoc.LEFT, or_),
|
|
])
|
|
|
|
# 解析示例表达式
|
|
goal = "Not(On(Yogurt,Table1)) & (On(Coffee,Table1) | On(ADMilk,Table1)) & At(Robot,Bar)"
|
|
parsed_expr = expr.parseString(goal)
|
|
|
|
# 打印解析结果
|
|
print(parsed_expr.asList())
|