【发布时间】:2016-03-09 12:12:45
【问题描述】:
我正在尝试生成与基本算术表达式相对应的 3 个地址代码。我以前没有使用过 lex 和 yacc 工具(新手),我无法理解两者之间的控制/命令流,即两个程序如何交互。
lex.l
%{
#include<stdio.h>
#include"y.tab.h"
int k=1;
%}
%%
[0-9]+ {
yylval.dval=yytext[0];
return NUM;
}
\n {return 0;}
. {return yytext[0];}
%%
void yyerror(char* str)
{
printf("\n%s",str);
}
char *gencode(char word[],char first,char op,char second)
{
char temp[10];
sprintf(temp,"%d",k);
strcat(word,temp);
k++;
printf("%s = %c %c %c\n",word,first,op,second);
return word; //Returns variable name like t1,t2,t3... properly
}
int yywrap()
{
return 1;
}
main()
{
yyparse();
return 0;
}
yacc.y
%{
#include<stdio.h>
int aaa;
%}
%union{
char dval;
}
%token <dval> NUM
%type <dval> E
%left '+' '-'
%left '*' '/' '%'
%%
statement : E {printf("\nt = %c \n",$1);}
;
E : E '+' E
{
char word[]="t";
char *test=gencode(word,$1,'+',$3);
$$=test;
}
| E '-' E
{
char word[]="t";
char *test=gencode(word,$1,'-',$3);
$$=test;
}
| E '%' E
{
char word[]="t";
char *test=gencode(word,$1,'%',$3);
$$=test;
}
| E '*' E
{
char word[]="t";
char *test=gencode(word,$1,'*',$3);
$$=test;
}
| E '/' E
{
char word[]="t";
char *test=gencode(word,$1,'/',$3);
$$=test;
}
| '(' E ')'
{
$$=$2;
}
| NUM
{
$$=$1;
}
;
%%
问题: getting garbage value in output
表达式 (2+3)*5 的预期输出应类似于:
t1= 2 + 3
t2= t1 * 5
得到的输出:
t1= 2 + 3
t2= garbage value * 5
我无法弄清楚如何纠正这个问题。 lex.l 中的 gencode() 方法正确返回了变量名称(例如 t1,t2,t3 )
char *test=gencode(word,$1,'%',$3);
但我完全不知道在那之后出了什么问题。我相信我没有正确处理$$,$1,$3 条款。
请帮助我了解出了什么问题、需要做什么以及如何去做。 一点帮助和一些解释将非常有帮助。谢谢。
【问题讨论】: