2012-01-17 2 views
0

상황은 아주 단순한 구문을 작성했지만 컴파일 할 때 충돌이 있습니다. 필자는 왜 이런 간단한 구문으로 인해 충돌이 발생할 수 있는지에 대한 아이디어가 없습니다.yacc에는 시프트/감소 충돌이 있습니다.

%token SCRIPT_ID 
%token STRING 
%start functions 

%% 
functions: SCRIPT_ID '(' STRING ')' {printf("script_id is %s", $3);}; 
%% 

그냥 내 파일을 구문 분석하기 위해 yacc을 사용하고 싶습니다. 내 파일에는 script_id ("1232444")와 같은 것들이 있습니다.

나는 yacc 설명서를 검색하고 shift/reduce 충돌에 대해 이야기 할 때 'if와 else'와 같은 예를 들게됩니다. 그리고 나는 왜 prioperity가 지정되지 않은 경우 'if와 else'가 충돌을 갖는지 이해합니다. 그러나 if-else-conflict가 내가 만난 갈등과 무언가 관련이 있는지 나는 모른다.

내 코드에 어떤 문제가 있는지 말해 줄 수 있습니까?

+0

SCRIPT_ID 및 STRING 토큰을 어떻게 정의했는지 보여줄 수 있습니까? – Zuljin

+1

yacc의 자세한 정보 출력에 자세한 정보가 표시 될 수 있습니다. '-v' 옵션으로 문법을 컴파일하십시오. 이것은 정보가있는'y.output' 파일을 생성합니다. –

답변

1

정확한 오류가 발생하지 않았습니까? 하나의 규칙만으로 문법을 바꾸거나 줄일 수 없으므로 문법 전체를 보여주지 못했을 것입니다.

그러나 일반적으로 시프트/축소 충돌이 무엇인지 이해하려면 LR 구문 분석 상태 이론에 대한 자세한 내용을 실제로 배우고 싶습니다. 가정하면 당신은, 그러나, 당신이 위키 피 디아 페이지로 시작 수도 있습니다 할 :

이 전체 주제에 가장 좋은 전체 텍스트와 참조 책은 소위 "드래곤입니다 도서 ", (실명 : 컴파일러 : 원리, 기법 및 도구) : http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

관련 문제