2016-10-30 15 views
-4

// 렉스 파일 :주어진 코드에서 충돌이 해결 되었습니까? "25 교대/감소 충돌 [-Wconflicts-SR]"

alpha [A-Za-z] 
digit [0-9] 
%% 
[\t \n] 
for   return FOR; 
{digit}+ return NUM; 
{alpha}({alpha}|{digit})* return ID; 
"<="   return LE; 
">="   return GE; 
"=="   return EQ; 
"!="   return NE; 
"||"   return OR; 
"&&"   return AND; 
.   return yytext[0]; 
%% 

// Yacc에 파일 for.l :

%{ 
#include<stdio.h> 
#include<stdlib.h> 
%} 
%token ID NUM FOR LE GE EQ NE OR AND 
%right "=" 
%left OR AND 
%left '>' '<' LE GE EQ NE 
%left '+' '-' 
%left '*' '/' 
%right UMINUS 
%left '!' 
%% 
S   : ST {printf("Input accepted\n"); exit(0);} 
ST  : FOR '(' E ';' E2 ';' E ')' DEF 
; 
DEF : '{' BODY '}' 
| E';' 
| ST 
| 
; 
BODY : BODY BODY 
| E ';'   
| ST 
|    
; 
E  : ID '=' E 
| E '+' E 
| E '-' E 
| E '*' E 
| E '/' E 
| E '<' E 
| E '>' E 
| E LE E 
| E GE E 
| E EQ E 
| E NE E 
| E OR E 
| E AND E 
| E '+' '+' 
| E '-' '-' 
| ID  
| NUM 
; 
E2  : E'<'E 
| E'>'E 
| E LE E 
| E GE E 
| E EQ E 
| E NE E 
| E OR E 
| E AND E 
;  
%% 
#include "lex.yy.c" 
main() 
{ 
printf("Enter the expression:\n"); 
yyparse(); 
}   

내가 그것을 실행

for.y, 표시 :

warning: 25 shift/reduce conflicts [-Wconflicts-sr] 
warning: 4 reduce/reduce conflicts [-Wconflicts-rr] 

어떻게 수정합니까?

컴파일 방법 :

$ lex c.l 
$ yacc c.y 
+0

코드를 편집하고 문제가 더 구체적이어서 더 빠르고 – Clay

+0

이 충돌을 도와주세요. –

+1

이 게시물을보십시오 : http://stackoverflow.com/questions/26968665/bison-shift-reduce-conflict-tiger-compiler – Clay

답변

1

문법에 여러 가지 문제가 있습니다; 여기에 가장 확실한 것들이 있습니다 :

  1. DEF은 비어 있습니다. 즉

    for (i=0;i<1;i++) for (j=0;j<1;j++) 
    

    빈 몸으로 두 for 문, 또는 누구의 몸 (몸 비어) 다른 for 문이다 for 문이 될 수 있다는 것을 의미한다. 그래서 비어있는 작품은 문법을 모호하게 만든다.

  2. BODY: BODY BODY은 지수 적으로 모호하며 우선 순위 선언으로 보상 할 수 없습니다. 문제는 BODY에 대한 (또한 불필요한) 빈 생산이 있다는 사실로 인해 더욱 악화됩니다.

  3. E '+' '+'

    i++에있는 두 + 별도의 토큰 (그리고 당신의 플렉스 정의는 예를 들어 하나의 토멘, unlime, 같은 ++, < =를 인식하지 못하는, 실제로 것을 의미한다. 그 귀하의 문법에 따라 i + +이 유효한 후 증가가 될 수 있다는 것을 의미합니다. 아마도 의도적이지만 아마도 내가 아는 언어와 다를 수 있습니다. 어쨌든 +에 대한 선행 선언이 적용될 것입니다. : 3*j++은이 아니라 3*(j++)으로 구문 분석되어야합니다.. (후행 감소 연산자에 대해서도 마찬가지입니다.)