我对编译器设计中的 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(使用前将#替换为@)