【无标题】

自顶向下文法:
总述:
自上而下的语法分析方法是对由单词种别构成的源程序,尝
试用所有可能的途径,从语法树的根结点出发,从上至下为
输入符号串建立一棵语法树。也可以说成是为输入符号串构
造一个最左推导。整个分析过程就是一种试探的过程,通过
不断使用不同产生式谋求匹配输入符号串的过程。自上而下
的语法分析方法分为确定的和不确定的两种。只有 LL(1)
文法才能进行确定的自上而下语法分析
• 在分析前,必须事先排除文法中二义性,左递归以及回溯现
象,才能保证其是 LL(1) 文法
• 对于 LL(1) 文法来说,通常来说其分析的必经之路是经过求
解 SELECT 集之后得到预测分析表
• 可以选择的分析方法有预测分析法与递归下降分析法

二义性文法:

对于任意一个上下文无关文法,不存在一个算法,判定它是无二义性的;但能给出一组充分条件,满足这组充分条件的文法是无二义性的
满足,肯定无二义性
不满足,也未必就是有二义性的

预测分析法:

所需条件:符号栈,预测分析表
• 借助预测分析表,根据此时的栈顶符号 X,以及当前的输入
符号 a 决定语法分析器的动作。可能的动作包括:
• 分析成功停机
• 均为栈顶符号 X,直接弹出并移动至下一个输入符号
• 弹出栈顶符号 X,查阅预测分析表,并将表内非空项的右部
压回栈内
• 分析错误
• 错误恢复策略:设定一些同步记号作为标记 M[X,a]=synch,
以能够跳过某些错误的输入符号,但这种错误恢复策略依赖
于需要给出合适的“假设”,因为不同的同步点的处理策略
并不完全相同

S_文法
每个产生式的右部都以终结符开始
同一非终结符的各个候选式的首终结符都不同

递归下降分析法

• 所需条件:处理子程序允许递归调用,为文法的每一个语法
变量都编写一个处理子程序
• 对于产生式 A → X1X2…Xk…Xn,如果遇到的 Xk 是终结符则
可以直接进行匹配,如果是语法变量则递归调用 Xk 对应的
处理子程序
• 需要根据 LL(1) 文法绘制并化简语法图,以得到比较优良的
递归子程序
相同点和不同点以及优劣
递归下降分析法与预测分析法相互关联,均是针对可进行确
定性分析的 LL(1) 文法而进行的分析方法(也只能对 LL(1)
进行分析,同时意味着必须事先排除文法中的二义性,左递
归以及回溯问题)。预测分析法可以理解为一种特殊的递归
下降分析法,其显式的维护一个栈而不是通过隐式的递归调
用去实现的状态保存与变更(事实上操作系统内也是通过栈
去实现的递归调用)
• 递归下降分析法
• 其结构直观,易于理解(基于语法图)
• 可能需要大量的递归调用,执行效率低,时空开销大,代码
规模非常大,不便于自动生成
• 预测分析法
• 非递归结构,执行效率高(O(n) 于输入串),时空开销小
• 需要事先构造引入一个预测分析表,相对不直观(需要结合
过程理解,缺少形象的语法图)

LL(1)文法

文法G是LL(1)的,当且仅当G的任意两个具有相同左部的产生式A → α | β 满足下面的条件:
如果α 和β均不能推导出ε ,则FIRST (α)∩FIRST (β) =Φ
α和β至多有一个能推导出ε 
如果β =>* ε,则FIRST (α)∩FOLLOW(A) =Φ;
如果α =>*ε,则FIRST (β)∩FOLLOW(A) =Φ;
同一非终结符的各个产生式的可选集互不相交

递归的预测分析法,程序规模大,直观性好,效率低,自动生成比较难。非递归的预测分析法,规模较小,需载入分析表,直观性较差,效率正比于带分析程度长度,自动生成较容易。

自底向上文法
总述:
区别于自顶而下的分析,此处可以看做是将输入串 w 通过
不断的匹配特定子串(识别句柄)并归约的方式归约成文法
开始符号 S 的过程,事实上是从分析树的叶结点向根节点地
自底而上构造语法分析树的过程
• 自底而上分析的关键问题包括两个:“何时归约”以及“使
用什么产生式归约”
• 可以选择的分析方法有算符优先分析法与 LR 分析法,这两
个方法分别回答了以上两个问题

算符优先法:
根据归约的先后次序给句型中相邻的终结符规定其优先关
系,以此优先关系解决归约冲突的方法进一步演变成了算符
优先分析法
• 所需条件:必须是算符优先文法,符号栈
• 分别求解 FIRSTOP 与 LASTOP 集,并根据确定法则,得到
算符之间的优先级关系,进而构造出算符优先关系矩阵。在
移进-归约分析中,始终归约出现优先级闭环 ≮ … ≯ 的部分,
即始终保证栈是一个单调栈。
• 错误恢复策略:
• 对于遇到优先矩阵中的空白项时可以采取插入或删除符号的
方式,但必须针对优先矩阵中的每一个空白项给定一个错误
处理策略
• 对于可归约对象不能找到一个合适的产生式右部进行归约的
情况,可以正常把符号弹出栈并给出报错信息
优点:简单、比较效率高
能够处理部分二义性文法
缺点:
对文法的限制较多,导致适应范围小
OG
OPG
寻找“素短语”需要回头找短语的头

状态法

根据句柄的形成过程建立状态
用状态来描述分析过程中句柄是否形成
因为句柄是产生式的右部,可用“产生式”刻画句柄识别的进程用状态标示

LR分析法

从语言的文法描述入手,探讨当前“规范句型”的句柄的识别
L :从左到右扫描输入符号
R :最右推导对应的最左归约(Reduce)
k :超前读入k个符号,以确定归约用的产生式
根据句柄的形成过程建立状态,维护状态的过程进一步演变
成了 LR 分析法。LR 分析法实际上包含多种 LR 分析器,各
有优劣
• 所需条件:LR 分析表(状态/终结符的动作 (action) 表 + 状
态/非终结符的转移 (goto) 表),符号栈与状态栈
• 借助 LR 分析表,根据此时状态栈顶状态 S,以及当前的输
入符号 a 决定语法分析器的动作。可能的动作包括:
• 移进符号,进入下一个状态
• 根据产生式归约(需要注意,归约后紧接着需要查 goto 表,
完成一次状态转移操作)
• 多种 LR 分析器的异同与优劣
• LR(0) 分析法:
• 最基本的分析法,不需要向前查看输入符号,只根据当前的栈
顶状态就可以确定下一步采取的操作
• 不能解决移进与规约冲突,不能解决规约与规约冲突
• SLR(1) 分析法:
• 当某状态的项要归约时,要求出此项的 FOLLOW(A) 集合,在
SLR 表该状态中 FOLLOW(A) 的符号下写上归约
• 在 LR(0) 的基础上,考虑 FOLLOW 集,描述能力得到增强,
但也没能完全解决规约与规约冲突

拓广文法

文法 G= (V, T, P, S)的拓广(Augmented)文法
G’ =(V∪{S’}, T, P∪{S’→S}, S’), S’V
分析开始: S’→.S,分析成功: S’→S.

LR(0)

文法的LR(0)项目(Item):产生式的右部某个位置标有园点,A→α.β
例 S→.aB S→a.B S→aB.
移进(Shift)项目:S→.bB
待约(Reducing)项目:S→b.BB S→a.B
归约(Reduce)项目: S→aB.
从产生式寻找归约对象的方法
有可能会存在分辨不出来的情况

SLR(1)

描述能力强于 LL(1)
SLR(1)还考虑FOLLOW集中的符号
LL(1) 仅考虑产生式的首符号
SLR(1) 文法:SLR(1)分析表无冲突的CFG
基本步骤:
1、编写拓广文法,求Follow集
2、求识别所有活前缀的DFA
3、构造SLR(1)分析表
缺点:如果 SLR(1) 分析表仍有多重入口(移进-归约冲突或归约-归约冲突),则说明该文法不是 SLR(1) 文法;
说明仅使用 LR(0) 项目集和 FOLLOW 集还不足以分析这种文法

相同点和不同点以及优劣
算符优先分析法
• 简单、比较效率高;也能够处理部分二义性文法
• 只适用于算符优先文法,限制较多,适用范围小;寻找“素
短语”需要回头找短语的头,效率较低
• LR 分析法
• 可以找到句柄;能够处理部分二义性文法
• LR(0) 不考虑搜索符 (展望符、后继符) ,SLR(1) 仅在分析时
考虑搜索符,因此,对搜索符所含信息量的利用有限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值