2013-06-13 2 views
0

이 문법에서 shift/reduce 충돌을 일으키는 원인을 파악하지 못하는 것 같습니다. CMD와 LCURLY에 가장 오른쪽 연산자 우선 순위를 할당하는 것으로 수정 된 것 같지만 문제가 무엇인지 정확히 알지 못합니다. 어떤 도움이 필요합니까?이 문법에서 shift/reduce 충돌은 어디에서 발생합니까?

ContentList : Content 
      | Content ContentList 
; 

Content : CMD 
     | CMD LCURLY TEXT RCURLY 
     | LCURLY CMD WS TEXT RCURLY 
; 

답변

2

yacc의 -v 옵션을 사용하면 생성 된 문법에 대한 자세한 정보를 얻을 수 있습니다. 문제가 정확히 어디에을 보여줍니다

State 1 conflicts: 1 shift/reduce 
     : 
state 1 

    3 Content: CMD . 
    4  | CMD . LCURLY TEXT RCURLY 

    LCURLY shift, and go to state 5 

    LCURLY [reduce using rule 3 (Content)] 
    $default reduce using rule 3 (Content) 

: 이것은 당신에게 같은 것을 포함 · 출력 파일을 제공합니다. 이 경우 CMD을보고 나서 다음 토큰이 LCURLY 인 경우 3 번째 규칙 (Content: CMD)을 줄여야할지 여부를 알 수 없으므로 5 번째 규칙과 일치하는 무언가를 파싱 할 수 있는지 또는 LCURLY을 네 번째 규칙에 계속 일치하십시오. 이 경우

, 그것은 (2 개 토큰이 충분하다 - LCURLYTEXT 또는 CMD 후 결정이 토큰 여부에 만든 것) 더 내다보기로 말할 수 있지만, yacc를 (대부분의 LR 파서 생성기) lookahead의 하나의 토큰 만 사용하십시오.