为什么这个野牛代码会产生意外的输出?

2023-11-24

弹性代码:

  1 %option noyywrap nodefault yylineno case-insensitive
  2 %{
  3 #include "stdio.h"
  4 #include "tp.tab.h"
  5 %}
  6 
  7 %%
  8 "{"             {return '{';}
  9 "}"             {return '}';}
 10 ";"             {return ';';}
 11 "create"        {return CREATE;}
 12 "cmd"           {return CMD;}
 13 "int"           {yylval.intval = 20;return INT;}
 14 [a-zA-Z]+       {yylval.strval = yytext;printf("id:%s\n" , yylval.strval);return ID;}
 15 [ \t\n]
 16 <<EOF>>         {return 0;}
 17 .               {printf("mistery char\n");}
 18 

野牛代码:

  1 %{
  2 #include "stdlib.h"
  3 #include "stdio.h"
  4 #include "stdarg.h"
  5 void yyerror(char *s, ...);
  6 #define YYDEBUG 1
  7 int yydebug = 1;
  8 %}
  9 
 10 %union{
 11     char *strval;
 12     int intval;
 13 }
 14 
 15 %token <strval> ID
 16 %token <intval> INT
 17 %token CREATE
 18 %token CMD
 19 
 20 %type <strval> col_definition
 21 %type <intval> create_type
 22 %start stmt_list
 23 
 24 %%
 25 stmt_list:stmt ';'
 26 | stmt_list stmt ';'
 27 ;
 28 
 29 stmt:create_cmd_stmt         {/*printf("create cmd\n");*/}
 30 ;
 31 
 32 create_cmd_stmt:CREATE CMD ID'{'create_col_list'}'    {printf("%s\n" , $3);}
 33 ;
 34 create_col_list:col_definition
 35 | create_col_list col_definition
 36 ;
 37 
 38 col_definition:create_type ID ';' {printf("%d , %s\n" , $1, $2);}
 39 ;
 40 
 41 create_type:INT {$$ = $1;}
 42 ;
 43 
 44 %%
 45 extern FILE *yyin;
 46 
 47 void
 48 yyerror(char *s, ...)
 49 {
 50     extern yylineno;
 51     va_list ap;
 52     va_start(ap, s);
 53     fprintf(stderr, "%d: error: ", yylineno);
 54     vfprintf(stderr, s, ap);
 55     fprintf(stderr, "\n");
 56 }
 57 
 58 int main(int argc , char *argv[])
 59 {
 60     yyin = fopen(argv[1] , "r");
 61     if(!yyin){
 62         printf("open file %s failed\n" ,argv[1]);
 63         return -1;
 64     }
 65 
 66     if(!yyparse()){
 67         printf("parse work!\n");
 68     }else{
 69         printf("parse failed!\n");
 70     }
 71 
 72     fclose(yyin);
 73     return 0;
 74 }
 75

测试输入文件:

create cmd keeplive
{
    int a;
    int b;
};

测试输出:

root@VM-Ubuntu203001:~/test/tpp# ./a.out t1.tp 
id:keeplive
id:a
20 , a;
id:b
20 , b;
keeplive
{
    int a;
    int b;
}
parse work!

我有两个问题:

1) 为什么第 38 行的操作会打印标记“;”?例如,“20,a;”和“20,b;”

2)为什么第32行的action会打印“keeplive { 整数a; 整数b; }”而不是简单地“保持活动”?


简短回答:

yylval.strval = yytext;

你不能使用yytext像那样。它指向的字符串对于词法分析器来说是私有的,并且会在 Flex 操作完成后立即更改。你需要做类似的事情:

yylval.strval = strdup(yytext);

然后你需要确保之后释放内存。


更长的答案:

yytext实际上是指向包含输入的缓冲区的指针。为了使 yytext 像 NUL 终止的字符串一样工作,flex框架用一个覆盖令牌后面的字符NUL在执行操作之前,然后在操作终止时替换原始字符。所以strdup在操作内部可以正常工作,但在操作外部(在您的野牛代码中),您现在有一个指向以令牌开头的缓冲区部分的指针。后来情况变得更糟,因为flex会将源的下一部分读入同一缓冲区,现在您的指针指向随机垃圾。有几种可能的情况,具体取决于flex选项,但没有一个是漂亮的。

所以黄金法则:yytext仅在动作结束前有效。如果您想保留它,请复制它,然后确保在不再需要它时释放该副本的存储空间。

在我编写的几乎所有词法分析器中,ID 令牌实际上在符号表中查找标识符(或将其放在那里),并将指针返回到符号表中,这简化了内存管理。但本质上仍然存在相同的内存管理问题,例如字符串文字。

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

为什么这个野牛代码会产生意外的输出? 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 为什么在向量循环中使用“!=”比使用“<”更好?(C++)

    为什么在向量循环中使用 比使用 因为您正在使用迭代器 并且它会使循环看起来与其他容器完全相同 所以您是否应该选择切换到其他容器类型 例如 set list unordered set 等 其中
  • 用递归解决动态嵌套for循环

    我试图得到如下所示的结果 Miniors Boys 54kg 62kg其中每个值均由管道 分隔来自包含某种 限制类型 的数组 例如 ageGroups genders weightClasses 如上所示 我现在能够得到这个结果的方法是 如
  • Java 9中如何让自动模块找到自己的资源?

    我试图让我的应用程序与 Java 9 一起运行 但不幸的是 当它尝试使用以下命令加载资源时 它是普通的 jar 依赖项之一 classLoader getResource name 得到一个空值 当然 这在 Java 8 中是有效的 我使用
  • 如何在 lesscss 中进行主题化

    当我处于开发应用程序的预生产周期时 我经常改变视觉效果 以便与客户验证的内容保持一致 保留同一页面的一些视觉效果 称为主题 会很有趣 以便我可以将它们快速呈现给客户 我发现的方法是创建一个放在主体上的外观类 通过更改它 我可以相应地更改页面
  • 本地主机上的 Laravel - 无法与主机 smtp.gmail.com 建立连接 [连接超时 #110]

    我正在尝试使用 Mailgun driver gt env MAIL DRIVER mailgun host gt env MAIL HOST smtp mailgun org port gt env MAIL PORT 587 MAILG
  • Linq (EntityFramework) 中的正则表达式、数据库中的字符串处理

    我的表中有一个列 其中包含以下值 FilterA 123 234 34 FilterB 12 23 FilterC FilterD 45 过滤器由 分隔每个过滤器的值由 分隔 过滤器的名称和值之间有一个 现在 我可以做任何只能取出值部分的事
  • 斑点跟踪算法

    我正在尝试使用 OpenCV 创建简单的斑点跟踪 我已经使用 findcontours 检测到了斑点 我想给这些斑点一个恒定的 ID 我收集了前一帧和当前帧中的斑点列表 然后我计算了前一帧和当前帧中每个斑点之间的距离 我想知道还需要什么来跟
  • Airflow:如何在非PythonOperator中使用xcom_push和xcom_pull

    我看到很多关于如何使用的例子xcom push and xcom pull与 Airflow 中的 PythonOperators 一起使用 我需要去做xcom pull from a 非Python运算符类 但找不到如何做 任何指针或示例
  • Node.js / npm - 无论如何判断一个包是否是纯 JS?

    我注意到 在尝试使用 npm 安装看似简单的节点包时 例如nerve 一个 微框架 我经常遇到某种形式的依赖痛苦 经过一番挖掘 我勇敢地找到了问题所在bcrypt模块 显然是用 C C 编写的 必须在包管理器下载后进行编译 不幸的是 如果您
  • OAuth 2 中的访问令牌撤销实现

    我使用 OWIN OAuth 2 来实现我的授权服务器提供程序 现在 我想实现令牌撤销 当我的客户端应用程序想要注销时 任何人都可以帮助我并告诉我如何在 OWIN KATANA OAuth 2 中实现令牌撤销 是否有一些好的做法 OAuth
  • 使用 JSCH 设置目录权限 CHMOD

    在Unix中 如何使用JSCH设置目录权限 我想做 drwxrwxrwx Filezilla 说该整数是 775 但 JSCH 未正确设置权限 JSCH 设置权限后 Filezilla 说是 407 这对我有用 sftp chmod Int
  • 函数式语言:现实生活中的例子

    函数式语言可以解决日常业务问题吗 是否有使用函数式语言 最好是发布的测试用例 实施的成功项目 上面列出的有不少现实世界中的函数式编程 从网站 真实世界的主要标准是该程序主要是为了执行某些任务而编写的 而不是主要为了尝试函数式编程
  • 如何实现 MPVolumeView?

    我希望用户能够使用滑块更改系统音量 并且我意识到实现此目的的唯一方法是使用 MPVolumeView 但我找不到它的任何示例代码 并且我尝试实现的每个方法都不会显示 那么实现 MPVolumeView 最简单 正确的工作方法是什么 将其作为
  • 如何以编程方式在四开本中生成选项卡集面板?

    我在下面提供了一个可重复的小示例 我想在四开中为命名列表中的每个 ggplot 对象生成选项卡plots 下面的四开文档将在其自己的二级标题中呈现图形 但不会按预期呈现在选项卡中 title Untitled format html r l
  • 修改innerHTML后保存/恢复内容可编辑的选择

    我知道在 contentEditable 中获取 设置光标位置几乎是不可能的 我不在乎知道这些信息 我需要能够保存当前选择 修改 div 的innerHTML 然后恢复选择 我一直在尝试提供的答案contenteditable 选定的文本保
  • Windows 10 TTS 语音未显示?

    我安装了一些英语语言包 美国 英国和加拿大 及其语音选项 我可以在 Windows 10 设置 gt 语音中访问它们 但它们不会显示在控制面板提供的文本到语音选项中 我无法通过应用程序使用声音 我可以使用默认声音 David 和 Zira
  • 以此比例因子查询耗尽的资源

    我在 Amazon Athena 上运行 SQL 查询 我多次收到以下错误 以此比例因子查询耗尽的资源 此查询针对 test1 数据库运行 除非查询限定 请在我们的论坛上发布错误消息或联系客户支持并提供查询 ID 如果没有看到查询 很难确定
  • 尝试使用 XPages 将多值字段连接到 Java Bean 时出现类型不匹配

    我有这个代码
  • php 中的新限制:每个 POST 1000 个字段。有人知道这个数字是否会受到影响吗?

    在较新的 PHP 版本中 每个公式 POST 的输入字段数将限制为 1000 未经验证的信息 看来这个限制已经安装在 5 2 的某些版本中 这给我们的网上商店带来了很多问题 有人了解更多吗 这个限制是否会受到参数或变量的影响 我刚刚找到了
  • 为什么这个野牛代码会产生意外的输出?

    弹性代码 1 option noyywrap nodefault yylineno case insensitive 2 3 include stdio h 4 include tp tab h 5 6 7 8 return 9 retur