0

내 컴파일러 클래스에 대한 파서 프로젝트가 있습니다. 내가 규칙 중 하나에 대한 감소/감소 충돌을 해결할 수 없습니다.Bison/Yacc 특정 문법 예제의 충돌 감소 감소

이 문법 규칙의 그래픽 표현은 (미안 해요 여기에 이미지를 게시 할 수 없습니다 때문에 정책에 유래하는)이 링크에서 볼 수 있습니다 : 모든 타원 터미널 상징

Graphical representation of the "type" grammar rule

.

이 규칙은 약간 복잡해 보였으므로 좀 더 작은 부분으로 나누려고했습니다. 예를 들어,

type : id_or_int brackets_or_end 
     ; 
id_or_int : IDnum 
     | INTnum 
     ; 
brackets_or_end : brackets remainingpartboe 
     | 
     ; 
brackets : LBRACnum RBRACnum brackets 
     | 
     ; 
remainingpartboe: DOTnum  type 
     | 
     ; 

주 단자 접미사 NUM로 끝나는 단어 : 다음은 문법을 구성하는 나의 시도 DOTnum. 나머지는 비 터미널입니다.

들소는 다음과 충돌에게 들소 오류가 위의 brackets_or_end 규칙의 두 번째 대안 생산에 언급되어

mj-parser.y: conflicts: 1 reduce/reduce 
mj-parser.y:122.18: warning: rule useless in parser due to conflicts: 
brackets_or_end: /* empty */ 

주를보고하고있다.

문법을 작성하는 다른 방법을 제안하여이 충돌을 해결하는 데 도움을주십시오. 그건 그렇고, 나는 바이슨의 자세한 출력물을 살펴 봤지만 많은 도움이되지는 않았다.

감사 -sas

+3

동일한 프로덕션 트리에서 비어있을 수있는 두 개의 비 터미널이 있음에 유의하십시오. 따라서 빈 문자열은 대괄호 또는 대괄호 또는 대괄호로 줄일 수 있습니다. 이것은 작동하지 않습니다. –

+0

당신은 절대적으로 밥입니다. 힌트를 주셔서 감사합니다 : 괄호는 엡실론 감소가 없어야합니다. 이렇게하면 축소 감소 충돌이 제거됩니다. – user3416142

답변

0

(.. 질문이 코멘트에 대답 커뮤니티 위키 답변에 변환 Question with no answers, but issue solved in the comments (or extended in chat) 참조)

@BobDalgleish 작성 : 두 비끝이

공지 사항이 있습니다 같은 생산 나무에서 비어있어 라. 따라서 빈 문자열은 대괄호 또는 대괄호 또는 대괄호로 줄일 수 있습니다. 이것은 작동하지 않습니다.

는 영업 이익이 쓴 :

당신은 밥을 전적으로 옳습니다. 힌트를 주셔서 감사합니다 : 괄호는 엡실론 감소가 없어야합니다. 이렇게하면 축소 감소 충돌이 제거됩니다.