如果文件不存在,Flex Bison从文件中读取会出现分段错误

时间:2016-05-23 22:58:49

标签: c bison flex-lexer

我有可以解析文件内容的flex代码,但是如果尝试读取的文件不存在,我会遇到分段错误。

flex文件也与bison接口,但这部分代码没有,请告诉我你是否还想要bison文件。

flex代码:

%{
#include <stdlib.h>
#include "helper.h"
#include "spire.tab.h"
void yyerror(char *);
%}

%x incl
%%
include BEGIN(incl);

...

\"[a-zA-Z0-9_ ]+\.(spr)\" {
        char *f = strdup(yytext);

        f++[strlen(f)-1] = 0;

        yyin = fopen( f, "r" );

        if (! yyin)
                printf("Could not read %s\n", f);
        yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));

        BEGIN(INITIAL);
}

<<EOF>> {
        yypop_buffer_state();

        if ( !YY_CURRENT_BUFFER )
        {
                yyterminate();
        }
}


[ \t\n]+ ; /* ignore whitespace */
. yyerror("Unknown character");


%%

int yywrap(void) {
 return 1;
}

如果文件不存在,我将其输出(对于文件fle.spr)

Could not read fle.spr
Segmentation fault (core dumped)

编辑:

已更改

 if (! yyin)
     printf("Could not read %s\n", f);
 yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));

if (! yyin){
    printf("Could not read %s\n", f);
}else{
    yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
}

仍然得到相同的错误

1 个答案:

答案 0 :(得分:1)

我不确定为什么这会让人感到意外。

您的代码会检查文件是否正常工作。如果没有,则会打印一条错误消息(在stdout而不是stderr,但这是一个小细节),然后继续

之后,扫描程序将立即尝试从yyin读取,但yyin为NULL。所以它就像预期的那样是段错误的。

如果文件不存在,请勿尝试阅读。它就这么简单。