2010-06-16 20 views
4

系統有一個符號,需要編寫一個像(A+B)*C這樣的表達式作爲#MUL(#ADD(A,B),C)。是否已有一種算法來執行這種符號轉換,以便用戶可以以更常規的方式輸入? 換句話說,一個算法從中綴轉換 - >我的符號。第一個問題是我不知道我的記譜法的確切名稱......它與逆波蘭相似,但不完全相同。每個運算符都被編碼爲一個帶參數的函數。這種符號轉換/轉換是否存在現有算法?

+2

我認爲它被稱爲「前綴表示法」,因爲操作符在操作數列表的開頭,而不是在中間(中綴)。 – FrustratedWithFormsDesigner 2010-06-16 15:37:12

+3

這是波蘭語,以JanŁukasiewicz命名。它類似於反向波蘭符號,只是...反向;) – 2010-06-16 15:38:39

+2

它被稱爲兩者。 – 2010-06-16 15:41:26

回答

9

Shunting-yard algorithm可用於解析中綴表示法。

+0

在10秒內擊敗我。 – Randy 2010-06-16 15:42:25

+0

+1。我遇到過SY,但它不是完全相同的輸出記號,所以我想知道另一個算法是否更接近匹配。這是對現有算法的微小修改嗎? – 2010-06-16 16:03:17

+1

調車場可以輸出抽象語法樹。有了AST,你可以通過預訂來獲得波蘭語。 – 2010-06-16 16:18:36

0

使用Lex和Yacc(Flex和Bison,它們是相同的)很容易解析這些簡單的表達式。谷歌爲「Yacc計算器」。

我發現的一個例子是http://www.indiastudychannel.com/resources/56696-IMPLEMENTATION-OF-CALCULATOR-USING-YACC.aspx,但不是計算結果,而是應該建立最終的字符串。例如,像這樣(僞代碼):

expr: ‘(‘expr’)’ 
{ 
$$=$2; 
} 
| 
expr ‘*’expr 
{ 
$$="#MUL(" + S1 + "," + $3 + ")"; 
} 
| 
expr’/’expr 
{ 
$$="#DIV(" + S1 + "," + $3 + ")"; 
} 
+0

一切都很好,但我想把它放在我的代碼中,即使它可用,我也不想爲一件事添加整個庫依賴項。 – 2010-06-16 16:04:44

+0

Lex和Yacc只需要我認爲的標準C庫。我在我的應用程序中使用它來解析相當複雜的文件,並且運行Lex和Yacc是我構建過程的一部分。就你而言,你可以嘗試在本地運行Lex和Yacc,並在你的項目中使用生成的.H和.C文件。畢竟,Lex和Yacc只是處理您的語言描述並生成相當標準的.H和.C文件。這對我認爲不應該是你的問題 – Patrick 2010-06-16 16:52:18