0

나는 충돌을 감소 나에게 세 가지 변화를주고 다음과 같은 문법이 있습니다시프트 중순 규칙 작업에서 충돌을 감소 들소

boolexpression:   boolexpression OR boolterm 
         | boolterm ; 

boolterm:    boolterm AND boolfact 
         | boolfact; 

boolfact:    "!" "(" boolexpression ")" 
         | "(" boolexpression ")" 
         | BOOLLITERAL 
         | expression boolop expression 

boolop:     "<"| ">"| BOOLOPLEQ /* <= */ | BOOLOPGEQ /* >= */ | BOOLOPEQ /* == */ | BOOLOPNEQ /* != */; 

expression:    sum ; 

sum:     sum "+" term   
         | sum "-" term  
         | term ; 

term:     term "*" factor 
         | term "/" factor 
         | factor; 

factor:     ID   
         | NUMBER  
         | "(" {/* rules to generate IR/*} expression ")"; 

내가 {/* rules to generate IR/*}을 제거하면 모든 것이 잘 작동합니다.

+0

게시 한 문법에는 충돌이 없으므로 충돌하는 부분은 게시물에서 버린 문법의 다른 부분에서 비롯된 것입니다. –

답변

0

factor 규칙에서 "(" 다음에 중간에 규칙 동작이 있으므로이 충돌이 발생합니다. 이 경우 감축 boolfact --> "(" boolexpression ")"factor --> "(" {/* rules to generate IR/*} expression ")" 모두 첫 번째 토큰이 인식 될 때 "(" 토큰이 포함되어 있기 때문에이 작업을 수행 할 수 없습니다. 따라서 들소가 "("을 인식 할 때 어떤 규칙을 줄여야할지 모릅니다.

이후에 "(" {/ rules to generate IR/*} expression ")";{/* rules to generate IR/}을 약간 둡니다. https://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Conflicts.html#Mid_002dRule-Conflicts에는 유용한 정보가 있습니다.