2011-03-20 3 views
2

내 렉스 코드 : Yacc에 렉스 코드는 여기

예약자는 테너
%{ 
#include "y.tab.h" 
#include "string.h" 
%} 
%% 
[a-zA-Z]+ { yylval.a_var=(char *)malloc(sizeof(char *)); 
     strcpy(yylval.a_var,yytext); 
     return var;} 
[-+/*,] {return yytext[0];} 

[\t\n] return 0; 

%% 

내 Yacc와는

%{ 

#include "stdio.h" 

#include "string.h" 

int yywrap() 

{ 


return 1; 
} 

static int i; 


int d; 

char temp(); 

%} 

%left '+' '-' 

%left '*' '/' 

%union{char *a_var;} 

%token id 

%token <a_var>var 

%start line 


%% 
line:var '=' exp {printf("%c=t%c\n",$1,$3);} 

; 
exp:exp '+' exp {$$=temp();if(i<=1){printf("t%c=%c+%c\n",$$,$1,$3);} else{printf("t%c=t%c+%c\n",$$,$1,$3);} } 

|exp '-' exp  {$$=temp();if(i<=1){printf("t%c=%c-%c\n",$$,$1,$3); } else{printf("t%c=t%c-%c\n",$$,$1,$3);} } 

|exp '*' exp  {$$=temp();if(i<=1){printf("t%c=%c*%c\n",$$,$1,$3); } else{printf("t%c=t%c*%c\n",$$,$1,$3);} } 

|exp '/' exp  {$$=temp();if(i<=1){printf("t%c=%c/%c\n",$$,$1,$3); } else {printf("t%c=t%c/%c\n",$$,$1,$3);} } 

|var {$$=$1;} 

; 

%% 

main() 

{ 

yyparse(); 

return 0; 

} 

int yyerror(char *s) 

{ 



fprintf(stderr,"%s\n",s); 

} 

char temp() 

{ 

return('1'+ i++); 

} 

three.y

입니다하지만 난 컴파일 할 때 이

three.y : 19.40-41 :`line '의 $ 3에는 선언 된 타입이 없습니다.

three.y : 21.20-21 : 특급 '의 $$는'더 선언 된 유형에게이 없습니다

three.y : 21.60-61는`특급의 $$는 '더 선언 된 유형이 없습니다

three.y : 21.63-64 : 21.100-101 : 더 선언 된 유형을

three.y이 없습니다 특급`의 $ 1 ': 21.66-67`특급의 $ 3

three.y 더 선언 된 유형에게이 없습니다'의 $$를 `exp '는 선언 된 타입이 없습니다

three.y : 21.103-104 :`exp'의 $ 1은 선언되지 않습니다. ared 유형

three.y : 21.106-107 : 특급`의 $ 3 ': 22.21-22 : 더 선언 된 유형을

three.y이 없습니다`특급의 $$는'더 선언 된 유형이 없습니다

세 .Y : 22.61-62 :`특급의 $$는 '더 선언 된 유형이 없습니다

three.y : 22.64-65 :`특급의 $ 1'에는 선언 된 유형에게이 없습니다

three.y : 22.67-68 : `exp '의 $ 3에는 신고 된 타입이 없습니다.

t hree.y : 22.104-105 : 특급`의 $ 1 '에는 선언 된 유형에게이 없습니다

three.y : 22.107-108 :`특급의 $ 3'에는 선언 된 유형에게이 없습니다

three.y : 23.22-23 : 23.65-66 : 더 선언 된 유형

three.y이없는 특급`의 $ 1 '이'특급의 $$는 ': 23.62-63 특급'의 $$이

three.y 더 선언 된 유형이 없습니다 ' 신고 된 타입 없음

three.y : 23.68-69 :`exp '의 $ 3에는 신고 된 타입이 없습니다.

three.y : 23.102-103은 : 특급 '의 $$는'23.105-106 : 더 선언 된 유형

three.y이 없습니다의 $ 1 '특급'은 어떤 선언 된 유형이 없습니다

three.y : 23.108 -109 : 특급`의 $ 3 '에는 선언 된 유형이 없습니다

three.y : 24.21-22 : 특급'의 $$는 '더 선언 된 유형이 없습니다

three.y : 24.61-62 :의 $$` exp '은 (는) 선언 된 타입이 없습니다.

three.y : 24.64-65 : 특급`의 $ 1 ': 24.67-68 : 더 선언 된 유형

three.y이 없습니다의 $ 3'특급 '은 어떤 선언 된 유형이 없습니다

three.y : 24.102-103 :의 $$` 특급은 '24.105-106 :

three.y에는 선언 된 유형이없는`특급의 $ 1'에는 선언 된 유형에게이 없습니다를

three.y : 24.108-109 : 특급`의 $ 3 '에는 선언 된 유형이 없습니다

three.y : 25.10-11 : $$의`exp '는 선언 된 타입이 없습니다

pla이 문제를 해결할 수 있도록 도와주세요 ..

+0

대괄호가 맞지 않는다고 생각하세요 ... –

답변

0

yystype에 % union을 사용하면 yylval을 참조 할 때 사용할 조합의 멤버를 말해야합니다. $ 1.a_var 같은 당신이

line:var '=' exp {printf("%c=t%c\n",$1,$3);} 

말 노동 조합

%union{char *a_var;} 

에 그래서 당신이 대신 말을해야 뭔가 : 지금까지 내가 보는 바와 같이

line:var '=' exp {printf("%c=t%c\n",$1.a_var,$3.a_var);} 
0

, 의미 적 값의 종류 코드의 이 아닌 것으로 보입니다.
따라서 %type <a_var> line exp과 같은 유형을 지정하면 오류가 해결됩니다.
희망이

1

이 코드에 라인

%type <a_var> exp 

를 추가하는 데 도움이, 당신은 특급을 정의해야합니다.