我正在嘗試制作一個運算式決議器,盡管它可以作業,但它是按時間順序而不是按 BIDMAS 進行計算的;1 2 * 3 4回傳15而不是11. 我重寫了決議器以使用遞回下降決議和我認為可行的正確語法,但它犯了同樣的錯誤。
到目前為止,我的語法是:
exp ::= term op exp | term
op ::= "/" | "*" | " " | "-"
term ::= number | (exp)
它也缺乏其他功能,但現在我不確定如何使除法先于乘法等。我應該如何修改我的語法以實作運算子優先級?
uj5u.com熱心網友回復:
嘗試這個:
exp ::= add
add ::= mul ((" " | "-") mul)*
mul ::= term (("*" | "/") term)*
term ::= number | "(" exp ")"
這里的()*意思是零次或多次。這種語法將產生右關聯樹,并且它是確定性和明確的。乘法和除法具有相同的優先級。加減也。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350659.html
上一篇:使用ANTLR4決議java檔案時,如何保存方法名稱和該方法內部呼叫的所有方法的名稱?
下一篇:使用bash-c逐行決議
