如何在lex和yacc中读取多行输入?

时间:2012-10-18 13:54:25

标签: compiler-construction yacc lex

我希望输出为

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

2 个答案:

答案 0 :(得分:4)

您的语法只能读取一个line

也许你想要:

start : line
      | start line
      ;

答案 1 :(得分:2)

不清楚你想要什么。你想要一次调用yyparse来解析多行(直到你获得EOF)吗?如果是这样,rici的回答就是你想要的。或者您希望yyparse解析单行并返回,之后您可以再次调用它来解析另一行?如果这就是你想要的,你需要让你的词法分析器识别换行符并为它们返回一个EOF:

[\n]    return -1;

但是,根据您当前的语法,这将为您提供空白行的语法错误,这可能是您想要的,也可能不是。