4

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

我可以简要介绍一下通过给 yacc 提供 -v 选项生成的 y.output 文件吗?我试图调查它,但没有得到太多信息。

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

4

1 回答 1

6

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

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

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

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

符号表是编译器编写者为自己创建的数据结构。没有 lex 或 yacc 的功能可以为您做这件事。它是在您编写的任何代码创建它时生成的!

y.output 文件与符号表无关。它记录了 yacc 如何将上下文无关文法转换为解析表。当您有一个模棱两可的语法并想知道在调试语法时哪些规则导致移位/减少或减少/减少错误时,它很有用。

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

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

于 2015-07-07T18:55:56.250 回答