这是我的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'的$$没有声明的类型
帮我解决这个问题。
答案 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)
据我所知,line
和exp
的语义值类型似乎不是
在您的代码中指定
所以,我认为指定类似%type <a_var> line exp
的类型将会解决
错误。
希望这有帮助