2016-12-09 16 views
0

나는 들소 새로운 그리고 난/감소 충돌 이동에 문제가 ...충돌 들소 파서

나는 C 언어에 대한 문법 규칙을 쓰고 있어요 : ID는 식별하는 토큰 이 규칙은 괄호 안에 작성된 경우에도 식별자를 사용할 수 있음을 보장하기 위해 작성했습니다. 들소 충돌

id    : '(' ID ')' {printf("(ID) %s\n", $2);} 
       |  ID  {printf("ID %s\n", $1);} 
       ; 

출력은 다음과 같습니다

State 82 

    12 id: '(' ID . ')' 
    13 | ID . 

    ')' shift, and go to state 22 

    ')'  [reduce using rule 13 (id)] 
    $default reduce using rule 13 (id) 

어떻게이 충돌을 해결할 수 있습니까?

나는 분명하고 도움 주셨으면합니다.

+0

전체 바이슨 출력입니까? 또한 영어로 제공 할 수 있습니까? – melpomene

+0

영어로 정확합니다. –

+2

문법에 대해서조차도 [Minimal, Complete, Verifiable example] (/ help/mcve)이 필요합니다. –

답변

0

고객님의 id 규칙 자체는 이동/축소 오류를 일으킬 수 없습니다. 문법에 ID을 사용하는 다른 규칙이 있어야합니다.

위의 예에서
expr: '(' expr ')' 
    | ID 
    ; 

, IDid 또는 expr로 줄일 ​​수 있으며, 파서가 가지고있는 감소 모르는 예를 들어, 다음과 같은 식의 규칙이있다. 상태에있는 것을 22


편집을 확인 : "나는 충돌을 해결하기 위해 무엇을 할 수 있는지 "당신이 물어

나는 C 언어에 대한 문법 규칙을 쓰고 있어요 : ID 변수를 식별하는 토큰이고 괄호 안에 작성된 경우에도 식별자를 고려할 수 있도록이 규칙을 작성했습니다.

왼쪽의 괄호 안에있는 변수는 C에서 유효하지 않으므로 그것은 오른쪽에서만 발생할 수 있습니다. 그런 다음 표현식으로 생각할 수 있습니다. 규칙을 삭제하면 id을 사용하면 expr으로 바뀝니다.

+0

맞습니다. 나는 그 유형의 규칙을 가지고 있으며, 만약 내가 그것을 언급한다면, 나는 더 이상의 갈등이 없다. 현재 어떻게해야합니까? –

+0

내 솔루션의 편집 참조. 도움이된다면 왼쪽의 위쪽/아래쪽 화살표 사이에있는 0을 클릭하여 해결책을 수락하십시오. –

+0

당신의 대답은 최고입니다. 그러나 C에서는 문법적으로 말하면 컴파일에 오류가 없다는 가정하에 (A) = (b)를 할 수 있습니다. 그러나 나는 당신의 해결책을 채택 할 것입니다. 고맙습니다 –