yacc代码:
%{
#include<stdio.h>
#include<string.h>
%}
%union {
char* dval;
}
%token <dval> NUM VAR
%type <dval> E P
%left '+' '-'
%left '*' '/'
%%
statement : P {printf("\nt = %s\n \n",$1);}
;
P: E
;
E : E '+' E {strcpy($$,gencode($1,"+",$3));}
| E '-' E {strcpy($$,gencode($1,"-",$3));}
| E '*' E {strcpy($$,gencode($1,"*",$3));}
| E '/' E {strcpy($$,gencode($1,"/",$3));}
| '(' E ')' {strcpy($$,$2);}
| NUM {strcpy($$,$1);}
| VAR {strcpy($$,$1);}
;
%%
**The lex code:**
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"y.tab.h"
int n=0;
char *ch="t";
%}
%%
[0-9]+ {strcpy(yylval.dval,yytext); return NUM;}
[a-z]+ {strcpy(yylval.dval,yytext); return VAR;}
\n {return 0;}
. {return yytext[0];}
%%
void yyerror(char* str)
{
printf("\n%s",str);
}
char* gencode(char *first,char *op,char *second)
{
char *t;
char x[5];
t=(char*) malloc(sizeof(char)*5);
strcpy(t, ch);
itoa(n, x);
strcat(t, x);
printf("\n%s = %s %s %s\n",t,first,op,second);
n++;
t[strlen(t)]='\0';
return t;
}
main()
{
yyparse();
return 0;
}
由于某种原因,gcc输出错误:警告:传递'strcpy'的参数2使得指针来自整数而没有强制转换[默认情况下启用]。 strcpy的第二个参数是函数gencode,它返回一个char *而不是一个整数。
答案 0 :(得分:0)
您需要在yacc文件的开头声明gencode
。否则,编译器将其视为未定义,并假定它返回int
。
答案 1 :(得分:0)
您需要在.y文件中声明gencode
,在#include
标题中或直接在.y文件中声明。
你有一个更大的问题,因为你将dval
(大多数规则使用的类型)声明为char *
,但是在用{{{{}}写入之前你永远不会将它初始化为任何内容。 1}},因此当strcpy尝试写入随机地址时,您的代码将崩溃(或更糟)。您可以通过使用strcpy
替换lex文件中的strcpy
次调用以及仅使用yylval.dval = strdup(yytext)
分配的yacc文件中的调用来解决此问题(所以$$
...或者无论)