【问题标题】:flex/bison not terminating on <<EOF>>flex/bison 未在 <<EOF>> 上终止
【发布时间】:2014-04-02 12:21:23
【问题描述】:

我有一个使用 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);
}

我已经尝试过不放&lt;&lt;EOF&gt;&gt;规则和其他一些与此相关的东西,比如调用yyterminate(),调用return 0,两者都这样,但没有成功。

谁能告诉我我错过了什么?

TIA。

【问题讨论】:

    标签: bison flex-lexer


    【解决方案1】:

    好的,搞定了……

    当我最初开始使用这段代码时,我使用了著名的“ctrl-c/ctrl-v”功能...... :)

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

    从文件中获取输入,就目前的情况而言,我们有 3 种替代方法可以在文件结尾的情况下退出解析:

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

    【讨论】:

      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 2014-01-16
      • 2020-07-05
      • 1970-01-01
      • 2013-10-24
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多