自下而上分析

  • 自下而上分析基本问题
    • 归约
      • 规范归约
  • 算符优先分析
  • LR分析法
    • 出错判断:
    • 基本思想
  • LR文法
  • 构造LR分析表
    • LR(0)分析表的构造
      • 思想:
      • 前缀:
      • 活前缀:
      • LR(0)项目
      • 构造NFA的方法(识别活前缀)
  • LR(0)项目集规范族和LR(0)分析表的构造
    • 构造识别活前缀的DFA
      • 有效项目的定义
    • LR(0)文法判别
    • 构造LR(0)分析表的算法
  • SLR分析表的构造
    • 关系
    • 冲突解决方法
    • SLR(1)分析表例题
  • LR(1)文法
    • 有效项目:
    • 项目集I 的闭包CLOSURE(I)构造方法:
    • 项目集的转移函数GO
    • 分析表构造
  • LALR分析表的构造
  • 解决二义文法语法分析问题的方法

自下而上分析基本问题

中心问题:

怎样判断栈顶的符号串的可归约性以及如何归约。

“可归约串”的不同定义,形成了不同的自下而上的分析方法。

各种自下而上分析法的共同特点:

边输入单词符号(移进符号栈),边归约。

归约

.“移进—归约”的思想:

用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。

规范归约

中心问题:

如何寻找或确定一个句型的句柄。

实质:

在移进过程中,当发现栈顶呈现句柄时,
就用相应产生式的左部符号进行替换。

规范推导,就是最右推导。
规范句型:规范推导得到的句型。

规范归约:

若文法G是无二义的,则规范推导(最右推导)的逆过程必然是规范归约(最左归约)。

短语、直接短语、句柄:

规范归约过程:

算符优先分析

素短语:

是指这样的一个短语,它至少含有一个终结符,
并且, 除它自身之外不再含任何更小的素短语。

最左素短语:

指处于句型最左边的那个素短语。

”最左素短语“ 就是 ”可归约串“。

不是一种规范归约法,是一种自下而上的语法分析法,
关键在于规定算符(即终结符)之间的优先顺序和结合性质,
借助这种优先关系寻找“可归约串”进行归约。

分析速度快,有利于表达式分析,宜于手工实现。

算符文法:

一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,
即不含如式的产生式右部:…QR…则我们称该文法为算符文法。

算符优先文法前提是一个算符文法(没有相邻的非终结符)
算符优先文法:

实际上,在真正的算符优先分析方法中,
需定义任意两个相继出现的终结符号a和b之间的优先关系
(a与b之间可有一个非终结符),一旦确定了这种优先关系,
就可以用它来确定“可归约串”进行归约。

优先关系:

如果一个算符文法G中的任何终结符对(a,b)至多只满足三者中的一个,则称G是一个算符优先文法。

FIRSTVT集合,就是找推导出来的第一位或第二位的终结符(算符优先文法不可能有两个连续的非终结符)
LASVT集合,就是找推导出来的最后一个或倒数第二个终结符。

构造优先关系表的算法:
构造FIRSTVT集合的算法:
只有扫描一遍全部的产生式,FIRSTVT集合不发生改变了,算法才可以停止。(因为只要有一个非终结符的FIRSTVT改变,所有的都可能改变)。

伪码实现:

构造集合LASTVT集合的算法:


构造优先关系表的算法:
特别的:

# <· FIRSVT(开始符号)
LAVTVT(开始符号) ·> #

伪代码:

句型一般形式:

一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串:

子串内终结符,优先级相同,大于前面,大于后面


伪代码:

算符优先分析得到的分析树,不一定是语法树。
因为会跳过单个非终结符到非终结符的替换。

LR分析法

LR分析方法:

把”历史“及”展望“综合抽象程状态;由栈顶的状态和现行的输入符号唯一确定每一步工作。

出错判断:

只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。

结构:

基本思想

在规范归约过程中,一方面记住已移进和归约出的整个符号串(即“历史”),
另一方面根据所用的产生式推测未来可能碰到的输入符号(即对未来进行“展望”)。
当一串貌似句柄的符号串呈现于分析栈的顶端时,我们希望能根据
所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,
来确定栈顶的符号串是否构成相对某一产生式的句柄。

LR分析器,可以准确及时地发现栈顶出现的句柄,并提示你该使用哪个产生式进行归约。
符号栈 + 剩余输入串 是一个规范句型。
LR分析过程:

LR文法

LR文法 :

对一个文法,如果能够构造一个分析表,且它的每个入口均是唯一的。

LR文法不是二义的,二义文法一定不是LR。

LR(k)文法:

一个文法,如果能用一个每步顶多向前检查k个输入符号的LR分析器进行分析。

构造LR分析表

LR(0)分析表的构造

思想:

只概括“历史”材料而不包括推测性“展望”材料的“状态”。

前缀:

字的任意首部。
例:字abc-前缀:ℇ ,a,ab或abc

活前缀:

指规范句型的一个前缀,不含句柄之后的任何符号。

在活前缀右部增添一些终结符之后,就可使之成为一个规范句型。

LR(0)项目

项目:

文法产生式的右部添加一个圆点,称为项目。

例: A→•XYZ, A→X•YZ, A→XY•Z, A→XYZ•

含义:

指明了在分析过程的某时刻我们看到产生式多大一部分。

A→X• YZ

我们已经从输入串中看到能从X推出的符号串,
希望能进一步看到可以从YZ推出的符号串。

项目集:若干个项目组成的集合。

构造NFA的方法(识别活前缀)

将文法的所有项目都写出,每个项目是一个状态

规定项目1为NFA的唯一初态

如果状态i和状态j出自同一产生式,而且状态j的圆点只落后于状态i一个位置:

如果i的这个位置是终结符a,从状态i画一条弧到状态j,标记为a
如果i的这个位置是非终结符A,则连两种弧,
(1)从状态i画ε弧到所有的A→ · β的状态。
(2)从状态i画一条弧到状态j,标记为A
归约项目表示结束状态(句柄识别态),用双圈表示



LR(0)项目集规范族和LR(0)分析表的构造

构造识别活前缀的DFA

LR(0)项目集规范族:

识别活前缀的DFA的项目(状态)集。
(其中,该DFA的状态是LR(0)项目集)

构造方法有两种:

1) 使用第三章的子集法将NFA确定化
2) 直接使用闭包和状态转换函数进行计算

有效项目的定义


性质:

LR(0)项目集规范族的构造:

1、 将文法G(S)拓广成G’(S’),引进非终结符S’ 和产生式S’→S.
2、项目集的闭包CLOSURE

3、状态转换函数

例:

LR(0)文法判别

LR(0)文法规范族的每个项目集不包含任何冲突项目。

假若一个文法G的拓广文法G’的活前缀识别自动机中的每个状态不存在:
①既含移进项目又含归约项目;
②或者含有多个归约项目;

则称G是一个LR(0)文法。

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


示例:

LR(0)分析示例:

SLR分析表的构造

关系

真包含关系。

(1)文法拓广:S’ → S;
(2)构造S’的LR(0)项目集规范族C;
(3)利用C和S’,按下述算法构造S’的SLR分析表。

冲突解决方法


一般化:

SLR(1)分析表例题

LR(1)文法

LR(1)文法状态比SLR更多。

规范LR分析表:

若一个输入串语法正确的话,活前缀加上剩余的输入串应形成一个规范句型,因此,在当前状态中若有一个归约项目(A→α • ),应当面临在规范句型中可以跟在A后的符号时,才在当前状态下执行归约操作

有效项目:


性质:

项目集I 的闭包CLOSURE(I)构造方法:

项目集的转移函数GO

分析表构造


例:

分析示例:

LALR分析表的构造

对于同一个文法,LALR分析表和SLR分析表永远具有相同数目的状态。

同心集合并:

若两个LR(1)项目集,除去搜索符外,
这两个集合相同,则称它们是同心集

构造分析表的步骤:
只是LR(1)多了步合并同心集。

解决二义文法语法分析问题的方法

任何二义文法决不是一个LR文法,因而也不是SLR或LALR文法。

(1)借助于消除二义性的“规定”来解决
(2)不需对文法改写,只需据“规定”解决项目集中的冲突

编译原理复习(5)语法分析--自下而上分析相关推荐

  1. java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  2. 【编译原理】山东大学编译原理复习提纲

    涵盖所有考点,复习绝对高效,点赞+留邮箱获取pdf版本. 山东大学编译原理复习提纲 一.简答与计算 1.1 必考 1. 编译过程 画图表示编译过程的各阶段,并简要说明各阶段的功能: 词法分析器:输入源 ...

  3. 编译原理--实验2 语法分析

    文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...

  4. java编程实现算符优先分析法,编译原理实验三-算符优先分析法

    编译原理实验3-算符优先分析法 #include #include #include #include #define SIZE 128 char priority[6][6]; //算符优先关系表数 ...

  5. 编译原理复习(4)语法分析--自上而下分析

    语法分析--自上而下分析 语法分析器的功能 语法分析方法分类 自上而下分析法 自下而上分析法 LL(1)分析法 左递归的消除 消除回溯,提取公共左因子 求法,例FIRST(X): FOLLOW集构造方 ...

  6. 笔记-编译原理-第十、十一、十二章、十三章-语法分析-自下而上分析

    第10章 - 自下而上分析1 10.1 自下而上分析 10.1.1 自下而上分析的一个示例 可以看出自下而上分析的主要步骤是不断的用文法来"规约",最后找到一种句型的表示 10.1 ...

  7. 【编译原理】Up-Down-算符优先分析

    宏观自下而上分析. 所谓自下而上分析,就是从输入串开始,逐步进行"归约",直至归约到文法的开始符号:或者说,从语法树的末端开始,步步向上"归约",直到根结点.我 ...

  8. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

  9. 编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)

    需要原卷和答案请点赞关注收藏后评论区留言私信~~~ 下面对编译原理中一些常见的概念以及算法小题的讲解,这部分可能单独出题考试,也有可能混在大题中出现 一.编译器结构 题目如下 The phases o ...

  10. 【编译原理】Python语法分析LL(1)、LR(1)

    目录 一.实验目的 二.实验任务 三.实验原理 1  LL(1)文法 2  LR文法 四.实验过程 1  LL(1)文法 2  LR文法 五.实验结果 1  LL(1)文法 2  LR(0)文法 3 ...

最新文章

  1. mergesort java_归并排序详解(MergeSort)递归和非递归实现
  2. 常见数控机床的数据采集方法比较
  3. 优秀技术人的管理陷阱
  4. 互联网公司招聘奇葩黑历史:不要学日语,不要信中医,不要黄泛区……
  5. rabbitmq视频教程,面试官:
  6. 集成Atlas到现有的网站项目中--决定弃用Ajaxpro转用Atlas了
  7. 人力资源管理系统需求分析报告及系统架构图
  8. python 移动文件位置-python工具-文件及文件夹移动及处理
  9. IOS越狱插件安装后设置里边未显示
  10. 哈工大C语言程序设计精髓MOOC 第十二周编程题
  11. python爬虫之以腾讯招聘为例,爬取动态页面
  12. 软件设计 抽象_调试抽象给软件工程师带来正念的好处
  13. Flutter之基础Widget
  14. Orthanc的REST API — Orthanc Book文档
  15. 解决Windows Firewall/Internet Connection Sharing (ICS)服务无法启动(ping通IP,但不能浏览网页)
  16. 芯片制造全工艺流程详情,请收藏!
  17. RINEX 2.11 观测值文件格式说明
  18. ThreadPoolExecutor 线程池的七个参数
  19. oracle餐厅网络点餐系统_点餐外卖小程序值得搞吗?
  20. Flink一站式平台 StreamX 1.2.2 正式发布, 迄今最稳定可用版本

热门文章

  1. 通信算法之九:4FSK调制解调仿真链路
  2. 从数据库导出数据到EXCEL换行的问题解决方法
  3. python 爬虫+写入excel 小案例
  4. 【自动化测试selenium】
  5. Android Studio连接夜神nox模拟器
  6. 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)考试试卷
  7. smartbi和第三方集成策略
  8. Lettuce在Spring boot中的使用方式
  9. 黑马程序员Android28期视频下载
  10. 淘宝大数据,打假新武器