2011-03-20 33 views
2

這裏是我的代碼法: three.lYACC和lex代碼爲三個地址代碼語句

%{ 
#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是

three.y

%{ 

#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:19.40-41:'line'的$ 3沒有聲明類型

three.y:21.20-21:`的EXP $$ '沒有聲明的類型

three.y:21.60-61:$$`EXP的' 沒有聲明的類型

three.y :21.63-64:EXP的`$ 1 '沒有聲明的類型

three.y:21.66-67:$`EXP 3' 沒有聲明的類型

three.y:21.100-101:$$的'exp'沒有聲明類型

three.y:21.103-104:'exp'的$ 1沒有decl ARED型

three.y:21.106-107:$ EXP的'3 '沒有聲明的類型

three.y:22.21-22:$$`EXP的' 沒有聲明的類型

3 .Y:22.61-62:$$`EXP的 '沒有聲明的類型

three.y:22.64-65:$`EXP 1' 沒有聲明的類型

three.y:22.67-68: $ exp'沒有申報類型

t hree.y:22.104-105:EXP的`$ 1 '沒有聲明的類型

three.y:22.107-108:$`EXP 3' 沒有聲明的類型

three.y:23.22-23: $$`EXP的 '沒有聲明的類型

three.y:23.62-63:`的EXP $$' 沒有聲明的類型

three.y:23.65-66:EXP的`$ 1」沒有聲明的類型

three.y:23.68-69:'exp'的$ 3沒有聲明的類型

three.y:23.102-103:`的EXP $$ '沒有聲明的類型

three.y:23.105-106:$ 1`EXP' 沒有聲明的類型

three.y:23.108 -109:EXP的`$ 3 '沒有聲明的類型

three.y:24.21-22:`的EXP $$' 沒有聲明的類型

three.y:24.61-62:$$的` exp'沒有聲明類型

three.y:24。64-65:$ 1 EXP的' '沒有聲明的類型

three.y:24.67-68:$ 3`EXP' 沒有聲明的類型

three.y:24.102-103:$$的` EXP '沒有聲明的類型

three.y:24.105-106:$`EXP 1' 沒有聲明的類型

three.y:24.108-109:$ 3 EXP的'」沒有聲明的類型

three.y:25.10-11:'exp'的$$沒有聲明的類型

pla幫我解決了這個問題..

+0

認爲您的括號可能不會排隊... – 2011-03-20 06:10:04

回答

0

當你爲你的yystype使用%union時,那麼當你引用yylval時你必須說明使用哪個union的成員。因此,與你的工會

%union{char *a_var;} 

當你說

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

你應該說,而不是像$ 1.a_var:

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

據我看到的,類型語義值lineexp似乎不是在您的代碼中指定的 。
所以,我認爲指定類型如%type <a_var> line exp將解決 的錯誤。
希望這有助於

1

%type <a_var> exp 

添加到您的代碼,你需要定義EXP。