语法分析


目录
  • 1. 自顶向下分析(Top-Down Parsing)
    • 最左推导(Left-most Derivation)
    • 最右推导(Right-most Derivation)
    • 最左推导和最右推导的唯一性
    • 自顶向下语法分析的通用形式
    • 预测分析(Predictive Parsing)
    • 1.1. 文法转换
      • 问题1---回溯
      • 问题2---左递归导致无限循环
      • 消除直接左递归
      • 消除直接左递归的一般形式
      • 消除间接左递归
      • 消除左递归算法
      • 提取左公因子(Left Factoring)
      • 提取左公因式算法
    • 1.2. LL(1)文法
      • S_文法
      • 非终结符的后继符号集(FOLLOW)
      • 串首终结符集(FIRST)
      • 产生式的可选集(SELECT)
      • LL(1)文法概念
      • FIRST集计算
      • FOLLOW集计算
      • SELECT集计算
      • 预测分析表
    • 1.3. LL(1)文法的分析方法
      • 递归的预测分析法
      • 非递归的预测分析法(表驱动)
      • 递归的预测分析法vs.非递归的预测分析法
      • 预测分析法实现步骤
      • 预测分析法中的错误检测
      • 预测分析法中的错误恢复
  • 2. 自底向上分析: 移入规约分析(Shift-Reduce Parsing)
    • 移入-归约分析的工作过程
    • 移入-归约分析器可采取的4中动作
    • 移入-归约分析中存在的问题
    • (句型的)短语
    • 2.1. LR分析法
      • LR分析法的基本原理
      • LR分析器(自动机)的总体结构
      • LR分析表的结构 及 分析过程
      • LR分析器的工作过程
      • LR分析算法
      • 如何构造给定文法的LR分析表
    • 2.2. LR(0)分析
      • LR(0)项目
      • 增广文法(Augmented Grammar)
      • LR(0)分析表的构造算法
        • CLOSURE()函数
        • GOTO()函数
        • 构造LR(0)自动机的状态集
        • LR(0)分析表构造算法
      • LR(0)自动机的形式化定义
      • LR(0)分析过程中的冲突
    • 2.3. SLR分析
      • SLR条件
      • SLR分析表构造算法
      • SLR分析中的冲突
    • 2.4. LR(1)分析
      • LR(1)的提出
      • 规范LR(1)项目
      • 等价LR(1)项目
      • 赋值语句文法的LR(1)分析表
      • LR(1)项目集闭包
      • GOTO函数
      • 为文法 G' 构造LR(1)项集族
      • LR(1)自动机的形式化定义
      • LR分析表构造算法
    • 2.5. LALR分析(lookahead-LR)
      • 基本思想
      • 合并同心项集
      • 合并同心项集时产生 归约-归约冲突的例子
      • LALR(1)的特点
    • 2.6. 二义性文法的LR分析
      • 二义性文法分析
      • 二义性算术表达式文法的LR(0)分析器
      • 二义性算术表达式文法的SLR分析表
      • 二义性if语句文法的SLR分析表
    • 2.7. LR分析中的错误处理
      • 恐慌模式错误恢复
      • 短语层次错误恢复

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

  • 从分析树的顶部(根节点)向底部(叶节点)方向构造分析树

  • 可以看成是从文法开始符号S推导出词串w的过程
    image-20211014130044979

  • 每一步推导中,都需要做两个选择

    • 替换当前句型中的哪个非终结符
    • 用该非终结符的哪个候选式进行替换

最左推导(Left-most Derivation)

image-20211108081848973

自顶向下的语法分析采用最左推导方式.

kgzty-93jyp

最右推导(Right-most Derivation)

image-20211108082156857

最左推导和最右推导的唯一性

image-20211108082314852

自顶向下语法分析的通用形式

image-20211108085141535

预测分析(Predictive Parsing)

image-20211108085239604

1.1. 文法转换

问题1---回溯

image-20211108091851620

问题2---左递归导致无限循环

image-20211108092128945

消除直接左递归

image-20211108092356654

消除直接左递归的一般形式

image-20211108092934888

消除间接左递归

合并产生式, 将间接左递归变成直接左递归再消除

image-20211108093737818

image-20211108155445163

消除左递归算法

image-20211108094203538

image-20211108094427718

在每个终结符的循环内:

  • 先将所有比该终结符小的(标号小)终结符替换为产生式
  • 然后消除改终结符产生式之间的立即左递归

提取左公因子(Left Factoring)

image-20211108100238359

推迟进入候选式的选择, 减少回溯长度

提取左公因式算法

image-20211108100745382

1.2. LL(1)文法

S_文法

image-20211108143034121

如果S_文法包含ε产生式,那么它就成为了LL文法

image-20211108144838020

非终结符的后继符号集(FOLLOW)

image-20211108144947876

串首终结符集(FIRST)

image-20211108145325535

产生式的可选集(SELECT)

image-20211108145147059

LL(1)文法概念

image-20211108145626218

FIRST集计算

image-20211108155545080

算法:

image-20211108155643719

计算串X1X2…Xn的FIRST集合:

image-20211108160202793

FOLLOW集计算

image-20211108151155079

image-20211109125458550

SELECT集计算

image-20211109125522546

预测分析表

image-20211109125552165

1.3. LL(1)文法的分析方法

递归的预测分析法

image-20211108152107980

image-20211109125630686

image-20211108152536482

image-20211108153952952

image-20211108154246219

image-20211108154326000

image-20211108154353615

image-20211108154419176

image-20211108154455570

非递归的预测分析法(表驱动)

image-20211108154524114

image-20211109125132917

image-20211108154637463

递归的预测分析法vs.非递归的预测分析法

image-20211108154732459

预测分析法实现步骤

image-20211108154811906

预测分析法中的错误检测

image-20211108154837403

预测分析法中的错误恢复

image-20211108154901932

image-20211108155153425

image-20211108155110086

2. 自底向上分析: 移入规约分析(Shift-Reduce Parsing)

image-20211109081207970

image-20211109081916871

移入-归约分析的工作过程

image-20211109082027055

移入-归约分析器可采取的4中动作

image-20211109082131744

移入-归约分析中存在的问题

选用哪个产生式?

image-20211110102541105

句柄: 句型的最左直接短语

正确的应该是:

image-20211110102629941


(句型的)短语

短语, 直接短语, 句柄

image-20211109082845357

2.1. LR分析法

image-20211109082956563

LR分析法的基本原理

image-20211109083544103

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

image-20211109083635820

LR分析表的结构 及 分析过程

image-20211109084048031

image-20211109084115861

LR分析器的工作过程

image-20211109084424249

LR分析算法

image-20211109084537375

如何构造给定文法的LR分析表

  • LR(0)分析
  • SLR分析
  • LR(1)分析
  • LALR分析

2.2. LR(0)分析

LR(0)项目

image-20211109084730514

image-20211109090338561

增广文法(Augmented Grammar)

image-20211109090143006

image-20211109090507791

LR(0)分析表的构造算法

CLOSURE()函数

image-20211109090901858

GOTO()函数

image-20211109090926757

构造LR(0)自动机的状态集

image-20211109091008437

LR(0)分析表构造算法

image-20211109091241912

LR(0)自动机的形式化定义

image-20211109091434876

LR(0)分析过程中的冲突

image-20211109091721501

可能存在:

  • 移进 - 归约 冲突

  • 归约 - 归约 冲突

  • 如果LR(0)分析表中没有语法分析动作冲突,那么给定的文法就称为LR(0)文法
  • 不是所有CFG都能用LR(0)方法进行分析, 也就是说, CFG不总是LR(0)文法

2.3. SLR分析

S: simple
移入优先, 用FOLLOW集来判断是用哪个产生式归约

  • 解决了一些 移入 - 归约 冲突
  • 解决了 归约 - 归约 冲突 (每个相同 产生式左部的FOLLOW集交集为?)

LR分析的产生式满足LL分析产生式的条件吗??

image-20211109092218878

SLR条件

image-20211109092659701

image-20211109093224352

SLR分析表构造算法

image-20211109093250283

SLR分析中的冲突

image-20211109093428596

2.4. LR(1)分析

LR(1)的提出

image-20211109095321744

规范LR(1)项目

image-20211109095629858

等价LR(1)项目

image-20211109100144406

赋值语句文法的LR(1)分析表

image-20211109100527026

image-20211109100615210

image-20211109101035890

LR(1)项目集闭包

image-20211109101147958

GOTO函数

image-20211109101209716

为文法 G' 构造LR(1)项集族

image-20211109101329985

LR(1)自动机的形式化定义

image-20211109101439736

LR分析表构造算法

image-20211109101705653

2.5. LALR分析(lookahead-LR)

基本思想

image-20211109102539418

合并同心项集

image-20211109103349796

合并同心项集时产生 归约-归约冲突的例子

image-20211109110809370

合并同心项集后, 虽然不产生冲突, 但可能会推迟错误的发现

image-20211109110927187

LALR(1)的特点

image-20211109111228270

image-20211109111258905

2.6. 二义性文法的LR分析

二义性文法分析

image-20211109111718269

二义性算术表达式文法的LR(0)分析器

image-20211109111820889

二义性算术表达式文法的SLR分析表

image-20211109112329740

image-20211109112540525

二义性if语句文法的SLR分析表

image-20211109112644280

**应该保守地使用二义性文法, 并且必须在严格控制之下使用, 英文稍有不慎就会导致语法分析器所识别的语言出现偏差. **

2.7. LR分析中的错误处理

image-20211109113116100

恐慌模式错误恢复

image-20211109113149746

短语层次错误恢复

image-20211109113219717

image-20211109113247662

image-20211109113347111