我正在参加编译器课程,我正在重新介绍这篇文章。这是编译器过程如何工作的一般概述。
然而,我有点困惑。在我的课程中,它指出:“此外,词法分析器通常会访问符号表以存储/获取有关某些源语言概念的信息”。因此,这让我相信词法分析器实际上会构建一个符号表。我看到它的方式是他创建令牌并将最小值存储在一个表中并说明它是什么类型的符号。例如,像“x - > VARIABLE”。
然后再次,当阅读谷歌点击时,我似乎只能找到关于解析器生成此事实的模糊信息?但解析阶段是在词法分析阶段之后。所以我有点困惑。
Symbol Table Population after parsing; Compiler building (解析器填充表的状态)
http://www.cs.dartmouth.edu/~mckeeman/cs48/mxcom/doc/Symbols.html 说“符号表是通过走语法树构建的。”语法树是由解析器生成的,对吧? (解析树)。那么在解析器之前运行的词法分析器如何使用这个符号表?
据我所知,词法分析器无法知道变量的范围以及符号tabe中包含的其他信息。因此我理解解析器会将此信息添加到表中。但是,词法分析器确实知道一个单词是变量,声明关键字等。因此它应该能够构建一个部分(?)符号表。也许它们可能是每个构建符号表的一部分?
答案 0 :(得分:7)
我认为部分混淆源于这样一个事实:“符号表”对不同的人意味着不同的东西,并且可能在编译过程的不同阶段。
一般认为词法分析器将输入流分成标记(有时称为词汇或终端)。正如您所说,这些可以分类为不同的类型,数字,关键字,标识符,标点符号等。
词法分析器可以将识别的标识符标记存储在符号表中,但由于词法分析器通常不知道标识符代表什么,并且因为相同的标识符可能在不同的编译范围中意味着不同的东西,所以它通常是解析器 - 它具有更多的上下文知识 - 负责构建符号表。然而,在一些编译器设计中,词法分析器只是构建一个令牌列表,它被传递给解析器(或者解析器根据需要从输入流请求令牌),然后解析器生成一个解析树(或者有时候是一个抽象语法树)作为输出,然后通过遍历解析树,只有在为某个编译单元完成解析之后才构建符号表。
许多不同的设计都是可能的。