flex/bison未终止于<&书信电报;EOF>&燃气轮机;

flex/bison未终止于<&书信电报;EOF>&燃气轮机;,bison,flex-lexer,Bison,Flex Lexer,我有一个使用flex/bison的简单项目。我试图解析一个文本文件,但它并没有停止解析(显然是文件末尾的一个循环) 我的flex代码: %{ #include "y.tab.h" %} %% [0-9] { printf("digit: %s\n",yytext); return DIGIT; } [a-zA-ZáéíóúÁÉÍÓÚçÇãõÃÕ]+ { printf("word: %s\n",yytext); return WORD

我有一个使用flex/bison的简单项目。我试图解析一个文本文件,但它并没有停止解析(显然是文件末尾的一个循环)

我的flex代码:

%{
#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; }
%%
%{
#包括“y.tab.h”
%}
%%
[0-9]{printf(“数字:%s\n”,yytext);返回数字;}
[a-zA-ZáāíóÉ×ÚāõÃÕ]+{printf(“单词:%s\n”,yytext);返回单词;}
[\.]                            
[ ]        
[\n]
.                               {printf(“其他:%s\n”,yytext);返回其他;}
{yyterminate();返回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);
}
%{
#包括
#包括
%}
%令牌数字字其他空间
%%
开始:
文本
;
正文:
|文字
;
%%
外部文件*yyin;
main()
{
printf(“翻译…\n”);
printf(“\n”);
if((yyin=fopen(“/home/nilo/text”,“r”))==NULL)
{
fprintf(stderr,“文件找不到或不可读。\n”);
出口(1);
}
//启动解析器
yyparse();
fprintf(stderr,“解析器结束…\n”);
}
YY错误
char*s;
{
printf(“yacc错误:%s\n”,s);
}
yywrap()
{
返回(0);
}
我已经尝试过不使用
规则和其他一些与此相关的东西,比如调用yyterminate()、调用return0,这两种方法都没有成功

有人能告诉我我错过了什么吗

TIA.

好的,开始工作了

当我开始使用这段代码时,我使用了著名的“ctrl-c/ctrl-v”特性……:)

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

从文件中获取输入,由于目前的情况,我们有3种方法可以在文件结束时退出解析:

  • 在lex规范上添加一个%noyywrap选项,并删除您这边的yywrap()代码或
  • 将yywrap()更改为返回1以退出分析或
  • 更改yywrap()以将yyin设置为另一个文件,并返回0以继续分析新添加的文件