当我使用 yymore() 时,在 EOF 处出现 Flex 错误“缓冲区末尾丢失”

2024-05-07

我正在编写一个 Flex 程序来处理字符串常量。

当输入文件在字符串中遇到 EOF 时,我想返回一个 ERROR 标记。

文件遇到 EOF 并打印“ERROR”后出现以下错误:

致命的 Flex 扫描仪内部错误 - 缓冲区末尾丢失

这是我的代码:(可以重现此错误的简化版本)

%option noyywrap
    #define ERROR 300
    #define STRING 301
    char *text;
%x str

%%

\"            {BEGIN(str); yymore();}
<str>\"       {BEGIN(INITIAL); text=yytext; return STRING;}
<str>.        {yymore();}
<str><<EOF>>  {BEGIN(INITIAL); return ERROR;}

%%

int main(){
    int token;
    while((token=yylex())!=0){
        if(token==STRING)
            printf("string:%s\n",text);
        else if(token==ERROR)
            printf("ERROR\n");
    }
    return 0;
}

当我删除yymore()函数调用后,错误消失,程序在打印“ERROR”后正常退出。

我想知道为什么会发生这种情况,我想在不删除的情况下解决它yymore().


在收到 EOF 指示后,您无法继续词法扫描,因此您的<str><<EOF>>规则不正确,这就是错误消息所指示的内容。

与任何未定义的行为一样,在某些情况下,错误可能会导致任意行为,包括按照您错误地假设的方式工作。 (对于您的 Flex 版本,如果您不使用,就会发生这种情况yymore, 例如。)

您需要确保收到 EOF 后不会重新进入扫描仪循环。例如,您可以返回一个错误代码,指示无法读取更多令牌(如果需要,与可重新启动的错误指示相反)。或者您可以为词法分析器设置一个标志,使其在不可恢复的错误。

这是第二种策略的示例(只是规则,因为没有其他变化):

%%
              /* indented code before the first pattern is inserted
               * at the beginning of yylex, allowing declaration of 
               * variables. The fatal_error flag is declared static,
               * since this is not a reentrable lexer. If it were 
               * reentrable, we'd put the flag in the lexer context
               * (as part of the "extra data"), which would be a lot cleaner.
               */
              static int fatal_error = 0;
              /* If the error we last returned was fatal, we do
               * not re-enter the scanner loop; we just return EOF
               */
              if (fatal_error) {
                  fatal_error = 0; /* reset the flag for reuse */
                  return 0;
              }

\"            {BEGIN(str); yymore();}
<str>\"       {BEGIN(INITIAL); text=yytext; return STRING;}
<str>.        {yymore();}
<str><<EOF>>  {BEGIN(INITIAL);
               fatal_error = 1; /* Set the fatal error flag */
               return ERROR;}

%%

另一种可能的解决方案是使用“推送解析器”,其中yylex使用每个标记调用解析器,而不是相反。bison支持这种风格,而且往往方便很多;特别是,它允许一个操作向解析器发送多个标记,在这种情况下,这将消除对静态本地标志的需要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我使用 yymore() 时,在 EOF 处出现 Flex 错误“缓冲区末尾丢失” 的相关文章

随机推荐

  • YII 使用 gzip 压缩应用程序输出

    下面的代码有两个事件 有什么好处 它实际上在做什么 require once yii app Yii createWebApplication config Yii app gt onBeginRequest function event
  • Gradle 在 Android Studio 中应用插件(导航栏的 safeargs)

    我正在尝试学习 Android studio 并遵循官方教程 但在有关 Gradle 的部分遇到了障碍 因为该指南似乎已经过时了 指南是here https developer android com codelabs build your
  • 寻找 Dagger 辅助注射的示例

    From 匕首讨论 https groups google com forum topic dagger discuss QgnvmZ dH9c 我有一个类 它从对象图中获取一些依赖项 并在运行时从调用者获取其他依赖项 public cla
  • 如何使用手写笔在 HTML5 画布上绘图

    我使用 onmousedown onmousemove 和 onmouseup 事件在 HTML5 画布对象上使用 JavaScript 进行绘制 一切正常 现在我想用手写笔替换鼠标 Wacom Intuos Pro 因此我用 onpoin
  • 如何检查 Node.js 中是否设置了环境变量?

    我想检查我的环境变量是否设置快递JS https www npmjs com package express服务器并根据是否设置执行不同的操作 我试过这个 if process env MYKEY undefined console log
  • 显示选定的文件而不回发

    我有一个
  • 应用程序启动计数

    我正在开发一个应用程序 其中用户打开该应用程序 5 次后 在第 6 次尝试时 该应用程序应该询问用户的反馈 我尝试使用活动OnStart OnResume 但它不起作用 因为即使在离开并重新进入活动之后 这些方法也会被调用 另外 根据 An
  • 使用 VBA 设置 Sharepoint 标签/属性

    是否可以使用 VBA 设置 Sharepoint 文档 特别是 Excel 的标签 目前我知道处理此问题的唯一方法是将文件保存到 Sharepoint 在出现提示时设置标签 然后再次下载该文件并将其用作模板 然而 我需要使用这些标签的几种不
  • 如何裁剪图像的任意选定区域并将其保存到服务器?

    我用一张图来总结一下这个场景 我正在尝试在我的网站中创建一个设置个人资料图片的功能 我想要一个页面在图像字段中以原始尺寸显示上传的图像 但个人资料图片的大小应该是 200 153 所以我想要用户可以调整图片大小 也可以将一个框架 框架大小为
  • Asp.Net Web 服务:我想返回错误 403 禁止

    我有一个用 c asp net 编程的网络服务 WebService Namespace http example com WebServiceBinding ConformsTo WsiProfiles BasicProfile1 1 S
  • 如何在 Windows 7 中模拟内存不足的情况

    我有一个用 C 编写的应用程序 运行良好 但有时在现场会出现错误 我们认为这些错误是由于内存不足或与垃圾收集器的交互造成的 如果有人感兴趣 这里有描述 无法将 NHibernate Impl ExpandedQueryExpression
  • 字符集和排序规则到底是什么意思?

    我可以阅读MySQL文档而且非常清楚 但是 如何决定使用哪种字符集呢 校对对什么数据有影响 我要求解释这两者以及如何选择它们 来自 MySQLdocs http dev mysql com doc refman 5 0 en charset
  • 为什么 mmap 在 iOS 上失败?

    我正在尝试使用 mmap 在 iOS 上读取和播放音频文件 它适用于最大约 400MB 的文件 但当我尝试 500MB 文件时 出现 ENOMEM 错误 char path NSBundle mainBundle pathForResour
  • 如何在android studio中使用maven

    我想用底部栏 https github com roughike BottomBar我的项目中的库 当我添加正确的gradle命令在build gradle文件和sync 我收到此错误 Failed to resolve com rough
  • MediaStream 未处理的承诺拒绝:[object DOMError](在 Safari 11 中)

    在下面初始化 WebRTC 的方法中 我在 Safari Tech Preview 11 中遇到了未处理的承诺拒绝 具体来说 当我分配MediaStream像这样的视频元素 video srcObject event stream 堆栈跟踪
  • C++ 递归变量

    我想我的问题真的很简单 但我现在尝试解决它几个小时 但我似乎不明白 我有一个 ast 树 用 boost library 创建 并通过递归迭代它 我将所有节点保存在 NodeDescriptions 列表中 其中包含实际节点的编号 实际节点
  • 如何在 Rails 2 中正确使用 OmniAuth

    我正在尝试为我的应用程序使用 OmniAuth 0 2 6 策略 架构为 Rails 2 3 10 Rack 版本为 1 1 OmniAuth 需要此版本或更高版本 出现的问题是 Rails 无法识别我重定向到 auth provider
  • python字典应该如何存储在pytables中?

    pytables 本身不支持 python 字典 我处理它的方法是创建以下形式的数据结构 tables dict key tables StringCol itemsize 40 value tables Int32Col 请注意 我确保键
  • 如何检测C中的ESC键?

    我写了一段代码来检测箭头键使用 getch 我也希望检测 esc 键 但我实际上不知道我应该使用哪些数字 因此不胜感激 include
  • 当我使用 yymore() 时,在 EOF 处出现 Flex 错误“缓冲区末尾丢失”

    我正在编写一个 Flex 程序来处理字符串常量 当输入文件在字符串中遇到 EOF 时 我想返回一个 ERROR 标记 文件遇到 EOF 并打印 ERROR 后出现以下错误 致命的 Flex 扫描仪内部错误 缓冲区末尾丢失 这是我的代码 可以