我在尝试使用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]]
它能够工作,但不是很好。我希望能按照组
的优先级和排序方式进行排序,但是经过多次尝试,我无法找到方法来实现。大致上就像这样:
[[[[9, '-', 1], '+', 27], '+', [3, '-', 5]], '+', 9]
我希望保持AST的样子,我想从中生成代码。
我确实看到了
operatorPrecedence
类?类似于Forward
,但我不认为我理解它的工作原理。编辑:
更深入地尝试了
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)
])
我需要处理括号,因为当前程序不能处理括号(我不确定是否需要对结果进行后处理)。
operatorPrecedence
处理 () 内部,测试一下就知道了。 - PaulMcG