3

目的:

対数と指数をサポートする算術式を解析します。次の式はどれも有効です。

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

4

1 に答える 1

3

問題は、Combineすべてのトークンを 1 つのトークンにまとめる の使用にあります。pyparsing ではトークン間の空白は無視されますが、トークン内の空白は無視されません。

これを修正するには、 を取り除きCombine、結果を に渡し''.joinて 1 つの文字列に戻します。

于 2012-11-19T05:58:55.393 に答える