2012-12-08 3 views
8

현재 컴파일러에 대해 공부하고 있는데 LR (0)에서 "시프트/감소"또는 "감소/감소"충돌이있는 경우를 이해하지만 "시프트/시프트"충돌은 불가능합니다! 왜 우리는 "교대/교대"갈등을 가질 수 없습니까?컴파일러에서 "시프트/시프트"충돌이 발생하지 않는 이유는 무엇입니까?

+2

핸들을 줄이기 위해 선택할 수있는 2 개의 프로덕션이므로 축소 감소 충돌이 있습니다. 일부 제품에서는 이동 및 축소가 가능하고 구문 분석을 계속 진행할 수 있기 때문에 시프트 감소 충돌이 있습니다. Shift는 단지 1 가지를 의미하며 입력 스트림을 진행하므로 시프트 이동 충돌이 발생하지 않습니다. – axiom

답변

18

구문 분석기가 이동할지 (구문 분석 스택 위에 다음 입력 토큰을 푸시) 또는 줄이기 (해석 스택에서 일련의 터미널과 비 터미널을 팝하는지)를 알 수없는 경우 Shift/reduce 충돌이 발생합니다. reduce/reduce 충돌은 파서가 줄이기를 알고 있지만 수행 할 줄이기를 알 수없는 경우입니다.

시프트/시프트 충돌이 발생하면 구문 분석기는 다음 토큰을 구문 분석 스택으로 푸시해야한다는 것을 알고 있지만이를 수행하는 방법을 알지 못합니다. 토큰을 구문 분석 스택에 푸시하는 유일한 방법은 하나이기 때문에 일반적으로이 양식의 충돌은있을 수 없습니다.

말하자면 이론적으로 동일한 터미널 심볼로 라벨이 지정된 주어진 파싱 상태를 벗어나는 2 개 이상의 전환이있는 이상한 설정이있는 경우 교대/시프트 충돌이 존재할 수 있습니다. 이 경우의 갈등은 한 국가로 이동하거나 다른 국가로 이동하거나 이동할 것인지 여부입니다. 이것은 오토 마톤을 더 적은 수의 상태로 압축하려고 시도했을 때, 또는 그렇게 잘못한 경우 또는 비 결정적 파싱 오토 마톤을 구축하려고 시도한 경우에 발생할 수 있습니다. 실제로 이것은 결코 일어나지 않을 것입니다.

희망이 도움이됩니다.

+0

세 번째 단락은 매우 유용합니다. 감사합니다! – alcuadrado

관련 문제