2013-11-27 5 views
2

이 문제를 해결하고 향후이 SHIFT/REDUCE CONFLICTS를 처리하는 방법에 대한 설명이 필요합니다.SHIFT/REDUCE 충돌 해결 방법 - 파서 생성기

컵 파일의 몇 가지 상태가 서로 충돌합니다.

문법은 다음과 같이 :

내가 사이에 충돌이 "("[ActPars] ")"상태.

1. Statement = Designator ("=" Expr | "++" | "‐‐" | "(" [ActPars] ")") ";" 

2. Factor = number | charConst | Designator [ "(" [ActPars] ")" ]. 

I 컵 파일의 전체 700 선을 붙여 넣을하지 않습니다. 관련 상태와 오류 출력을 알려 드리겠습니다.

이것은 라인 1)

Matched ::= Designator LPAREN ActParamsList RPAREN SEMI_COMMA 

ActParamsList ::= ActPars 
       | 
       /* EPS */ 
       ; 

ActPars ::= Expr 
     | 
     Expr ActPComma 
     ; 

ActPComma ::= COMMA ActPars;  

이것은 라인 (2))을위한위한 코드 인

Factor ::= Designator ActParamsOptional ; 


ActParamsOptional ::= LPAREN ActParamsList2 RPAREN 
       | 
       /* EPS */ 
       ; 

ActParamsList2 ::= ActPars 
       | 
       /* EPS */ 
       ; 

Expr ::= SUBSTRACT Term RepOptionalExpression 
     | 
     Term RepOptionalExpression 
     ; 

오류 출력은 다음과 같다 :

Warning : *** Shift/Reduce conflict found in state #182 
between ActParamsOptional ::= LPAREN ActParamsList RPAREN (*) 
and  Matched ::= Designator LPAREN ActParamsList RPAREN (*) SEMI_COMMA 
under symbol SEMI_COMMA 
Resolved in favor of shifting. 

오류 : * 더 많은 충돌이 있습니다. 토큰

ActParamsOptional 

SEMI_COMMA 

또는 감소 - 예상보다 반박 파서 생성 내가 문제가 토큰으로 이동해야합니다 경우 파서 모를 것입니다 생각

+0

I 생이기 때문에 nk'ActParamsList2'는 불균형 괄호를 가지고 있습니다. 확장 된'ActParamsOptional'에 대한 예제는'(Expr))'처럼 보일 것입니다. – tehlexx

+0

네 말이 맞아 - 나는 그것을 바꿨다 - 그건 실수였다. 나는 새로운 변화 감소가 나타나면서 그것을 변경하고 오류 출력을 업데이트했다. –

답변

1

를 중단

ActParamsOptionalMatched 모두에 정의 된 토큰은

LPAREN ActPars RPAREN 
+0

그리고 해결책은 더 많은 미리보기를 제공하거나 문법을 모호하지 않은 것으로 바꾸는 것입니다. 예를 들어 괄호를 토큰 중 하나에 대괄호로 바꿉니다. – sdasdadas

+0

답장을 보내 주셔서 감사합니다 - 다른 방법이 있습니까?이 구문을 유지해야합니다. "("[ActPars] ")"- 부모 게시물을 보관해야합니다. "- 내 게시물의 시작 부분에서 어떻게 보이는지 알아볼 수 있습니다 (줄 1과 2). 그리고 우리가 그것을 사용하지 말라고했기 때문에 나는 우선 순위 키워드를 사용할 수 없다 :-( –

+0

@MilanBojovic 나는 그것을 통과하고 문법을 보려고했지만 나는 여전히 조금있다. 이러한 항목이 무엇을 나타내는 지 혼란스러워합니다. 언어가 어떻게 보이는지 보여줄 수있는 몇 줄의 예제를 제공 할 수 있습니까? – sdasdadas