我有一个使用flex / bison的简单项目。我试图解析一个文本文件,但它没有退出解析(显然是文件末尾的循环)。
我的弹力代码:
%{
#include "y.tab.h"
%}
%%
[0-9] { printf("digit: %s\n",yytext); return DIGIT; }
[a-zA-ZáéíóúÁÉÍÓÚçÇãõÃÕ]+ { printf("word: %s\n",yytext); return WORD; }
[\.]
[ ]
[\n]
. { printf("other: %s\n",yytext); return OTHER; }
<<EOF>> { yyterminate(); return 0; }
%%
我的野牛代码:
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token DIGIT WORD OTHER SPACE
%%
start :
text
;
text :
| WORD text
;
%%
extern FILE *yyin;
main()
{
printf("Translating...\n");
printf("\n");
if ((yyin = fopen("/home/nilo/text","r")) == NULL)
{
fprintf(stderr,"File not found or not readable.\n");
exit(1);
}
// Start the parser
yyparse();
fprintf(stderr,"Parser ended...\n");
}
yyerror(s)
char *s;
{
printf("yacc error: %s\n", s);
}
yywrap()
{
return(0);
}
我已经尝试过不将<<EOF>>
规则和其他一些与此相关的事情,例如调用yyterminate(),调用return 0,两者等等,但没有成功。
有人可以告诉我我错过了什么吗?
TIA。
答案 0 :(得分:2)
好的,让它运转起来......
当我最初开始使用此代码时,我使用着名的&#34; ctrl-c / ctrl-v&#34;功能...:)
当&#34; yywrap()&#34;返回0,这表示已达到EOF但解析必须继续。在交互式解析器上尤其如此。
从文件获取输入,因为目前的情况,我们有3种方法可以退出文件结束情况下的解析: