意图:
解析支持对数和指数的算术表达式。以下任何表达式均有效;
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 在浏览了它的文档和我的日常使用后对空格不敏感。我已经尝试使用所有可能的更改进行调试。他们都没有解决这个问题。感谢您的宝贵建议。:)
问题在于您使用 Combine
,它将所有令牌压缩为一个令牌。在 pyparing 中忽略标记之间的空格,但标记中的空格不会。
若要解决此问题,请删除Combine
,然后将结果传递给''.join
以将其重新放入一个字符串中。