我正在創建最簡單的語法,它基本上可以識別算術運算式。語法需要正確遵循算術運算子優先規則 (PEMDAS),為此我expr ('*'|'/') term 之前放置expr (' '|'-') term以確保這種優先級。這是我擁有的 algorithm.g4 檔案:
/*Productions */
expr: expr ('*'|'/') term
| expr (' '|'-') term
| term
;
term: '('expr')'
| ID
| NUM
;
/*Tokens */
ID: [a-z] ;
NUM: [0-9] ;
WS: [\t\r\n] ->skip;
然而,語法的輸出并不是它應該的樣子。例如對于算術運算式4 * (3 10)我得到以下決議樹(這絕對不正確):

關于如何更改語法以獲得所需內容的任何建議。我是 antlr 的新手,不確定我犯了什么錯誤。(jbtw 我的作業系統是 windows)
uj5u.com熱心網友回復:
(我假設你在你的例子中犯了一個錯誤(看起來不錯)并且你真的意味著你得到了錯誤的輸入樹4 3 * 10,所以這就是我要回答的。如果那不是什么你的意思,請澄清。)
ANTLR 根據規則的順序解決歧義是對的,但這不適用于您的語法,因為您的語法沒有歧義。對于像 一樣的輸入4 3 * 10,只有一種方法可以根據您的語法決議它:*作為外部運算子,4 3作為其左10運算元和作為其右運算元。正確的方法( 作為具有3 * 10正確運算元的外部運算符)不適用于您的語法,因為3 * 10它無效term并且正確的運算元需要term根據您的語法是 a 。
為了獲得以您想要的方式解決的歧義,您需要制作運算子exprs 的兩個運算元。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370718.html
下一篇:多行到PHP關聯陣列
