gpt4 book ai didi

yacc - lex 和 yacc(符号表生成)

转载 作者:行者123 更新时间:2023-12-02 07:31:26 28 4
gpt4 key购买 nike

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

我可以简单描述一下 y.output 文件,该文件是通过向 yacc 提供 -v 选项生成的。我尝试研究它,但没有得到太多信息。

我可以知道除了编译器设计之外还使用 lex 和 yacc 的其他应用程序吗?

最佳答案

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

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

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

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

符号表是编译器编写者为自己创建的数据结构。 lex 或 yacc 没有任何功能可以为您完成此操作。当您编写的任何代码创建它时,它就会生成!

y.output 文件与符号表无关。它记录了 yacc 如何将上下文无关语法转换为解析表。当您的语法不明确并且想知道在调试语法时哪些规则导致移位/归约或归约/归约错误时,它非常有用。

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

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com