三个地址代码语句的yacc和lex代码

时间:2011-03-20 05:39:54

标签: yacc

这是我的lex代码: three.l

%{
#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没有声明的类型

three.y:21.106-107:`exp'的$ 3没有声明的类型

three.y:22.21-22:`exp'的$$没有声明的类型

three.y:22.61-62:`exp'的$$没有声明的类型

three.y:22.64-65:`exp'的$ 1没有声明的类型

three.y:22.67-68:`exp'的$ 3没有声明的类型

three.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:`exp'的$ 1没有声明的类型

three.y:23.108-109:`exp'的$ 3没有声明的类型

three.y:24.21-22:`exp'的$$没有声明的类型

three.y:24.61-62:`exp'的$$没有声明的类型

three.y:24.64-65:`exp'的$ 1没有声明的类型

three.y:24.67-68:`exp'的$ 3没有声明的类型

three.y:24.102-103:`exp'的$$没有声明的类型

three.y:24.105-106:`exp'的$ 1没有声明的类型

three.y:24.108-109:`exp'的$ 3没有声明的类型

three.y:25.10-11:`exp'的$$没有声明的类型

帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

添加行

%type <a_var> exp

到您的代码,您需要定义exp。

答案 1 :(得分: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);}

答案 2 :(得分:0)

据我所知,lineexp的语义值类型似乎不是 在您的代码中指定 所以,我认为指定类似%type <a_var> line exp的类型将会解决 错误。
希望这有帮助