语法分析--要点、top_down、bottom_up
语法分析的任务:识别句子,确定句子的类型
对于不同类型的语句,后续的语义分析器将执行不同的语义动作
语法分析技术分类 (前提:CFG无二义性)
- top_down
- bottom_up
top_down
LL1(文法)


top_down步骤
- 消除歧义--无二义性
- 文法改造
- 消除左递归
- 提取左公因子
- LL(1)文法判定--确定性


如何实现自顶向下的分析?
- 递归下降分析法
什么样的文法能够实现确定的自顶向下分析?
- LL(1)文法
如何实现确定的自顶向下分析?
- 递归的方式:基于预测分析表对递归下降分析法进行扩展
- 非递归的方式:基于预测分析表构造自动机
递归的预测分析

非递归的预测分析


bottom_up
| top_down | bottom_up | |
|---|---|---|
| 通用框架 | 递归下降分析 | 移入归约分析 |
| 主要问题 | 候选式冲突 | 移入-归约冲突、归约-归约冲突 |
| 关键问题 | 如何正确选择候选式 | 如何正确识别句柄 |
移入-归约分析器的格局

如何正确地识别句柄?——LR 分析法

等价项目

LR 分析器(自动机)的总体结构

LR分析表结构

如何构造给定文法的LR分析表?
- LR(0)分析
- SLR分析
- LR(1)分析
- LALR分析
LR(0)分析
右部某位置标有圆点的产生式称为相应文法的一个LR(0)项目(简称为项目)
A→ α1·α2

LR(0)自动机

LR(0)自动机(分析表)构造方法

句柄都是相对一个句型而言的
LR(0)分析只关心构成某个成分A的各个子成分是否都已出现(如果都出现了就进行归约),但并没有考虑这个成分A是否是待分析句子中的一个成分
- 事实上,如果A不是待分析句子中的一个成分,那么即使把它归约出来也是徒劳,在后续分析过程中迟早会发现分析进行不下去的
因此应该将句柄的识别放在句型这样一个上下文环境中考虑
受技术上的限制,考虑整个上下文实现起来很困难,因此,LR(1)分析只考虑成分A下文的第1个(终结)符号
规范LR(1)项目
将一般形式为 [A→α·β, a]的项称为LR(1)项,其中A→αβ是一个产生式,a是一个终结符(这里将$视为一个特殊的终结符)它表示在当前状态下,A后面必须紧跟的终结符,称为该项的展望符(lookahead)
- 在形如[A→α·β, a]且β ≠ ε的项中,展望符a没有任何作用
- 但是一个形如[A→α·, a]的项在只有在下一个输入符号等于a时才可以按照A→α 进行归约
- 这样的a的集合总是FOLLOW(A)的子集,而且它通常是一个真子集
各种LR分析表构造方法的不同之处在于归约项目的处理上

bottom_up步骤
- 消除歧义--无二义性
- LR文法判定--确定性

Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号