目的:
対数と指数をサポートする算術式を解析します。次の式はどれも有効です。
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 は、ドキュメントと日常の使用を経て、空白を区別しないと思います。可能なすべての変更でデバッグを試みました。それらのどれも問題を解決しませんでした。貴重なご意見ありがとうございます。:)