簡體   English   中英

Pyparsing:語法在使用指數和對數函數解析算術表達式時無法解析空格

[英]Pyparsing: Grammar cannot parse whitespace while parsing arithmetic expression with exponential and logarithm functions

意圖:

解析支持對數和指數的算術表達式。 以下任何表達式都是有效的;

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 ,它將所有令牌壓縮到一個令牌中。 pyparsing 中會忽略標記之間的空格,但不會忽略標記內的空格。

要解決此問題,請去掉Combine ,然后將結果傳遞給''.join以將其恢復為一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM