2013-10-10 45 views
0

假設我有這個字符串解析:ABAA和下一個語法:如何避免JavaCC中的錯誤選擇衝突警告?

public void parse_X() : 
{} 
{ 
    ( 
    LOOKAHEAD(parse_AA()) 
    parse_AA() 
    | 
    parse_AB() 
    )* 
} 

public void parse_AA() : 
{} 
{ <A> <A> } 

public void parse_AB() : 
{} 
{ <A> <B> } 

很清楚,沒有歧義,也沒有選擇的衝突,但我得到一個警告,聲稱有一個選擇衝突我的猜測是JavaCC不記得LOOKAHEAD(parse_AA())失敗,因此parse_AA()無法遵循。

已滿警告消息:

警告:在選擇衝突(...)*構建在第4行 擴展嵌套在構建和擴展以下構建 有共同的前綴,其中一個是:「 A「 考慮將嵌套擴展的前瞻使用爲2或更多。解析器生成0錯誤和1個警告。

如何避免此警告? 有其他語法嗎? (除因式分解共同< A>)

回答

0

請嘗試以下

public void parse_X() : 
{} 
{ 
    (( 
    LOOKAHEAD(parse_AA()) 
    parse_AA() 
    | 
    parse_AB() 
    ))* 
} 

如果不工作,問題是,有一些遵循可與<A>啓動X。


編輯。

由於沒有工作,請嘗試以下操作:

public void parse_X() : 
{} 
{ 
    (LOOKAHEAD(<A>) 
    ( 
    LOOKAHEAD(parse_AA()) 
    parse_AA() 
    | 
    parse_AB() 
    ) 
)* 
} 

注意,這一切都將要做的就是抑制警告。你必須決定如何最好地處理語法中的歧義。