系統有一個符號,需要編寫一個像(A+B)*C
這樣的表達式作爲#MUL(#ADD(A,B),C)
。是否已有一種算法來執行這種符號轉換,以便用戶可以以更常規的方式輸入? 換句話說,一個算法從中綴轉換 - >我的符號。第一個問題是我不知道我的記譜法的確切名稱......它與逆波蘭相似,但不完全相同。每個運算符都被編碼爲一個帶參數的函數。這種符號轉換/轉換是否存在現有算法?
回答
Shunting-yard algorithm可用於解析中綴表示法。
在10秒內擊敗我。 – Randy 2010-06-16 15:42:25
+1。我遇到過SY,但它不是完全相同的輸出記號,所以我想知道另一個算法是否更接近匹配。這是對現有算法的微小修改嗎? – 2010-06-16 16:03:17
調車場可以輸出抽象語法樹。有了AST,你可以通過預訂來獲得波蘭語。 – 2010-06-16 16:18:36
這裏是一些Lisp that attempts the infix -> prefix transformation。它可以作爲一個有用的起點。
使用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 + ")";
}
一切都很好,但我想把它放在我的代碼中,即使它可用,我也不想爲一件事添加整個庫依賴項。 – 2010-06-16 16:04:44
Lex和Yacc只需要我認爲的標準C庫。我在我的應用程序中使用它來解析相當複雜的文件,並且運行Lex和Yacc是我構建過程的一部分。就你而言,你可以嘗試在本地運行Lex和Yacc,並在你的項目中使用生成的.H和.C文件。畢竟,Lex和Yacc只是處理您的語言描述並生成相當標準的.H和.C文件。這對我認爲不應該是你的問題 – Patrick 2010-06-16 16:52:18
- 1. python是否有轉換運算符?
- 2. 將這兩種方法轉換爲負值是否有區別?
- 3. 這是否符合轉換條件?
- 4. 有沒有辦法將這種字符串轉換爲日期?
- 5. 將codeSnippet轉換爲Resharper模板。是否有這種工具?I
- 6. 符號 - 無符號轉換
- 7. 將符號從一種位置轉換爲另一種符號
- 8. std :: vector是否有轉換運算符?我在看什麼?
- 9. 轉換int轉換爲符號
- 10. 轉換之前檢查字符串是否有貨幣符號
- 11. 轉換運算符
- 12. Java是否有轉換器?
- 13. 轉換算法,C#
- 14. 用static_cast實現的轉換運算符
- 15. 具有建立者類型轉換和轉換運算符的轉換序列
- 16. 在轉換之前是否有干預方式來轉換值?
- 17. 是否存在SVG'彎曲'轉換
- 18. 轉換std_logic_vector,同時保持精度和轉換爲有符號
- 19. 閃存庫符號到Flex轉換器
- 20. Java語法 - 轉換後的額外加號是否有效?
- 21. Xaml轉換保持現有轉換不受影響轉換
- 22. 無法隱式轉換類型雙爲int,顯式轉換存在(是否缺少強制轉換?)
- 23. 這個Unicode NFC轉換是否正確?
- 24. 這個類型轉換是否正確?
- 25. 這些endian轉換是否正確?
- 26. 打字稿是否將一元否定運算符轉換爲?
- 27. 有沒有辦法在MySQL中將這些符號轉換爲純文本?
- 28. CSS轉換:如何產生這種效果(鏈接轉換)
- 29. 轉換運算符快還是不快?
- 30. ( - )符號用於轉換方法
我認爲它被稱爲「前綴表示法」,因爲操作符在操作數列表的開頭,而不是在中間(中綴)。 – FrustratedWithFormsDesigner 2010-06-16 15:37:12
這是波蘭語,以JanŁukasiewicz命名。它類似於反向波蘭符號,只是...反向;) – 2010-06-16 15:38:39
它被稱爲兩者。 – 2010-06-16 15:41:26