lex 和 yacc(符号表生成)

2023-12-07

我对编译器设计中的 lex 和 yacc 很陌生。 我想知道符号表是在哪个阶段(词汇、句法或任何其他阶段)以及如何生成的?

我可以简要描述一下 y.output 文件,该文件是通过向 yacc 提供 -v 选项生成的。我试图研究它,但没有得到太多信息。

我能否知道除了编译器设计之外还使用 lex 和 yacc 的其他应用程序。


符号表是一种全局数据结构,可以在编译器的所有阶段/阶段/遍中使用。这意味着它可以从 lex 和 yacc 生成的组件使用/访问。

当词法分析器找到将存储在表中的标记(例如标识符)时,通常会从词法分析器访问符号表条目,它可以找到该条目并使用仅对词法分析器可用的信息(如行号和行号)更新它。字符位置,如果词位值尚不存在,它还可以存储词位值。符号表指针现在可以在lval令牌的。

有些人更喜欢返回指向词素本身的指针(如lval)从词法分析器到解析器并在那里进行初始符号表访问。这样做的优点是符号表不必对词法分析器可见,但缺点是如上所述的词法分析器信息可能不再可用于与符号一起存储。它通常具有使 yacc 的解析器操作更加“忙碌”的缺点,因为它们随后可能涉及管理符号表和解析树。

符号表条目将在编译器的后期阶段进一步更新,例如解析树的语义行走,可以用类型信息注释符号条目并标记未声明的对象等。当目标特定信息可能被存储或需要时,符号表将在目标代码生成期间再次使用,并且在优化期间当变量使用可能被检查甚至优化掉时再次使用。

符号表是您可以使用的数据结构编译器编写者为自己创造。 lex 或 yacc 没有任何功能可以为您完成此操作。当您编写的任何代码创建它时,它就会生成!

y.output 文件与符号表无关。它记录了 yacc 如何将上下文无关语法转换为解析表。当您的语法不明确并且想知道在调试语法时哪些规则导致移位/归约或归约/归约错误时,它非常有用。

问题的最后一部分,这些工具有什么用途? lex 是一个为状态机生成代码的工具,该状态机可识别您指定的模式。它不必在编写编译器时使用。一个有趣的用途是处理可由状态机处理的网络协议,例如 TCP/IP 数据报等。类似地,yacc 用于匹配由上下文无关语法描述的序列。这些不一定是程序,也可以是其他复杂的符号、字段或数据项序列。它们通常只是文本片段,这是该工具的正统用法。

你问题的这些部分听起来确实像是有人可能为参加过编译器课程的学生写的考试题!

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

lex 和 yacc(符号表生成) 的相关文章

  • Lex和Yacc应用方法(一).初识Lex

    Lex和Yacc应用方法 一 初识Lex 草木瓜 20070301 Lex Lexical Analyzar 词法分析生成器 Yacc Yet Another Compiler Compiler编译器代码生成器 是Unix下十分重要的词法分
  • 如何在 Flex/bison 中实现 If 语句

    我没有收到错误消息 请您帮帮我 这是 l 和 y 文件 谢谢 include ifanw tab h extern int yylval return EQ return NE lt return LT lt return LE gt re
  • Ply Lex 解析问题

    我使用 ply 作为我的 lex 解析器 我的规格如下 t WHILE r while t THEN r then t ID r a zA Z a zA Z0 9 t NUMBER r d t LESSEQUAL r lt t ASSIGN
  • 无法编译 lex 的输出

    当我尝试编译这个简单的 lex 程序的输出时 lex l integer printf found keyword INT using gcc lex yy c I get Undefined symbols yywrap referenc
  • 线程安全/可重入 bison + flex

    与任何解释相比 我真的更喜欢一个工作示例 到目前为止 我在 Bison 文档网站上读到的内容与 Flex 所说的内容相矛盾 一说要申报yylex as int yylex yyscan t yyscanner 另一位希望它是 int yyl
  • 符号解析和动态链接

    我一直在阅读有关重定位和符号解析过程的内容 并且对此有一些疑问 所以整个过程 加载执行程序 开始于exec BA OS 命令 期间exec BA OS 系统从PT INTERP分段并从解释器文件的分段创建初始过程映像 也就是说 系统不使用原
  • yyerror 的 Bison 冲突类型

    我试图用 flex 和 bison 制作一个计算器 但在编译过程中发现了一个错误 这是错误 C GnuWin32 src gt gcc lex yy c y tab c o tugas tugas y 51 error conflictin
  • 野牛转移而不是减少。减少/减少错误

    用我的语言我可以写 a 1 b 2 if true else if true Here is the problem else 我的语法不支持语句之间的换行符 else 只能与 if 一起使用 当我在规则中添加可选NL时 IfExpr IF
  • Java 的 Yacc 等效项

    我正在开发一个 Java 编译器设计项目 词法分析已经完成 使用 jflex 我想知道哪种类似 yacc 的工具最适合进行语法分析 最有效 最容易使用等 以及原因 如果你特别想要类似 YACC 的行为 表驱动 我知道的唯一一个是CUP ht
  • 使用 flex 将 Python 多行字符串与转义字符匹配

    我想知道如何将 python 多行注释与 flex 相匹配 我遇到了一些麻烦 以下工作正常Regexr https regexr com 但不被flex识别 我不知道如何修复它 1 2 以前 我使用过 3 0 2 3 它可以检测以下评论 A
  • 安装 Bison 后出现“make: yacc: Command not found”

    在 gcc 4 1 2 linux 5 中运行 makefile 时 出现以下错误 make yacc Command not found 通过谷歌搜索 我了解到可以通过安装 Bison GNU 解析器生成器来纠正此错误 但即使安装了 Bi
  • YACC 中的错误处理

    你好 我正在尝试制作一个简单的解析器并使用 lex 和 yacc 问题是我想打印我自己的错误消息而不是erroryacc 使用的打印符号syntax error 例如这是我的 yacc 代码 include
  • y.tab.c:对 yylex 的未定义引用

    我正在尝试运行我在网上找到的计算器示例 但每次运行 gcc 命令时都会显示此错误 以下是我运行的命令 flex l calc3 l yacc vd calc3 y gcc y tab c lm ll gt 此时我收到此错误消息 tmp cc
  • 重用语义分析阶段的符号表来生成代码

    我目前正在为一种具有全局变量和嵌套子例程功能的语言构建编译器 以前 我只为只有局部变量而没有嵌套子例程的语言构建过编译器 我有一个关于如何重用在代码生成阶段的语义分析阶段填充的符号表的问题 我将符号表作为链表堆栈 其中每个链表代表在特定范围
  • 如何使 YY_INPUT 指向字符串而不是 Lex & Yacc (Solaris) 中的标准输入

    我想要我的yylex 解析字符串而不是文件或标准输入 如何使用 Solaris 提供的 Lex 和 Yacc 来做到这一点 重新定义YY INPUT 这是一个工作示例 使用命令编译并运行 yacc d parser y lex lexer
  • 开发类似 python 的小型语言时的缩进控制

    我正在使用 flex byacc 用于词法和解析 和 C 开发一种类似 python 的小型语言 但我有一些关于范围控制的问题 就像 python 一样 它使用空格 或制表符 进行缩进 不仅如此 我还想实现索引中断 例如 如果您在另一个 w
  • Yacc/Bison:伪变量($$、$1、$2、..)以及如何使用 printf 打印它们

    我有一个用 flex 编写的词法分析器 它将标记传递给用 bison 编写的解析器 以下是我的词法分析器的一小部分 ID a z a z0 9 rule printf A rule s n yytext return RULE ID pri
  • 对“yylex()”的未定义引用

    我正在尝试使用 flex 和 bison 创建一种简单的脚本语言 现在 我只是想让计算器工作 但我无法编译它 当我运行这个 makefile 时 OBJECTS hug tab o hug yy o PROGRAM hug exe CPP
  • Flex 和 Bison 是否有 Sublime Text 语法?

    我正在 Sublime Text 中寻找一种语法 以某种方式突出显示我的 Flex 和 Bison 文件 或 lex yacc 使它们可读 Sublime Text 自动为 Flex 文件选择 Lisp 但这并不能解决问题一切都很好 有什么
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的

随机推荐

  • 如何以编程方式在 Windows 8 开始屏幕上放置磁贴?

    我正在构建一个 Windows 商店应用程序 我希望该应用程序的磁贴位于我的开始屏幕的特定位置 是否有任何 API 可以对我的图块在开始屏幕上的位置进行编码 提前致谢 不 您无法控制图块的移动位置 这由用户决定 Windows 8 环境设计
  • 如何将heroku 上回形针的上传目录更改为/tmp?

    我需要上传文件 然后使用回形针解析它们 目前它上传到 system文件夹中 这在heroku中是不允许的 我不需要持久上传 我解析它然后存储它们 所以我希望能够保存到 tmp 中然后解析 然后让它稍后被吹走 关于如何做到这一点的想法 如果我
  • 如何在R中两个单词之间的文本上进行gsub?

    EDIT 我想放置一个 n在我的文本中特定的未知单词之前 我知道这个未知词第一次出现在我的文本中将会在 树 和 湖 之间 前任 文本 text 1 TreeRULakeSunWater 2 A B C D EDIT 树 和 湖 永远不会改变
  • 地图不适用于加载的 Obj

    这是我之前的问题的延续here 我只是尝试向该对象的每一侧应用不同的纹理 但什么也没有出现 没有控制台错误 我相信我正在按正确的顺序应用事物 这应该很简单 但过去一个小时我一直在努力解决这个问题 下面是一个代码示例 function onL
  • Google Apps - 使用昵称发送电子邮件

    我在 google apps u 中有一个电子邮件帐户 电子邮件受保护 它有一个昵称 电子邮件受保护 我可以从 发送电子邮件吗 电子邮件受保护 多谢 确实 Google Apps 支持从您拥有的任何电子邮件地址 包括昵称 发送邮件 登录您的
  • 了解多重索引

    所以我在 csv 中有一个这样的示例数据集 name team date score John A 3 9 12 100 John B 3 9 12 99 Jane B 4 9 12 102 Peter A 9 9 12 103 Josie
  • 如何使用 Ember Data 查找模型?

    相当于什么 App Person find age 30 in the 新的 Ember 数据 IE 如何根据属性获取记录数组 ember data 1 0 0 beta2 中的等效方法现在是 this store find person
  • Java 中的 Context 到底是什么? [复制]

    这个问题在这里已经有答案了 我用 Google 搜索了这个并阅读了 Java 文档 但我有点困惑 有人可以解释一下什么是Context是简单的英语吗 用编程术语来说 它是较大的周围部分 可以具有any对当前工作单元的行为的影响 例如 使用的
  • 不处理条件渲染组件中的表单提交

    我有一个带有表单的自定义标记文件
  • 如何解码gzip数据?

    我有一个变量data 变量的类型为 TIdBytes 变量包含一些用 gzip 编码的数据 如何解码这些数据 如果您想手动解码数据 请查看DecompressGZipStream 的方法TIdCompressorZLib组件 或TDecom
  • 分子测试似乎忽略了ansible.cfg的remote_tmp设置

    我正在尝试使用molecule测试一个非常基本的角色 venv red jumphost docker ops cat roles fake role tasks main yml tasks file for fake role name
  • 在 ruby​​ 中从自身获取实例变量名称

    我有一个实例变量 foo我想写一些代码来获取字符串 foo 有什么提示吗 如果您拥有的只是对该对象的引用 那么您就无法真正干净利落地完成它 def foo bar something end def bar value value no c
  • DATA 和 IMAGE 填充在两行中。我想将它们绑定在一行中

    我要第二次问这个问题 我会把它说清楚 这样你就可以帮助我 好吧 让我们开始吧 我有一个注册流程 我把这个过程分成了两页 第一页仅用于 个人信息 然后 当我单击下一步按钮时 将出现下一页 postbackURL 此页面用于 上传照片 页面 他
  • Scrapy CLOSESPIDER_PAGECOUNT 设置无法正常工作

    我使用 scrapy 1 0 3 无法发现 CLOSESPIDER 扩展是如何工作的 对于命令 scrapy 抓取domain links set CLOSESPIDER PAGECOUNT 1 正确的是一个请求 但对于两页计数 scrap
  • javaFx 中更新 java-124 版本后如何解析 tableview 中的嵌套列?

    Exception in thread JavaFX Application Thread java lang NullPointerException at com sun javafx scene control skin Nested
  • 父类是否应该引用子类?

    早上好 我在工作中继承了一些遗留代码 它使用了一种相当不寻常的设计模式 我在论坛上找到的类似模式的唯一参考是here 情况是原始设计者有一个通用父类 不是抽象 它有一个直接引用子类的静态工厂方法 以下是这种编码风格的示例 可以在遗留代码的多
  • Google 的抓取工具可以解释 Javascript 吗?如果我通过 AJAX 加载页面怎么办? [关闭]

    Closed 这个问题是无关 目前不接受答案 当用户进入我的页面时 我必须进行另一个 AJAX 调用 以加载 div 内的数据 这就是我的应用程序的工作原理 问题是 当我查看这段代码的源代码时 它不包含该 AJAX 的源代码 当然 当我执行
  • InvalidCastException:无法将类型“System.DBNull”的对象转换为类型“System.Nullable`1[System.Int32]”[重复]

    这个问题在这里已经有答案了 我正在尝试从数据库执行存储过程 但是 我遇到了一个例外 InvalidCastException 无法将 System DBNull 类型的对象转换为 输入 System Nullable 1 System In
  • 为什么不调用复制构造函数?

    class MyClass public MyClass MyClass x 0 y 0 default constructor MyClass int X int Y x X y Y user defined constructor My
  • lex 和 yacc(符号表生成)

    我对编译器设计中的 lex 和 yacc 很陌生 我想知道符号表是在哪个阶段 词汇 句法或任何其他阶段 以及如何生成的 我可以简要描述一下 y output 文件 该文件是通过向 yacc 提供 v 选项生成的 我试图研究它 但没有得到太多