Pyparsing:语法无法在使用指数函数和对数函数解析算术表达式时解析空格

时间:2012-11-19 05:39:35

标签: python pyparsing

意图:

解析支持对数和指数的算术表达式。以下任何表达式都有效;

x + y
exp(x) + y
exp(x+y)
exp(log(x)+exp(z))+exp(y)
x+log(exp(y))
x + 2

源代码:

import pyparsing as pp
arith_expr = pp.Forward()
op = pp.oneOf("^ / * % + -")
exp_funcs = pp.Regex(r"(log|exp)(2|10|e)?")
operand = pp.Word(pp.alphas, pp.alphanums + "_") | pp.Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?")
func_atom = operand ^ (pp.Optional(exp_funcs) + "(" + arith_expr + ")")

comp_expr = pp.Combine(func_atom + pp.ZeroOrMore(op + func_atom))

arith_expr << comp_expr
print arith_expr.parseString("exp(datasize+ 2) +3")

观察

语法能够解析每个这样的算术表达式,但遗憾的是,当操作数或运算符周围出现空白时,它无法解析。语法无法解析以下表达式;

exp(x+ 2)
exp( x + 2 )
x + 2

我尝试使用setDebug()调试语法,并在每次失败时发现以下错误;

Expected ")"

我认为Pyparsing在通过它的文档和我的日常使用后是空白不敏感的。我已尽力调试我可以做的每一个可能的改变。他们都没有解决这个问题。我感谢您的宝贵建议。 :)

1 个答案:

答案 0 :(得分:3)

问题在于您使用Combine,它将所有令牌压缩成一个令牌。在pyparsing中忽略了令牌之间的空格,但令牌中的空格不是。

要解决此问题,请删除Combine,然后将结果传递给''.join,将其恢复为一个字符串。