文章目录

  • 自下而上分析法
  • 一、规范规约
    • 相关定义
      • 短语
      • 直接短语
      • 句柄
      • 素短语
      • 最左素短语
      • 语法树表示
      • 示例
    • 规范规约
  • 二、语法分析器
  • 三、算符优先分析算法
    • 算符文法
      • 1. 算符优先文法
      • 2. FIRSTVT( P )和LASTVT( P ):
        • (1) FIRSTVT( P )
        • (2) LASTVT( P )
      • 2. 构建优先关系表
      • 3. 示例
    • 算符优先分析算法
      • 示例
  • 三. LR分析法
    • 活前缀
    • LR分析器
      • 1.分析表
      • 2.通过自动机识别活前缀
        • LR(0)项目集规范族的构造
      • 3.LR(0)分析法
        • LR(0)分析表的构造
        • 示例
      • 4.SLR分析法
        • 构建分析表
        • 示例
      • 5.LR(1)文法
        • 项目闭包的构建
        • 分析表
        • 示例
      • 6.LALR(1)文法
        • 分析表
        • 示例

自下而上分析法

自下而上分析方法:从输入串开始,逐步进行规约,直至文法的开始符号。是指根据文法的产生式规则,把产生式的右部替换成左部符号

因此自上而下分析法的核心问题为识别可规约串

一、规范规约

相关定义

短语

G是一个文法,S是文法的开始符号,假定α\alphaαβ\betaβδ\deltaδ是文法G的一个句型,如果有
则称β\betaβ是句型α\alphaαβ\betaβδ\deltaδ相对于非终结符A的短语。

直接短语

如果有A⇒β\betaβ,则称β\betaβ是句型α\alphaαβ\betaβδ\deltaδ相对于规则A→β\betaβ的直接短语。

句柄

一个句型的最左直接短语称为该句型的句柄。

素短语

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

最左素短语

处于句型最左边的素短语

语法树表示

在一个句型对应的语法树中,以某非终结符为根的一颗子树的所有叶子自左至右排列起来形成一个相对于子树根的短语。
仅有父子两代的一棵子树,它的所有叶子自左至右排列起来所形成的符号串为直接短语
语法树中最左那棵只有父子两代的子树的所有叶子的自左至右排列形成的字符串为句柄

示例

规范规约


如图所示,将修建语法树的过程倒过来,即得到S⇒aAcBe⇒aAcde⇒aAbcde⇒abbcde,这显然是一个最右推导,规范规约是关于一个最右推导的逆过程。

二、语法分析器


我们将输入串一一移入至栈中,当栈内形成可规约串时,就进行规约。这种规约可能出现多次,一直归约直至栈顶不再出现可规约串。然后,我们继续向栈内移入符号,直至输入串仅剩 # ,栈内内容变为 #S

在上述过程中,分析器共产生4中动作:

  1. 移进:读入下一个输入符号并把它下推进栈。
  2. 规约:当栈顶符号串形成一个可归约的串(如:句柄)时,直接进行归约,即用产生式左侧的非终结符替换栈顶的句柄。
  3. 接受:当栈底只有“#”和开始符号,而输入也已经到达右端标志符号“#”时,识别出符号串是句子,执行该动作,表示分析成功,是归约的一种特殊情况。
  4. 出错:栈顶的内容与输入符号相悖,即当识别程序发现输入符号串不是句子时,进行出错处理。

在移进规约过程中,可能会出现移进-归约冲突归约-归约冲突,不同的分析方法有不同的处理冲突的技术。

三、算符优先分析算法



我们首先对终结符a与b的优先关系进行定义:

算符文法


1. 算符优先文法

2. FIRSTVT( P )和LASTVT( P ):

(1) FIRSTVT( P )


(2) LASTVT( P )



此外,算符优先文法句型扩在两个#之间,形如#E#,因此

2. 构建优先关系表


3. 示例




算符优先分析算法


注:算符优先分析只关心句型中自左向右的终结符序列的优先关系,不涉及终结符之间可能存在的非终结符,因此可以认为这些非终结符是同一个符号。

示例


三. LR分析法


优点:能用LL(1)分析法分析的所有文法都能使用LR分析法来进行分析。
LR分析法在自左至右扫描输入串的过程中能发现其中的任何错误,并能准确指出出错位置。
缺点:手工构造分析表工作量太大,需使用自动生成器。

LR分析法通过求句柄逐步归约进行语法分析。其中句柄是通过求活前缀而求得。

活前缀



我们通过下图过程,可以得到:

LR分析器

1.分析表

分析表(分析函数):不同的文法分析表不同,同一个文法采用的LR分析器不同时,分析表也不同,分析表又可分为动作(ACTION)表状态转换(GOTO)表两个部分,它们都可用二维数组表示。

ACTION[s,a]:当状态s面临输入符号a时,应采取什么动作。
每一项ACTION[s,a]所规定的四种动作:

  1. 移进 把(s,a)的下一状态s’和输入符号a推进栈,下一输入符号变成现行输入符号。
  2. 归约 指用某产生式A→β\betaβ进行归约. 假若β\betaβ的长度为r, 归约动作是: 去除栈顶r个项,使状态sm-r变成栈顶状态,然后把(sm-r, A)的下一状态s’=GOTO[sm-r, A]和文法符号A推进栈。
  3. 接受 宣布分析成功,停止分析器工作。
  4. 报错

GOTO[s,X]:状态s面对文法符号X时,下一状态是什么。
对于如下分析表:

Si:把当前输入符号移进栈,第i个状态进状态栈。
ri:按第i个产生式进行规约。
i:第i个状态进栈。

对于一个文法,如果能够构造一张分析表,使得它的每个入口均是唯一确定的,则这个文法就称为LR文法。
一个文法,如果能用一个每步顶多向前检查k个输入符号的LR分析器进行分析,则这个文法就称为LR(k)文法。

2.通过自动机识别活前缀

对于一个文法G,我们可以构造一个有限自动机,它能识别G的所有活前缀。
由于产生式右部的符号就是句柄,若这些符号串都已进栈,则表示它已处于“归态活前缀”,若只有部分进栈,则表示它处于“非归态活前缀”。要想知道活前缀有多大部分进栈了,可以为每个产生式构造一个自动机,由它的状态来记住这些情况,此“状态”称为“项目”。这些自动机的全体就是识别所有活前缀的有限自动机。


构成识别一个文法活前缀的DFA的项目集(状态)的全体称为文法的LR(0)项目集规范族。

由于以下结论,我们可以构建一个项目闭包,避免需要将NFA确定化。

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

3.LR(0)分析法

LR(0)分析表的构造


示例




4.SLR分析法

当发生移进-规约冲突时,如果出现以下情况:

构建分析表


按上述方法构造出的ACTION与GOTO表如果不含多重入口,则称该文法为SLR(1)文法。
使用SLR表的分析器叫做一个SLR分析器。
每个SLR(1)文法都是无二义的。但也存在许多无二义文法不是SLR(1)的。

示例




5.LR(1)文法




项目闭包的构建

分析表



示例


6.LALR(1)文法



分析表


示例




自下而上分析方法-算符优先,LR(0),SLR,LR(1),LALR大全相关推荐

  1. LR(0),SLR(1),LR(1),LALR(1)的区别

    参考文章 参考文章 LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法.自下而上:从给定的句子规约到文法的开始符号.用的是归约. 种文法分析过程基本有三大步:写出自动机(即 LR( ...

  2. 编译原理(五)自底向上分析之算符优先分析法

    自底向上分析之算符优先分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本过程 1. 一般方法:采用自左向右地扫描和分析输入串,从输入符号串开始,通过反复查找当前句型的句 ...

  3. 编译原理学习笔记(二十六)~习题:构造基于LR(0)、LR(1)项目的识别活前缀的DFA

    题目 文法: S–>Aa | bAc | dc | bda A–>d 通过构造基于LR(0).LR(1)项目的识别活前缀的DFA,判断上面文法 是否是SLR(1)文法?? 是否是LALR( ...

  4. 编译原理实验:自下而上的语法分析---(算符优先分析)

    ** 算符优先分析程序(NCWU慎用) ** 1.实验要求 ⑴ 选择算符优先分析方法: ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作为分析对象,并且与所选语法分析方法要 ...

  5. 自下而上的分析法——算符优先分析法

    概述 算符优先分析法(Operator Precedence Parse)是仿效四则运算的计算过程而构造的一种语法分析方法.算符优先分析法的关键是比较两个相继出现的终结符的优先级而决定应采取的动作. ...

  6. 编译原理 | 语法分析(LL(1)分析法/算符优先分析法OPG)学习笔记及例子详解

    语法分析(自顶向下 / 自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析 ...

  7. 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解

    语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...

  8. 编译原理系列之五 自底向上优先分析(2)-算符优先分析法

    算符优先分析法 1.基本概念 算符文法(OG):文法G中没有形如A=>···BC···的产生式,其中B.C为非终结符,则G为算符文法(operator grammar). 也就是说产生式的右部不 ...

  9. 什么是LL(1)、LR(0)、LR(1)文法、LR分析表—编译原理

    系列文章戳这里

  10. 编译原理:算符优先分析实验

    什么是算符优先分析法 算符优先分析法是一种简单.直观的自下而上分析法 算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法. 这种分析方法首先要规定运算符之间(确切地说终结符之间)的 ...

最新文章

  1. Tomcat6优化配置
  2. mysql udf提权_MySQL日志安全分析技巧
  3. Mac Oracle SQL Developer “欢迎使用“页卡死,解决办法
  4. linux设置NO_PROXY绕过代理
  5. 第二十次CCF计算机软件能力认证总结
  6. imageNamed和imageWithContentsOfFile-无法加载图片的问题
  7. [股市]跳搂指数(收藏)
  8. 跟风 Google 只是东施效颦?!
  9. 甘肃教师学苑2020文章代码_【重磅通知】甘肃省电化教育中心 关于聘任教育信息化研究员的通知...
  10. algs4.jar----算法第四版书本官方jar包下载
  11. 《给你的答复:关于朋友或怀疑朋友或怀疑》
  12. java-->if顺序结构-->骰子游戏(小案例)
  13. 竹子买车第二届运动会乒乓球大赛 趣味运动展风采
  14. 校园网升级了WiFi6,笔记本突然搜索不到校园网了
  15. 常用路由协议的分析及比较/RIP/IGRP/OSPF/BGP
  16. 你玩过轻量系统软总线应用吗?
  17. 关于解决文件夹变成*.EXE可执行文件的问题
  18. 前端面试--什么是防抖和节流
  19. 女程序员职业生涯发展
  20. 前端系列——vue2+高德地图web端开发(使用和引入)

热门文章

  1. TCP的乱序和丢包判断(附Reordering更新算法)-实例case
  2. 爱莫科技入选英特尔“AI 百佳”,共同打造人工智能创新生态
  3. 目标跟踪-按专题分类文章
  4. 计算机专业的男生喜欢你,男生真心喜欢你的五个表现
  5. 190320运算符数据类型
  6. 【第一组】第五次冲刺例会纪要
  7. QT3D场景的快速绘制
  8. R语言错误的提示(中英文翻译)
  9. ubuntu下dbus工具d-feet不显示路径和接口
  10. UNI-APP_uni-app uni.getUserProfile微信授权,微信授权信息显示微信用户解决