在 Bison 的同一个循环中转到标签

goto label in the same loop in Bison

我正在用 Bison 和 Flex 做一个解析器,我想创建一个 "goto label" 语句,但我想检查标签是否存在于同一代码块中(括号 {} 之间,循环,等)。

是否有检查此类内容的功能?

您的问题暗示您在构建语言 translators/compilers 时缺少一些背景上下文,因此也许一个小教程可以帮助您解决问题。希望大家不要介意。

计算机语言的处理通常分为一系列步骤(有时称为阶段或阶段)。每个步骤处理整个任务的一个组成部分,每个步骤都使后面的步骤更容易实现。

步骤为:

  1. 词法分析
  2. 语法分析(也称为解析)
  3. 语义分析
  4. 中级代码代码生成
  5. 优化
  6. 代码Generation/Emission

在执行所有这些步骤的同时,通常会维护一个全局数据结构,称为 符号 Table。符号 table 的目的是跟踪正在编译的程序中使用的名称以及所有这些符号的属性。 goto 中的标签就是这样一个符号,它会被记录在符号 table.

第一步,词法分析,是在将不同的词素转换为语言标记时发现符号的地方。并非词法分析器找到的所有词素都会导致条目进入符号 table。语言中的关键字、评论等通常没有符号 table 条目。标识符,例如 goto 中的标签,将导致在符号 table 中进行输入。第一次遇到这样的标识符时,将创建一个新的 table 条目;可能会在遇到它的那一行做个注释。随后出现的标识符不会导致生成新的 table 条目,但信息可能会更新。

在词法阶段不会产生关于标签排序的错误,因为标签引用可以向前或向后:

goto forward;
...
back:
...
forward: goto back;

标签标识符的第一次或第二次出现都不会表示该标签未定义。

在语法分析中我们也会遇到类似的问题。语法规则将确定何时遇到有效的标签定义以及何时找到有效的 goto 语句。然而,仍然没有足够的信息来确定所使用的标签是否有效。当涉及标签的范围时,尤其如此。范围信息是在解析完成后必须通过查询符号 table 来解决的信息。解析器所能做的就是记录有效的解析,通常以解析树的形式。

这是语义分析阶段,它在具有所有可用信息的解析树上运行,以确定哪些 goto 标签有效,哪些无效。它通过向符号 table 添加更多信息来实现这一点,例如作用域、记录哪些标签已声明以及在何处声明。然后可以查看哪些 goto 引用未定义的标签并发出适当的消息。

flex/bison(或lex/yacc)工具集常用形式为compiler-compiler。用于将编译器规范构建到编译器中的工具。还有很多其他可供选择。

flex/bison 工具不包含符号 table(或解析树)的包,使用这些工具的程序员必须自己实现。一旦您实现了自己的符号 table 数据结构并提供了用于确定存储在其中的符号的属性的函数,就可以查询 goto 标签是否未定义。

所以,综上所述,答案是否定的;没有内置的方法来做你想做的事情,因为它超出了你正在使用的工具的范围.


这个例子在 Algol 60 中。
这是@rici说的.