thunder_sword's blog thunder_sword's blog
来看漫画丫~
首页
分类
标签
归档
GitHub

thunder-sword

网安界的小菜鸡
来看漫画丫~
首页
分类
标签
归档
GitHub
  • 引论
  • 语言及其文法
  • 词法分析
  • 自顶向下语法分析方法
  • 自底向上优先分析
  • LR分析方法
    • 1.LR分析器逻辑结构
    • 2.重要结论
    • 1.活前缀
    • 2.LR(0)项目
    • 3.拓广文法
    • 4.项目构造NFA:
    • 5.直接求DFA
    • 6.LR(0)文法定义
    • 7.分析表构造
    • 8.对输入串的分析过程
    • 9.作业
    • 1.移进归约冲突、归约归约冲突、接收归约冲突
    • 2.解决方法-SLR(1)分析
      • 2.1.SLR(1)文法前提
    • 3.分析表构造:
    • 4.分析过程
    • 5.作业
    • 1.SLR问题描述
    • 2.LR(k)项目
    • 3.LR(1)的有效项目集和转移函数
    • 4.分析表构造
    • 5.分析过程
    • 1.介绍说明
    • 2.分析表构造
    • 3.分析过程
    • 4.不能化简的LR(1)
  • 编译原理
thunder-sword
2021-10-12

LR分析方法

# 0x0.总览

image-20211001111158933

image-20211001111304064

image-20211001111313429image-20211001111320655

# 1.LR分析器逻辑结构

image-20211001111416286

image-20211001111428508

image-20211001111441720image-20211001111503552

2.LR分析器的工作过程

image-20211001111529754

# 2.重要结论

  • 每个LR(0)文法一定是SLR(1)文法,也一定LR(1)文法,反之不然。一个LR(0)文法的状态比LR(1)分析器的状态要少。
  • LL(k)文法都是LR(k)文法。
  • 存在非LR文法。例:L={wwR | w∈{a,b}*}和G[S]: S→aSa |bSb | 空

# 0x1.LR(0)分析

image-20211001111632643

# 1.活前缀

image-20211001111702268image-20211001111822957

可以简单理解为:整个分析运算过程所有得到的字符串组成的集合。

# 2.LR(0)项目

image-20211001113233085

# 3.拓广文法

image-20211001113304222

# 4.项目构造NFA:

image-20211001113450544

image-20211001113508896

image-20211001112647294

# 5.直接求DFA

识别活前缀的DFA方法可以直接求:

image-20211001112854248

# 6.LR(0)文法定义

image-20211001114107814

# 7.分析表构造

image-20211001114254233

此处是把所有归约项目都赋值为归约。

例子:

image-20211001114320601

image-20211001114341970

# 8.对输入串的分析过程

image-20211001115431985

# 9.作业

image-20211001123849363

image-20211001123913067

IMG_20211001_122351

# 0x2.SLR(1)分析

# 1.移进归约冲突、归约归约冲突、接收归约冲突

image-20211001133708212

此文法产生的项目集:

image-20211001133747646

但是在实际运行时就会产生冲突:

image-20211001133913311

除此之外,还有一个接收归约冲突,即I0中既有接收项目,又有归约项目时存在此冲突。

# 2.解决方法-SLR(1)分析

存在上述两种冲突之一时证明文法并不是LR(0)文法,可以尝试构造SLR(1)文法来解决冲突。

# 2.1.SLR(1)文法前提

发生冲突的移进符组成的集合要和归约前面的非终结符的follow集合不相交。

image-20211001134017338

image-20211001134030803

image-20211001134047435

# 3.分析表构造:

image-20211001134128167

和LR(0)不同的是,此处是仅仅把属于前面非终结符follow集合的项目设为归约。

例子:

image-20211001134155709

image-20211001134207189

# 4.分析过程

当归约冲突时,查看符号栈前一个符号的表是去那个状态,便是以哪个归约。

image-20211001134259008image-20211001134307258image-20211001134315763image-20211001134327785

# 5.作业

image-20211002232409344image-20211002232433122

答案:

image-20211002233218829

image-20211002233251323

image-20211002233313804

image-20211002233345558

# 0x3.LR(1)分析

LR(1)是为了解决SLR(1)文法解决不了的问题创造出来的。

简单理解:

SLR(1)是处理前者的Follow集合,在冲突的前者的follow集合不相交时便可以得解,这是宏观情况;

而LR(1)则是处理冲突时的后者的First集合,并且将每一步的first值一起入栈,使其后者处理时结果唯一。

# 1.SLR问题描述

image-20211005142204398

# 2.LR(k)项目

image-20211005142235944image-20211005142250210

# 3.LR(1)的有效项目集和转移函数

image-20211005142351113

例子:

image-20211005142441777

# 4.分析表构造

image-20211005142524825

例子:

image-20211005142553581

# 5.分析过程

image-20211005143024410

# 0x4.LALR(1)分析

# 1.介绍说明

LookAhead LR

LALR在SLR(1)和LR(1)的状态数目和分析能力间寻找折中。

简单来说就是将LR(1)文法化简后的文法,但是并不是所有文法都可以化简的。

# 2.分析表构造

1.构造文法G的规范 LR(1) 状态. 2.合并同心集的状态. 3.新 LALR(1) 状态的GO函数是合并的同心集状态的GO函数的并. 4.LALR(1)分析表的ACTION 和 GOTO 登录方法与LR(1)分析表一样. 经上述步骤构造的表若不存在冲突,则称它为文法G的LALR(1)分析表,文法G是LALR(1)文法。

例子:

它的LR(1)项目:

image-20211005152348501

化简之后:

image-20211005152402875

得表:

image-20211005152312381

# 3.分析过程

image-20211005152443727

# 4.不能化简的LR(1)

化简后有冲突时便不能化简,便不是LALR(1)文法,而是LR(1)文法。

image-20211005152603962

image-20211005152614909

# 0x5.作业

除了下面的4题,老师说考试时有可能从第10题里抽题,所以复习时要看下。

image-20211007095355507

我的答案:

img

img

img

自底向上优先分析

← 自底向上优先分析

最近更新
01
计算机系统的硬件结构
10-12
02
计算机系统概论
10-12
03
进程
10-12
更多文章>
Theme by Vdoing | Copyright © 2019-2021 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×