lex和yacc(符号table代)

lex and yacc (symbol table generation)

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

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

除了编译器设计,我能知道使用 lex 和 yacc 的其他应用程序吗?

一个符号table是一个全局数据结构,可以在一个编译器的所有stages/phases/passes中使用。这意味着它可以是来自 lex 和 yacc 生成的组件的 used/accessed。

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

有些人更喜欢 return 从词法分析器到解析器的指向词素本身(如 lval)的指针,并在那里进行初始符号 table 访问。这有一个优点,即符号 table 不必对词法分析器可见,但缺点是如上所述的词法分析器信息可能不再可用于与符号一起存储。它通常有一个缺点,就是使来自 yacc 的解析器操作多一点 "busy",因为它们可能涉及管理符号 table 以及解析树。

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

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

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

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

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