Flex 和 Bison 彼此需要什么?

2024-03-26

当 Flex 和 Bison 一起使用时,

  • 为什么 Flex 文件需要#includebison 创建的 C 头文件?

  • 编译需要 bison 和 flex 创建的 C 源文件。 bison 和 flex 创建的 C 源文件相互需要什么?


bison 生成的标头中最重要的是用于标识标记类型的枚举值(这些值是通过词法操作返回到解析器的值)。

标头还声明了YYSTYPE语义类型和变量yylval(具有该类型),用于将每个标记的语义值传达给解析器。 (至少,对于具有语义值的标记而言。)类似地,如果解析器使用位置信息,则标头定义YYLTYPE位置类型和变量yylloc那种类型的。

由于标头依赖关系不能是循环的,因此解析器对扫描器没有任何标头依赖关系。正是由于这个原因,您的 bison 输入文件必须包含以下声明yylex.

这对于解析器和扫描器之间的经典接口来说很好,它们使用全局变量进行通信。它也或多或少地与可重入(“纯”)解析器一起工作,其中语义值(和位置,如果使用)通过参数传递给yylex,尽管事实上声明yylex不是自动的更烦人。

当扫描仪也可重入时,它就会开始崩溃。在这种情况下,解析器必须使用类型不透明的扫描器上下文对象调用扫描器yyscan_t. yyscan_t“属于”扫描仪,因此只能在扫描仪的标头中定义。但如上所述,这将导致循环依赖链。这揭示了传统模型的弱点:解析器是扫描器的客户端,因此扫描器依赖解析器来定义基本数据结构的事实是依赖倒置。

这是一个非常现实的问题,因为可重入扫描器的公共接口包含其原型需要解析器特定数据类型的函数(YYSTYPE and YYLTYPE),而解析器原型几乎肯定需要接受扫描器上下文对象作为参数,因此如果没有扫描器特定的数据类型就无法声明它yyscan_t.

解决这个问题的通常方法是通过注意到以下内容来打破封装:yyscan_t简单来说就是一个void*,因此可以在解析器中这样声明,从而避免解析器需要#include扫描仪标头(只要它不需要访问该标头中声明的任何其他公共方法)。

在我看来,一个不太难看的解决方案是完全避免这种特定的配置。 Bison 允许您请求可重入的“推送解析器”,并且可以与可重入扫描器一起使用,而不会出现上述任何复杂情况。

在推送解析器模型中,扫描器是解析文件时调用的顶级函数,扫描器每次识别令牌时都会调用解析器。标头依赖关系不再是循环的,因为解析器不需要了解有关扫描仪上下文对象的任何信息,也不需要了解有关扫描仪原型的任何信息。yylex()。扫描器现在是解析器的客户端,因此对解析器具有自然的标头依赖性,因此解析器定义令牌枚举以及语义和位置数据类型的事实不再是例外。

除了简化两个组件之间的标头依赖性之外,推送解析器通常还简化扫描器本身内部的控制流。在许多用例中,单个扫描仪模式将导致识别多个令牌。在传统模型中,扫描器必须保留一个令牌队列,并在解析器调用时一次释放一个令牌。但在推送模型中,扫描器操作可以简单地多次调用解析器,每个识别的标记一次。该模型由 Lemon 解析器生成器(sqlite3 的一部分)普及,随后由包括 bison 在内的其他解析器生成器实现。

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

Flex 和 Bison 彼此需要什么? 的相关文章

随机推荐

  • 取决于特定项目的公共单元中的条件编译?

    在Delphi XE2中 我有一个单元MyUnit pas由两个不同的项目使用ProjectA and ProjectB MyUnit包含一个声明DoSomething 这是在其他单位实施的程序其他单位 pas 现在我想用条件编译包括DoS
  • vb6中动态两级或多级子菜单生成

    朋友们 告诉我怎么做生成1级以上的子菜单在VB6中运行时 简单解释一下 有什么具体的控制措施吗 但我不想使用外部控件 您可以使用API 函数创建多级子菜单 Private Declare Function CreatePopupMenu L
  • 将 jQuery 插件转换为 TypeScript

    好的 首先这是我非常基本的 jQuery 插件 function fn greenify function options var settings extend These are the defaults color 556b2f ba
  • Selenium WebDriver 测试失败并出现 System.Net.WebException 无法连接

    我正在开发一套 Selenium WebDriver 不是 Selenium RC 也不使用 Selenium Server 测试 这些测试是通过命令行调用 MSTest 来执行的 我已将它们分解为我们计划测试的每个浏览器 目前是 Chro
  • Docker-Compose、NGINX 和热重载配置

    我有一个通过 docker compose 运行的功能全栈应用程序 奇迹般有效 唯一的问题是团队必须重建整个应用程序以反映更改 这意味着把整个事情搞砸docker compose down 我正在寻求帮助来更新下面的文件以允许热重载 OR
  • 是否可以将多个参数传递给 Ember Power Select 中的 onChange 操作?

    我目前正在使用优秀的ember 电源 选择 https ember power select com作为一部分添加ember bootstrap 形式 https www ember bootstrap com api classes Co
  • 将另一个 data.frame 中的一行添加到 qplot

    是否可以在现有绘图中添加一条线 例如附加时间序列 我知道如何添加水平或垂直线 但如何从其他 data frames 添加 q myplot lt qplot datefield myvalue data mydf geom c line c
  • 如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

    我是 Qt 新手 每天都在学习新东西 目前 我正在利用空闲时间为我的诺基亚 N900 开发一个小型应用程序 一切都很好 我可以在设备上编译和运行 Maemo 应用程序 我刚刚了解到foreachQt 中的关键字 我知道它不在 C 中 所以我
  • cakephp 验证和正则表达式

    我正在 cakephp1 3 工作 我必须使用 model i 中的 cakephp 验证来验证我的表单 我添加了一个正则表达式来限制特殊字符输入 我的代码写如下 var validate array name gt array uniqu
  • Android 模拟器出现蓝屏死机

    无论我从 Android SDK 和 AVD Manager 创建哪种类型的 Android 虚拟设备 每当我启动它时 我的整个笔记本电脑都会在出现蓝屏死机后关闭 我在事件系统日志中看到此错误 驱动程序 VPCAppSv sys 已被阻止加
  • 如何增加 jQuery 变量?

    我正在尝试使用 jquery 浏览图片库 因此我有一个按钮 该按钮应该将变量加 1 然后使用它来加载下一张图片 使用最上面的答案this https stackoverflow com questions 11338499 incremen
  • 学说、命名空间和自动加载实体

    我想在我的项目中使用 Doctrine 2 我有一些问题 我阅读了文档 但可能我做错了什么 我想自动加载实体类 并且文档中的方法不起作用 我的 bootstrap php
  • Java继承与抽象方法

    我有很多 形式 类 所有这些都扩展了Form 我有一个名为的抽象类FormService以及扩展此类的特定表单服务 我想做的是有一个名为的抽象方法populate 它采用一种类型形式 从而通过继承为给定类型调用正确的服务 所以我有类似的东西
  • 从文档和 jekyll 源文件夹配置提供服务的 GitHub 页面

    标准 F 遵循 ProjectScaffold 的文档具有以下结构 project docs content files output tools 生成的文档保存到output 然后被推送到gh pages branch 最近 GitHub
  • 使用 PerformanceCounters 来定位特定驱动器

    伙计们 我有以下代码 using System Diagnostics private PerformanceCounter diskRead new PerformanceCounter private PerformanceCounte
  • 具有 NA 值的数据框两列的总和

    我有一个包含一些 NA 值的数据框 我需要两列的总和 如果一个值为 NA 我需要将其视为零 a b c d 1 2 3 4 5 NA 7 8 e 列应该是 b 和 c 的总和 e 5 7 我尝试了很多事情 并进行了两打搜索 但没有运气 这似
  • InnoDB MySQL 5.5 中的 TEXT 与 VARCHAR。何时使用每一项

    MySQL 5 5 的 InnoDB 存储引擎中 text 和 varchar 的主要区别是什么 如果我们谈论不超过 5000 个字符的变量文本字段 是否使用 text 或 varchar 5000 根据论坛帖子innodb com 从 I
  • 在 vb.net 中生成随机字符串

    我需要在 vb net 中生成随机字符串 该字符串必须由 随机选择的 字母 A Z 必须大写 和散布的随机数字组成 它还需要能够生成具有设定长度的它们 感谢您的帮助 这让我发疯 如果你可以将其转换为 VB NET 这很简单 我想说你就可以了
  • 在 WiX 中重新启动后继续安装

    我正在尝试使用 WixStandardBootstrapperApplication 创建引导应用程序 除了处理重启之外 它可以很好地完成我需要它做的所有事情 我需要安装一组EXE文件 只有第一个是 NET 4 5 需要重新启动 我会延迟重
  • Flex 和 Bison 彼此需要什么?

    当 Flex 和 Bison 一起使用时 为什么 Flex 文件需要 includebison 创建的 C 头文件 编译需要 bison 和 flex 创建的 C 源文件 bison 和 flex 创建的 C 源文件相互需要什么 bison