flex / bison不会在&lt; <eof>&gt; </eof>上终止

时间:2014-04-02 12:21:23

标签: bison flex-lexer

我有一个使用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。

1 个答案:

答案 0 :(得分:2)

好的,让它运转起来......

当我最初开始使用此代码时,我使用着名的&#34; ctrl-c / ctrl-v&#34;功能...:)

当&#34; yywrap()&#34;返回0,这表示已达到EOF但解析必须继续。在交互式解析器上尤其如此。

从文件获取输入,因为目前的情况,我们有3种方法可以退出文件结束情况下的解析:

  1. 在lex规范上添加%选项noyywrap并删除你身边的yywrap()代码或
  2. 将yywrap()更改为返回1以退出解析OR
  3. 更改yywrap()以将yyin设置为另一个文件并返回0以继续解析新添加的文件。