防止 Lex 扫描器终止程序

Prevent Lex scanner from ever terminating the program

因此,我发现当输入的不是文件而是目录时,可以导致 Lex 扫描器调用 exit()。然后它将打印 input in flex scanner failed 并退出程序...这是...对于库代码来说,这是非常意外的行为,委婉地说。

因此,问题是:是否有任何方法可以阻止 Lex 代码退出程序?我的意思是,yyparseyypush_parse 或他们的朋友没有理由不在他们的退出代码中报告这一点……他们为什么要终止整个程序?我一直在寻找在 *.l 文件中指定的选项等等...但是到目前为止,所有网络搜索结果都建议我检查自己,了解 Lex 将终止程序并在它们到达 Lex 之前捕获它们的所有可能条件.

说的对,就是有点丑。 Flex 扫描仪在 I/O 错误时不正常地死掉,并且没有简单的选项可以防止这种情况发生。

如果存在内存分配错误(包括无法动态重新分配缓冲区的情况)和各种内部错误,Flex 扫描器也会调用 exit()

您可以通过实现您自己的不调用 exit()YY_INPUT 定义来避免 I/O 错误的问题,但是 YY_INPUT 没有任何机制] 宏来报告错误,部分原因是 yylex 到 return 无法向解析器指示错误。您可以使用一些笨拙的解决方法,例如设置标志和 returning EOF(即 0),但它不是很干净。

查看 Flex 框架文件,您似乎可以定义宏 YY_FATAL_ERROR(msg),它包装对 exit() 的调用。但是,并不完全清楚您实际上可以做什么来报告错误情况。您不能只是 return,因为 YY_FATAL_ERROR 的某些调用不在主 yylex 函数中。我能看到的唯一可能性是 longjmp(除非你使用 C++,在 casr 中你可以抛出异常)。