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

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

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

最佳答案

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

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

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

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

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

y.output 文件与符号表无关。它记录了yacc如何将上下文无关文法转换成解析表。当您有一个不明确的语法并且想知道在调试语法时是什么规则导致 shift/reduce 或 reduce/reduce 错误时,它很有用。

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

你的问题的这些部分听起来真的像是有人可能为参加过编译器类(class)的学生写的那种考试题!

关于yacc - lex 和 yacc(符号表生成),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31262197/

10-16 03:28