【问题标题】:Prevent Lex scanner from ever terminating the program防止 Lex 扫描仪终止程序
【发布时间】:2018-04-09 20:13:29
【问题描述】:

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

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

【问题讨论】:

    标签: parsing exit lex


    【解决方案1】:

    没错,就是有点丑。 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++,否则您可以在其中抛出异常)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多