我希望输出为
a=3 mov a,3
a=fs mov b,fs
b=32 mov b,32
3地址中间代码生成程序: 为词法分析编写的lex文件,从命令行读取输入并传递标记:
%{
#include "y.tab.h"
#include "string.h"
#include <math.h>
%}
%%
[a-zA-Z]+ { yylval.var=(char *)malloc(sizeof(char *));
strcpy(yylval.var,yytext);
return ID;}
"=" return EQUALS;
[0-9]+ {yylval.num=atoi(yytext);return DIGIT;}
%%
yacc文件:
%{
#include "stdio.h"
#include "string.h"
int yywrap()
{
return 1;
}
%}
%union
{char *var;
int num;
}
%token <var> ID
%token <num> EQUALS DIGIT
%%
start : line
line : ID EQUALS DIGIT {printf("MOV %s, %d\n",$1, $3);}
| ID EQUALS ID {printf("MOV %s, %s\n",$1, $3);}
;
%%
main()
{
yyparse();
return 0;
}
int yyerror(char *s)
{
fprintf(stderr,"%s\n",s);
}
现在作为运行上述代码的输出(lex和yacc之间的链接)
dsa=32
MOV dsa, 32 // 3 address code generated
ds=342 // but does not parse this line why??
syntax error
答案 0 :(得分:4)
您的语法只能读取一个line
也许你想要:
start : line
| start line
;
答案 1 :(得分:2)
不清楚你想要什么。你想要一次调用yyparse
来解析多行(直到你获得EOF)吗?如果是这样,rici的回答就是你想要的。或者您希望yyparse
解析单行并返回,之后您可以再次调用它来解析另一行?如果这就是你想要的,你需要让你的词法分析器识别换行符并为它们返回一个EOF:
[\n] return -1;
但是,根据您当前的语法,这将为您提供空白行的语法错误,这可能是您想要的,也可能不是。