2016-11-09 7 views
1

私は次のエラーを取得しています:シフト/ Javaのカップでの競合を削減

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に遭遇した後、次のトークンを譲渡またはから終了するレベルの数を開始することができることです。

この問題を解決する方法はありますか?

ありがとうございます!

答えて

2

実際に、ある言語で別の文を開始する可能性のある文で任意に終了することができ、その言語で明示的に句読点を使用する必要がない場合、限定先読みパーサーで解析することはできません。

この非常に単純なケースでは、あなたの言語をLR(3)パーサーで解析することができます。これはLR(1)文法が存在することを意味します。しかし、言語に構文を追加すると、必要なルックアヘッドが増加し始め、無制限になることさえあります。たとえば、配列を実装し、添字を任意の式にすることができます。

言語があいまいでない限り、GLRパーサーで解析することはできます。残念ながら、CUPはこのオプションを提供しておらず、bisonのJavaフレームワークがそれを許可しているかどうかはわかりません。

全体として、最も簡単な解決策は、ステートメントの区切り文字/ターミネーター(Javaでは;など)を使用するか、オプションの末尾の構文を削除して開始文と混同する可能性があります。あなたはexit ($x)exit $xを変更し、文はで始めることはできません場合たとえば、あなたはパースの競合を持っていません。

+0

文の区切りを追加私の問題を解決しました。ありがとう! – berendeanicolae

関連する問題