我有可以解析文件内容的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 ));
}
仍然得到相同的错误
答案 0 :(得分:1)
我不确定为什么这会让人感到意外。
您的代码会检查文件是否正常工作。如果没有,则会打印一条错误消息(在stdout
而不是stderr
,但这是一个小细节),然后继续。
之后,扫描程序将立即尝试从yyin
读取,但yyin
为NULL。所以它就像预期的那样是段错误的。
如果文件不存在,请勿尝试阅读。它就这么简单。