簡體   English   中英

Java Cup中的Shift / Reduce沖突

[英]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 $xexit ($x)和不允許的語句開始與那你會不會有沖突解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM