2013-07-12 52 views
0

我一直在與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()」)),以便它保留在任一選項中匹配的運算符,將允許我區分加法和減法,只用一種節點類型來表示每種節點類型。

回答

1

修正了它!這個問題是不是在我的附加項畢竟,但是在我的一元規則:

(
    <OPAR> Expr() <CPAR> 
| 
    ((t=<PLUS> 
    | t=<MINUS>) Expr()) #Unary 
| 
    Integer() 
| 
    Float() 
| 
    Double() 
) 
{ if(t != null) jjtThis.setName(t.image); } 

(表達式()所造成的第二個選擇的遞歸 - > AddTerm() - > MulTerm() - >一元() - > Expr())在警告之後。我解決了這個由第二選擇移動到一個單獨的生產規則,只遞歸回一元:

void PrimaryExpr() #PrimaryExpr(>1) : 
{ Token t=null; } 
{ 
    t=<PLUS> 
    Unary() 
    {if(t != null) jjtThis.setName(t.image);} 
| 
    t=<MINUS> 
    Unary() 
    {if(t != null) jjtThis.setName(t.image);} 
} 
+0

只是一個小建議:接通一元和PrimaryExpr名稱。另請注意,使用固定語法-a/b將解析爲(-a)/ b而不是 - (a/b)。這在編程語言中很常見,但並不總是用戶期望的。 –