我是lex和yacc以及编译器设计的新手。 我想知道在哪个阶段(词法,句法或任何其他阶段)以及如何生成符号表?
我是否可以简要介绍y.output文件,该文件是通过给yacc提供-v选项生成的。我试图查看它但没有得到太多信息。
除了编译器设计之外,我能否知道使用lex和yacc的其他应用程序。
答案 0 :(得分:5)
符号表是一种全局数据结构,可用于编译器的所有阶段/阶段/过程。这意味着可以从lex和yacc生成的组件中使用/访问它。
当它找到一个将存储在表中的标记(例如标识符)时,从词法分析器访问符号表条目是常规的,它可以找到条目并使用仅对词法分析器可用的信息更新它行号和字符位置,如果它不存在,它也可以存储lexeme值。现在可以在令牌的lval
中返回符号表指针。
有些人喜欢从词法分析器向解析器返回一个指向lexeme本身的指针(如lval
),并在那里进行初始符号表访问。这具有以下优点:符号表不必对词法分析器可见,但是具有如下缺点:如上所述的词法分析器信息可能不再可用于与符号一起存储。它常常有一个缺点,就是让yacc的解析器操作多一点忙碌"因为他们可能会参与管理符号表和解析树。
符号表条目将在编译器的后续阶段中进一步更新,例如解析树的语义步行,其可以用类型信息注释符号条目并标记未声明的对象等。在目标代码生成期间,当可以存储或需要目标特定信息时,将再次使用符号表,并且在优化期间,当可以检查或甚至优化变量使用时,将再次使用符号表。
符号表是编译器编写器为您自己创建的数据结构。 lex或yacc没有为你做的功能。当您编写的任何代码创建它时,它就会生成!
y.output文件与符号表无关。它是yacc如何将上下文无关语法转换为解析表的记录。当你有一个模糊的语法并且想要在调试语法时知道导致shift / reduce或reduce / reduce错误的规则时,它很有用。
问题的最后一部分,这些工具有什么用途? lex是一种为状态机生成代码的工具,可识别您指定的模式。它不必用于编写编译器。一个有趣的用途是处理可由状态机处理的网络协议,例如TCP / IP数据报等。类似地,yacc用于匹配由上下文无关语法描述的序列。这些不必是程序,但可以是符号,字段或数据项的其他复杂序列。它们通常只是文本的一部分,这是该工具的正统使用。
你问题的这些部分听起来像某人可能会为那些参加过编程课程的学生写的考试问题!