我一直在與JavaCC合作,爲我在Java中編寫的一類「圖片腳本」程序編寫語法分析器語法。該程序需要一系列腳本化命令,這些命令大部分直接映射到java.awt.Graphics方法調用,直接處理它們,並將圖像輸出到文件。我正在使用JavaCC爲此構建解析器,因爲我想開始添加更復雜的構造(如循環或函數)。
現在,我使用JJTree將輸入建立爲AST。無論如何,我收到來自JavaCC的警告(JJTree與.jjt文件無關):
警告:在第320行第9列的(...)*構造中的選擇衝突。嵌套在構造和擴展之後的擴展構造具有共同前綴,其中之一是「+」
考慮使用2或更多的前瞻來進行嵌套擴展。
由於源語法是「PicParse.jjt」,我認爲這是從該文件有問題的結構:JavaCC:星級擴展中的選擇衝突
(
MulTerm()
(//line 320 in the file, column 9 starts at open parens
"+"
MulTerm()
{jjtThis.setName("+");}
|
"-"
MulTerm()
{jjtThis.setName("-");}
)*
)#Plus(>1)
最後,雖然我沒有遇到this,更換星運算符(「* ')與問號運算符('?')沒有任何操作去除警告。最終,我想要的是能夠使用此生產規則(MulTerm()規則與此規則相同(「AddTerm()」)),以便它保留在任一選項中匹配的運算符,將允許我區分加法和減法,只用一種節點類型來表示每種節點類型。
只是一個小建議:接通一元和PrimaryExpr名稱。另請注意,使用固定語法-a/b將解析爲(-a)/ b而不是 - (a/b)。這在編程語言中很常見,但並不總是用戶期望的。 –