编译原理 - 语法分析(自下而上分析)

自下而上语法分析

    • 两种语法分析对比
    • 自下而上语法分析(Bottom-up)
      • 核心思想 - (移进-规约)
        • 移进 : 移进到栈里,当形成产生式时就弹出(规约)
        • 规约 : 右部符号替换为左部符
        • 移进-规约 例题
      • 核心问题 - 识别可规约串 (短语)
        • 直接短语
        • 句柄 : 一个句型的最左直接短语
        • 短语和直接短语的例题
      • 分析过程描述
    • 分析方法
      • 算符优先分析法
        • 算符优先分析法 - 表达式分析
          • 优先关系
          • 算符文法 - 不会出现连续的非终结符的文法
            • 算符优先文法
            • 算符优先文法例题
        • 构造优先关系表
          • 优先级相等
          • 优先级低和优先级高 - FIRSTVT集合和LASVT集合
            • 构造FIRSTVT(P)的算法
            • 构造LASTVT(P)的算法
            • FIRSTVT的计算
            • LASTVT的计算
          • 构造优先关系表
        • 算符优先分析算法
          • 最左素短语
          • 最左素短语定理
          • 算符优先分析结果 != 语法树
      • LR分析法 - 规范归约的过程
        • 句柄和规范归约
          • 用句柄归约
          • 规范归约 - 结果是语法树
            • 规范句型

两种语法分析对比

编译原理 - 语法分析(自下而上分析)_第1张图片

自下而上语法分析(Bottom-up)

核心思想 - (移进-规约)

移进 : 移进到栈里,当形成产生式时就弹出(规约)

编译原理 - 语法分析(自下而上分析)_第2张图片

规约 : 右部符号替换为左部符

规约:右部符号替换为左部符号
原式:i*i+i 规约后 : E
从下往上合并的过程
右部符号i 替换为 左部符号E
编译原理 - 语法分析(自下而上分析)_第3张图片

移进-规约 例题

编译原理 - 语法分析(自下而上分析)_第4张图片当规约过程中,有多重选项,这个时候我到底哪个规约哪个不规约 - 核心问题 :识别可规约串

核心问题 - 识别可规约串 (短语)

β可以由非终结符A多步推出
αβ△是一个句型,当β由A替换后,αA△仍然是一个句型 
 此时称呼β是αβ△相对于A的短语

子串能够向上规约成一个非终结符号A
这个非终结符A 和上下文一起 仍然是一个句型
编译原理 - 语法分析(自下而上分析)_第5张图片

直接短语

β由A一步推出,那么β是αβ△的直接短语
编译原理 - 语法分析(自下而上分析)_第6张图片

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

在这里插入图片描述
编译原理 - 语法分析(自下而上分析)_第7张图片

短语和直接短语的例题

已知文法和句型,写出对应的短语和直接短语

先按照句型格式展开对应文法 ,套定义进行判断

编译原理 - 语法分析(自下而上分析)_第8张图片以某结点为根的树,末端从左往右 就是短语
子树只有两代,该短语就是直接短语
编译原理 - 语法分析(自下而上分析)_第9张图片

分析过程描述

编译原理 - 语法分析(自下而上分析)_第10张图片

分析方法

算符优先分析法

算符优先分析法 - 表达式分析

算符优先分析法: 按照 算符的优先关系 和结合性质进行语法分析

存在问题 : 归约顺序不同,构造出的语法树不同,计算顺序不同,结果不一样

解决: 设定算符的优先顺序,使得归约过程唯一

编译原理 - 语法分析(自下而上分析)_第11张图片左侧的文法 : 需要时刻记住先乘除后加减的优先级
右侧的文法: 蕴含了算符的优先级,直接无脑展开即可
自下而上 : 右边的 凑对后 = 文法左边的式子
编译原理 - 语法分析(自下而上分析)_第12张图片

优先关系

+<·+ 左边加号的优先级比右边加号的优先级要低
编译原理 - 语法分析(自下而上分析)_第13张图片

算符文法 - 不会出现连续的非终结符的文法

算符文法 : E+
不是算符文法:EF
编译原理 - 语法分析(自下而上分析)_第14张图片

算符优先文法

a优先级与b相同: ab,或者aQb是一起归约到P上去

  • P-> …ab…
  • P-> …aQb…
    eg : (E) 推导出 左括号和右括号的优先级相等,符合 aQb型
    编译原理 - 语法分析(自下而上分析)_第15张图片
    a的优先级低于b :
  • P-> …aR… R=>b…
  • P-> …aR… R=>Qb…
    eg: E->E+E E=>E*E ∴ + <· * 加号优先级低于乘号优先级
    先归约a后面的 ,然后再用这个整体来和a归约编译原理 - 语法分析(自下而上分析)_第16张图片

a的优先级高于b:

  • P->…Rb… R=>…a
  • P->…Rb… R=>…aQ
    优先级高的先归约
    eg: E->E × E E=>E+E ∴ + ·> × 推理出加号的优先级高,这与第二个例子推出的相矛盾
    编译原理 - 语法分析(自下而上分析)_第17张图片
    算符优先文法 : 推理的关系不存在矛盾的情况
    文法G中任何终结符对(a,b) 只满足优先级相等, a优先级高,a优先级低着三个关系之一 - 称G位算符优先文法

编译原理 - 语法分析(自下而上分析)_第18张图片…ab… 相等关系
…aR… + R->b… =>…ab…或者aQb… a<·R(b)
…Rb… + R->…a => …ab… 或者…aQb… R(a)·>b

算符优先文法例题

编译原理 - 语法分析(自下而上分析)_第19张图片

构造优先关系表

优先级相等

检查 优先级相等 无需检查推导式,只需检查所有候选式是否满足ab 或者aQb
在这里插入图片描述

优先级低和优先级高 - FIRSTVT集合和LASVT集合

VT :非终结符
P能推理出a…或者Qa… 那么a可以进入这个FIRSTVT§ : a在首位12位置
P能推理出…a或者…aQ,那么a可以进入这个LASVT§ : a在末尾12位置
编译原理 - 语法分析(自下而上分析)_第20张图片编译原理 - 语法分析(自下而上分析)_第21张图片

构造FIRSTVT§的算法

具体实现 : 栈 + 数组
编译原理 - 语法分析(自下而上分析)_第22张图片

构造LASTVT§的算法

编译原理 - 语法分析(自下而上分析)_第23张图片

FIRSTVT的计算

划首位两个元素
编译原理 - 语法分析(自下而上分析)_第24张图片

LASTVT的计算

划末尾两个元素 不断循环 直到没有新的元素进入集合
编译原理 - 语法分析(自下而上分析)_第25张图片

构造优先关系表

编译原理 - 语法分析(自下而上分析)_第26张图片
编译原理 - 语法分析(自下而上分析)_第27张图片编译原理 - 语法分析(自下而上分析)_第28张图片

算符优先分析算法

自下而上的核心 : 识别可归约串 - 素短语

最左素短语

编译原理 - 语法分析(自下而上分析)_第29张图片短语 : 任何子树两层或两层以上的末端 连接起来
直接短语 : 两层子树末端
素短语: 包含终结符的短语 , 且 内部没有比他更小的素短语
最左素短语 : 最左边的素短语
编译原理 - 语法分析(自下而上分析)_第30张图片可以通过语法树知道最左素短语,但是语法树也是需要推导的最终结果,所以不能依赖语法树

最左素短语定理

最左子串 : 最左的终结符 优先级 比 外面的aj-1要高, 内部的终结符优先级都相等, 最右的终结符 优先级 比 ai+1 要高
这个红色的子串 就是 最左素短语
Njaj…NiaiNi+1 这一串 就是 最左素短语
编译原理 - 语法分析(自下而上分析)_第31张图片
编译原理 - 语法分析(自下而上分析)_第32张图片编译原理 - 语法分析(自下而上分析)_第33张图片

算符优先分析结果 != 语法树

编译原理 - 语法分析(自下而上分析)_第34张图片

LR分析法 - 规范归约的过程

规范归约:句柄作为可归约串
L : 从左到右扫描输入串
R : 自下而上进行归约
编译原理 - 语法分析(自下而上分析)_第35张图片

句柄和规范归约

编译原理 - 语法分析(自下而上分析)_第36张图片编译原理 - 语法分析(自下而上分析)_第37张图片

用句柄归约

编译原理 - 语法分析(自下而上分析)_第38张图片

规范归约 - 结果是语法树

编译原理 - 语法分析(自下而上分析)_第39张图片编译原理 - 语法分析(自下而上分析)_第40张图片

规范句型

编译原理 - 语法分析(自下而上分析)_第41张图片

你可能感兴趣的:(编译原理)