2011-06-03 88 views
0

我想創建一個類似於S表達式語法的解析類似公式語言的玩具的語法。類似Excel的玩具公式解析

我通過「PyParsing入門」一書進行了閱讀,其中包含了一個很好的章節,涵蓋了類似的語法。數據解析的

兩個例子是:

sum(5,10,avg(15,20))+10 
stdev(5,10)*2 

現在,我已經拿出了排序的那個解析公式,但忽略 擴展功能和運算符優先級的語法。

什麼是繼續使用它的最佳做法:我應該添加parseActions 單詞與函數名稱(sum,avg ...)匹配。如果我構建一個嵌套的 列表,我可以深入地分析結果並評估函數嗎?

回答

3

如果沒有看到更多的代碼,建議有點難。不過,從您所描述的內容來看,這聽起來像是大多數標記,識別標點符號的各種位,並從代數運算符的數字常量中區分變量名。 nestedExpr將賦予一些結構,但只有基本的括號嵌套 - 這仍然會爲您的解析後工作留下運算符優先級處理。

如果您正在學習解析中綴表示法,可以通過一系列pyparsing示例來查看和研究(在pyparsing wiki Examples page)。從fourFn.py開始,這實際上是一個函數中綴表示法解析器。查看其BNF()方法,並理解遞歸定義是如何工作的(不必擔心pushFirst解析操作)。通過以這種方式構造解析器,運算符優先級被直接構建到解析結果中。如果你解析4 + 2 * 3,一個單純的tokenizer只會給你['4','+','2','*','3'],然後你必須弄清楚如何在添加4之前做2 * 3來獲得10,而不僅僅是蠻力加4和2,然後乘以3(這給出了18)的錯誤答案。在fourFn.py中的解析器會給你['4','+',['2','*','3']],這是足夠的結構,你可以知道在將它添加到4之前評估2 * 3部分。

這個解析中綴符號和操作優先級的整個概念非常常見,我寫了一個幫助功能,完成了大部分艱苦工作,稱爲operatorPrecedence。您可以在示例simpleArith.py中看到這是如何工作的,然後轉到eval_arith.py以查看需要創建解析結構的評估程序的擴展。 simpleBool.py是另一個很好的例子,顯示邏輯術語AND'ed和OR'ed的優先順序。

最後,由於您正在做類似Excel的事情,請看看excelExpr.py。它試圖處理在評估Excel單元格引用時得到的一些瘋狂的角落案例,包括對其他工作表和其他工作簿的引用。

祝你好運!

+0

'operatorPrecedence'在pyparsing的當前版本中被重命名爲'infixNotation' - 兩個名稱都可以兼容,但將來'operatorPrecedence'的某個點會被刪除。 – PaulMcG 2013-03-14 19:02:35