2016-11-09 56 views
1

,我發現了以下錯誤:移進/歸約衝突在Java這杯

Warning : *** Shift/Reduce conflict found in state #2 
    between ExitLoopStatement ::= EXITLOOP (*) 
    and  VarAccess ::= (*) DOLLAR IDENTIFIER 
    under symbol DOLLAR 

這是我使用的語法。目前我有任務和中斷(每個中斷語句可以指定要退出的循環級別的數量)。

start with StatementList; 

StatementList 
    ::= Statement 
    | 
     StatementList Statement 
    ; 

Statement 
    ::= AssignmentStatement 
    | 
     ExitLoopStatement 
    ; 

AssignmentStatement 
    ::= VarAccess EQ_OP VarAccess 
    ; 

VarAccess 
    ::= DOLLAR IDENTIFIER 
    ; 

ExitLoopStatement 
    ::= EXITLOOP 
    | 
     EXITLOOP VarAccess 
    ; 

從我的理解,問題是,我遇到EXITLOOP之後,下一個標記可以是一個分配的開始或級別可供出口的數量。

有什麼辦法可以解決這個問題嗎?

謝謝!

回答

2

實際上,如果你的語言允許任意結束一些東西,可能會開始另一份聲明中,語言並不需要語句之間明確的標點符號聲明,那麼你將無法用有限的前瞻解析器解析它。

在這種極其簡單的情況下,可以解析與LR(3)語法分析器,它意味着一個LR(1)語法存在(雖然它不會是非常可讀的)語言。但是,當您爲該語言添加更多語法時,您可能會發現所需的預覽開始增加,甚至變得無限。 (例如,如果實現數組並允許下標爲任意表達式,則會發生這種情況。)

只要語言實際上並不明確,您仍然可以使用GLR解析器解析它。不幸的是,銀聯不提供這個選項,我不確定野牛的Java框架是否允許。總體而言,最簡單的解決方案是堅持使用語句分隔符/結束符(如;),或者刪除可能與語句開頭混淆的可選尾部語法。例如,如果你改變exit $xexit ($x),並且不允許語句開始,那麼你將不會有衝突解析。

+0

添加語句分隔解決我的問題,謝謝! – berendeanicolae