Parsing 解析器或词法分析器是否生成符号表?

Parsing 解析器或词法分析器是否生成符号表?,parsing,compiler-construction,lexical-analysis,Parsing,Compiler Construction,Lexical Analysis,我正在上一门编译器课程,我正在重述介绍。这是关于编译器进程如何工作的概述 然而,我有点困惑 在我的课程中,它指出:“此外,词法分析器通常会访问符号表来存储/获取某些源语言概念的信息”。这让我相信lexer实际上会构建一个符号表。在我看来,他创建了令牌并将最小值存储在表中,并说明了它是什么类型的符号。比如“x->VARIABLE” 再一次,当我阅读谷歌搜索结果时,我似乎只能找到关于解析器生成这个结果的模糊信息?但是解析阶段在lexer阶段之后。所以我有点困惑 (表示解析器填充表) 表示“符号表

我正在上一门编译器课程,我正在重述介绍。这是关于编译器进程如何工作的概述

然而,我有点困惑

在我的课程中,它指出:“此外,词法分析器通常会访问符号表来存储/获取某些源语言概念的信息”。这让我相信lexer实际上会构建一个符号表。在我看来,他创建了令牌并将最小值存储在表中,并说明了它是什么类型的符号。比如“x->VARIABLE”

再一次,当我阅读谷歌搜索结果时,我似乎只能找到关于解析器生成这个结果的模糊信息?但是解析阶段在lexer阶段之后。所以我有点困惑

(表示解析器填充表)

表示“符号表是通过遍历语法树构建的。”。语法树是由解析器生成的,对吗?(解析树)。那么,在解析器使用这个符号表之前运行的lexer如何使用呢


我知道lexer不能知道变量的范围和符号表中包含的其他信息。因此,我理解解析器将把这些信息添加到表中。然而,lexer确实知道单词是否是变量、声明关键字等。因此,它应该能够构建部分(?)符号表。那么,可能是他们各自构建了符号表的一部分吗

我认为部分混淆源于“符号表”对不同的人意味着不同的东西,并且可能在编译过程的不同阶段

一般认为词法分析器将输入流拆分为令牌(有时称为词法元素或终端)。正如您所说,这些可以分为不同的类型、数字、关键字、标识符、标点符号等等

lexer可以将识别的标识符令牌存储在符号表中,但是由于lexer通常不知道标识符表示什么,并且由于相同的标识符在不同的编译范围中可能意味着不同的东西,通常是解析器(具有更多上下文知识)负责构建符号表

然而,在一些编译器设计中,lexer只是构建一个令牌列表,然后将其传递给解析器(或者解析器根据需要从输入流请求令牌),解析器反过来生成一个解析树(有时是抽象语法树)作为输出,然后,只有在某个编译单元的解析完成后,才通过遍历解析树来构建符号表

许多不同的设计是可能的