2011-04-10 3 views
0

YACC의 이동/축소 충돌 문제를 이해하는 데 문제가 있습니다. 누군가이 문제를 해결하고 매달려있는 다른 예를 사용하여 나에게 설명해 주시겠습니까?Shift 감소 충돌

감사합니다.

if (x) then if (y) then a; else b; 

중 하나

if (x) then { 
    if (y) { 
     then a; 
     else b; 
    } 
} 

로서 해석 할 수 있습니다 또는

if (x) then { 
    if (y) 
     then a; 
} 
else b; 

대부분의 언어가 첫 번째 필요 -와 :

답변

1

는 매달려 다른 문제는 기본적으로 무엇인가가 있음을 의미 그게 바로 yacc이하는 일이기 때문에 실제 문제는 거의 없습니다. (실제로 yacc의 S/R 충돌은 거의 없습니다. 우려의 uch).

+0

그들이 관심이 있는지 여부는 그것이 무엇인지 이해 한 후에 만 ​​말할 수 있으며 문법의 특정 지점에서 왜 발생하는지 설명 할 수 있습니다. LadyMadonne234가 그것을 이해하려고 시도하는 것이 정말 좋습니다. – Ingo

+0

@Ingo : 오, 그 말은 내게 논평이 아닙니다. 나는 문법에서 모든 S/R 갈등을 없애기로 결정하는 것이 거의 가치있는 연구라고는 생각하지 않았습니다. –

+0

고마워, 그게 문제가 뭔지 꽤 분명해. 그러나 아래에 표시된 개선 된 문법이 어떻게 문제를 해결하는지 설명 할 수 있습니까? 'full_if : something | IF 표현 THEN full_if ELSE full_if ; open_if : IF 표현 THEN 문 | IF 표현 THEN full_if ELSE open_if 그래서 "If A Then Then B Then C Else D"와 같은 문장이 있으면 스택에 똑같은 문제가있는 것 같습니다. "If A Then Then B then C then"에 있고 Else가 나오면 open_if 규칙의 첫 번째 부분을 사용하여 줄일 수 있습니다. – LadyMadonna234