所以,我发现有可能导致Lex扫描程序在没有文件的情况下调用exit()
,为了输入,它会被赋予一个目录。然后它将打印input in flex scanner failed
并将退出程序...这是...库代码的非常意外的行为,温和地说。
因此,问题是:有没有办法阻止Lex代码退出程序?我的意思是,没有理由yyparse
或yypush_parse
或他们的朋友没有在他们的退出代码中报告这个...他们为什么要终止整个程序?我正在寻找在*.l
文件中指定的选项......但是到目前为止所有的网络搜索命中都表明我只是检查自己是否有可能在Lex终止程序并在他们到达Lex之前抓住它们的所有条件
答案 0 :(得分:2)
这是正确的,而且有点难看。 Flex扫描程序在I / O错误上非常失败,没有简单的选项可以防止这种情况发生。
如果存在内存分配错误(包括无法动态重新分配缓冲区的情况)和各种内部错误,Flex扫描程序也会调用exit()
。
您可以通过实现自己的YY_INPUT
定义来避免I / O错误的问题,该定义不会调用exit()
,但YY_INPUT
宏没有机制可以报告错误,部分原因是yylex
无法向解析器返回错误指示。你可以使用一些笨拙的解决方法,比如设置一个标志并返回EOF(即0),但它不是很干净。
查看Flex框架文件,您可以定义宏YY_FATAL_ERROR(msg)
,它将调用包装到exit()
。但是,目前还不完全清楚报告错误情况的实际情况。您不能只return
,因为YY_FATAL_ERROR
的某些调用不在主yylex
函数中。关于我能看到的唯一可能性是longjmp
(除非你使用C ++,否则你可以抛出异常)。