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* 而不是整数。