Lex和Yacc(符号表生成)

4

我是新手,想了解lex、yacc和编译器设计。请问符号表是在哪个阶段(词法、语法或其他)生成的?生成的方法是怎样的?

给yacc加上-v选项后,生成的y.output文件能否简要描述一下?我已经尝试看过它了,但信息不够详细。

除了编译器设计,您能否告诉我lex和yacc还用在哪些其他应用中?


你有阅读文档吗?你也可以使用lex/yacc来验证SQL语句,简而言之:任何具有清晰语法的语言。 - André Schild
1个回答

7
符号表是一个全局数据结构,可以在编译器的所有阶段/阶段/传递中使用。这意味着它可以从lex和yacc生成的组件中访问和使用。
通常,在词法分析器找到应存储在符号表中的标记(例如标识符)时,会从符号表中访问符号表条目并使用仅对词法分析器可用的信息(例如行号和字符位置)更新符号表条目,并在该项不存在时还可以存储词素值。现在,符号表指针可以在标记的lval中返回。
有些人更喜欢从词法分析器返回词素本身的指针(作为lval),然后在解析器中进行初始符号表访问。这具有符号表不必对词法分析器可见的优点,但缺点是上述词法分析器信息可能无法用于与符号一起存储。它通常的不利之处在于,从yacc中的解析器动作开始,它们可能涉及管理符号表以及解析树。
符号表条目将在编译器的后续阶段(如解析树的语义遍历)中进一步更新,该过程可以使用类型信息注释符号条目,并标记未声明的对象等。在目标代码生成期间再次使用符号表,可能需要存储或需要特定于目标的信息,以及在优化期间再次使用符号表,可以检查甚至优化变量的用法。
符号表是您作为编译器编写者为自己创建的数据结构。lex或yacc没有任何功能可以为您执行这项操作。它会随着您编写的任何代码而生成!
y.output文件与符号表无关。它记录了yacc如何将上下文无关语法转换为解析表。当您拥有模棱两可的语法并想要知道哪些规则正在调试语法时,它非常有用。
最后一个问题,这些工具有什么用途?lex是一种工具,用于生成识别指定模式的状态机的代码。它不必用于编写编译器。一个有趣的用途是处理可以由状态机处理的网络协议,例如TCP / IP数据包等。同样,yacc用于匹配由上下文无关语法描述的序列。它们不一定是程序,但可以是其他复杂的符号,字段或数据项的序列。它们通常只是文本片段,这是该工具的正统用途。
您的问题的这些部分确实听起来像是某人为参加编译器课程的学生编写考试题!

谢谢Brian的回答。符号表的概念已经清楚了,感谢您的时间。 - Tech Freak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接