Syntactic analysis

Review of Lexical Analysis

截屏2024-12-16 12.26.26.png

Aims of syntactic analysis

The task of the syntactic analysis phase is essentially to build a parse tree

⮚with the root: the distinguished symbol, “<program>” or whatever

⮚The leaves: the sequence of tokens from the lexical analysis phase

⮚with each branch point in the tree sanctioned by a rule form the grammar

详细解读:语法分析的目标 (Aims of Syntactic Analysis)

语法分析 (Syntactic Analysis) 是编译器中非常关键的阶段,其主要任务是根据词法分析阶段生成的 Token 序列,建立一棵 解析树 (Parse Tree),以检查代码的结构是否符合上下文无关文法 (CFG) 的规则。

1. 解析树的组成

根节点 (Root):

• 解析树的根节点是 区分符号 (Distinguished Symbol),通常是文法的起始符号,比如 <program>。

示例:对于一个程序代码,根节点会对应 <program>,表示代码的最顶层结构。

叶子节点 (Leaves):

• 解析树的叶子节点是由 词法分析器 生成的 Token 序列

• 每个叶子节点代表源代码中的一个词法单元,比如关键字 (if, while)、标识符 (num, count)、常量 (123)、运算符 (=, +) 等。

分支点 (Branch Points):

• 解析树中的每个分支点对应一个 文法规则 的应用。

• 每个分支点的出现都受到 上下文无关文法 (CFG) 的规则 “批准 (Sanctioned)”。

• 这些分支点代表代码的结构,比如表达式、语句块、函数定义等。

2. 解析树的结构示意

假设语句 int count = 5;,其对应的文法如下:

<program> → <declaration>

<declaration> → <type> <identifier> = <value> ;

<type> → int

<identifier> → count

<value> → 5

对应的解析树:

<program>

|

<declaration>

/     |     \

<type>  <identifier>  <value>

|         |           |

int      count         5

解析树说明

  1. 根节点:<program> 是文法的起始符号,表示程序的起始结构。

  2. 分支点:<declaration> 由文法规则拆分成 <type>, <identifier> 和 <value>。

  3. 叶子节点:int, count 和 5 分别是 Token,对应于词法分析器的输出。

3. 语法分析的目标

检查语法正确性:确保源代码的结构遵循定义的文法规则。

构建解析树:解析树是后续编译阶段 (如语义分析、代码生成) 的基础。

验证 Token 序列:确保词法分析器生成的 Token 序列可以按照文法规则被解析。

错误定位:如果代码不符合语法规则,语法分析器可以报告并定位语法错误。

4. 解析树的用途

输入到语义分析器:在解析树的基础上进行类型检查、变量声明验证等语义分析。

生成中间代码:通过解析树将程序转换为中间表示形式。

优化代码:解析树有助于优化代码结构,如合并常量、简化表达式等。

5. 语法分析方法

语法分析一般通过 上下文无关文法 (CFG) 进行,主要分为两种方式:

  1. 自顶向下分析 (Top-Down Parsing)

• 从文法的起始符号开始,逐步展开文法规则,尝试匹配 Token 序列。

:LL(1) 分析器。

  1. 自底向上分析 (Bottom-Up Parsing)

• 从 Token 序列开始,逐步归约成文法的起始符号。

:LR(0)、SLR(1)、LALR(1)、LR(1) 分析器。

总结

语法分析的目标 是构建一棵 解析树,它表示源代码的语法结构。

根节点 是文法的起始符号,叶子节点 是词法分析阶段的 Token 序列。

• 每个分支点都由文法规则批准,确保代码结构符合语法规则。

• 解析树是编译器后续阶段的基础,如语义分析、中间代码生成和代码优化。

Aims of syntactic analysis

⮚Perhaps carry out semantic checks at the same time

⮚This phase may instead generate a sequence of machine code instructions, or some other intermediate form of the program, a bit at a time

⮚If the syntax of the program is invalid, to give as many and as helpful error messages as possible

详细解读:语法分析的目标 (Aims of Syntactic Analysis)

语法分析 (Syntactic Analysis) 是编译器中的一个关键阶段,主要目标是分析源代码的结构,并确保其符合语法规则。同时,这一阶段还可能执行其他重要任务,如语义检查、代码生成及错误处理。以下是具体内容的解读:

1. 执行语义检查 (Semantic Checks)

含义:在语法分析的过程中,部分语义检查可以同步进行。

示例

• 确保 变量已声明:例如,int x = y + 1; 中,如果 y 未声明,就会触发错误。

类型检查:例如,确保赋值语句 int x = "hello"; 中的类型不匹配错误被检测到。

运算符和操作数的合法性:如整数加法操作符 + 不能用于字符串连接。

目的:尽早发现代码中的语义错误,减少后续阶段的错误传播,提高编译器的效率。

2. 生成中间代码或机器码 (Code Generation or Intermediate Form)

含义:语法分析不仅限于构建 解析树 (Parse Tree),它还可以逐步生成中间代码机器码指令

工作流程

• 将程序分解为符合语法的单元。

• 逐步生成对应的机器码或中间代码。

示例

• 语句 a = b + c 在语法分析阶段可以直接转化为:

LOAD b

ADD c

STORE a

• 生成的 中间代码 可以被优化器进一步处理,然后由目标代码生成器转化为可执行的机器代码。

优势

• 减少额外阶段的复杂性。

• 通过逐步代码生成,帮助早期发现错误。

3. 错误检测与报告 (Error Handling)

含义:如果代码的语法无效,语法分析器的任务之一是提供尽可能多且有用的错误信息。

目标

检测错误:识别代码中违反语法规则的部分。

定位错误:指出错误发生的具体位置。

提供建议:提供明确的错误消息和修正建议,帮助开发者快速定位并解决问题。

示例错误信息

• Syntax Error: Missing ';' at line 5

• Unexpected token '}' at line 10

• Type Error: 'int' cannot be assigned to 'string' at line 8

优质错误报告的特点

尽量一次性检测多个错误:而不是在每个错误处停止分析。

提供上下文信息:解释错误的来源和修正方法。

用户友好:错误消息易于理解,避免技术细节过多。

总结

语法分析的目标包括以下三个方面:

  1. 同步语义检查:在语法分析时检测变量声明、类型检查等语义错误。

  2. 生成代码:逐步生成机器码指令或中间代码,为后续的优化和目标代码生成提供基础。

  3. 错误处理:在语法错误出现时,提供尽可能多且有帮助的错误信息,帮助开发者快速定位和修复问题。

语法分析阶段不仅仅是构建解析树,它为编译器的后续阶段提供了结构化的程序表示,同时提高了编译器的错误检测能力和用户友好性。

Review: parsing tree

截屏2024-12-16 12.53.21.png

解析树 (Parsing Tree) 详细解读

Two Parsing Strategy

Search problem – given the root and the leaves, to find the appropriate labeled branch points in between

●Top-down parsing strategy