我正在尝试使用 pyparsing 来解析数学表达式。我知道我可以从 pyparsing 网站复制示例计算器,但我想理解它,以便稍后添加。我来这里是因为我试图理解这个例子,但我做不到,所以我尽力了,我得到了这个:
symbol = (
pp.Literal("^") |
pp.Literal("*") |
pp.Literal("/") |
pp.Literal("+") |
pp.Literal("-")
)
operation = pp.Forward()
atom = pp.Group(
pp.Literal("(").suppress() + operation + pp.Literal(")").suppress()
) | number
operation << (pp.Group(number + symbol + number + pp.ZeroOrMore(symbol + atom)) | atom)
expression = pp.OneOrMore(operation)
print(expression.parseString("9-1+27+(3-5)+9"))
打印:
[[9, '-', 1, '+', 27, '+', [[3, '-', 5]], '+', 9]]
它有效,有点。我想要优先级并且全部排序Groups
,但经过多次尝试后,我找不到办法。或多或少像这样:
[[[[9, '-', 1], '+', 27], '+', [3, '-', 5]], '+', 9]
我想保持它的 AST 外观,我想从中生成代码。
我确实看到了operatorPrecedence
班级?如同Forward
,但我认为我也不明白它是如何工作的。
EDIT:
尝试更深入operatorPrecedence
我得到了这个:
expression = pp.operatorPrecedence(number, [
(pp.Literal("^"), 1, pp.opAssoc.RIGHT),
(pp.Literal("*"), 2, pp.opAssoc.LEFT),
(pp.Literal("/"), 2, pp.opAssoc.LEFT),
(pp.Literal("+"), 2, pp.opAssoc.LEFT),
(pp.Literal("-"), 2, pp.opAssoc.LEFT)
])
它不处理括号(我不知道是否需要对结果进行后处理),我需要处理它们。