[英]Shift/Reduce conflict in Java Cup
我收到以下錯誤:
Warning : *** Shift/Reduce conflict found in state #2
between ExitLoopStatement ::= EXITLOOP (*)
and VarAccess ::= (*) DOLLAR IDENTIFIER
under symbol DOLLAR
這是我使用的語法。 當前,我有分配和中斷(每個break語句可以指定要退出的循環級別數)。
start with StatementList;
StatementList
::= Statement
|
StatementList Statement
;
Statement
::= AssignmentStatement
|
ExitLoopStatement
;
AssignmentStatement
::= VarAccess EQ_OP VarAccess
;
VarAccess
::= DOLLAR IDENTIFIER
;
ExitLoopStatement
::= EXITLOOP
|
EXITLOOP VarAccess
;
據我了解,問題在於遇到EXITLOOP后,下一個標記可能是分配的開始或要退出的級別數。
有什么辦法解決這個問題?
謝謝!
實際上,如果您的語言允許某個語句以可選的結尾(可能以另一條語句開頭),並且該語言不需要在語句之間使用明確的標點符號,那么您將無法使用有限的超前解析器來解析該語句。
在這種極其簡單的情況下,您可以使用LR(3)解析器解析語言,這意味着存在LR(1)語法(盡管它不太可讀)。 但是,隨着向該語言添加更多語法,您可能會發現所需的超前開始開始增加,甚至變得無限。 (例如,如果您實現數組並允許下標為任意表達式,則會發生這種情況。)
只要該語言實際上不是模棱兩可,您仍然可以使用GLR解析器對其進行解析。 不幸的是,CUP不提供此選項,而且我不確定bison的Java框架是否也允許它。
總體而言,最簡單的解決方案是堅持使用語句分隔符/終止符(如Java中的; )或刪除可能與語句開頭混淆的可選尾隨語法。 例如,如果你改變exit $x
以exit ($x)
和不允許的語句開始與(那你會不會有沖突解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.