2016-11-09 6 views
1

에서 충돌을 감소 :시프트/I는 다음과 같은 오류를 받고 있어요 자바 컵

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 (1) 문법이 있음을 의미하는 LR (3) 파서로 언어를 구문 분석 할 수 있습니다 (읽을 수는 없지만). 그러나 언어에 구문을 추가 할 때 필요한 미리보기가 증가하기 시작하고 제한되지 않게됩니다. 예를 들어 배열을 구현하고 첨자가 임의의 표현식을 허용하는 경우 발생합니다.

언어가 실제로 모호하지 않으면 GLR 파서로 구문 분석 할 수 있습니다. 불행히도, CUP는이 옵션을 제공하지 않으며 bison의 Java 프레임 워크에서 허용한다는 것을 확신하지 못합니다.

전체적으로 문장 구분 기호/종결 자 (예 : Java의 경우 ;)를 사용하거나 선택 사항 인 후행 구문을 제거하여 명령문 시작과 혼동 될 수 있습니다. 당신이 exit ($x)-exit $x을 변경하고 허용하지 않는 경우 예를 들어, 문은 다음 파싱 충돌이되지 않습니다 (로 시작합니다.

+0

추가 문 분리기 내 문제를 해결했다. 감사합니다! – berendeanicolae