编译原理-至下而上的语法分析

至下而上分析的基本问题

归约

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

E>i|E+E|EE|EE|E/E|(E)

输入符号串:

ii+i

归约过程

Ei+i(1)

EE+i(2)

E+i(3)

E+E(4)

E(5)

例子:设文法G(S):
S>aAcBe
A>b
A>Ab
${b->d} {abbcde}$进行移进归约分析:
能进行归约就进行归约不能进行归约进行移进
image
image
image
image
此时我们进行归约的话就会出现矛盾,b是第二个推导的产生式,Ab是第二个产生式的候选式,这里我们选择第二种进行归约
image
image
image
image
在不能归约时我们就移进
image

短语

定义:令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有:
image
就称β是句型αβδ相对于非终结符A的短语
如果有A=>β,则称β是句型αβδ相对于产生式A>B直接短语,一个句型的最左直接短语称为该句型的句柄
一个句型对应的语法树中

  1. 以某非终结符为根的两代以上的子树的所有末端结点从左到右排列就是相对于该非终结符的一个短语
  2. 如果子树只有两代,则改短语是直接短语

句柄可以被用来对句子进行归约

规范归约

定义:假定α是文法G的一个句子,我们称序列

αn,αn1,...,α0

α的一个规范归约,如果此序列满足:
1.αn=α
2.α0α0=S
3.i0<i<=nαi1αi
规范推导:我们将规范归约的过程逆过来就是规范推导,规范推导也经常被称为最右推导
由规范推导推出来的句型被称为规范句型

符号栈的使用

  1. 栈是语法分析的一种基本数据结构,#作为栈底符号
    文法G(E):
    E>T|E+T
    T>F|TF
    F>(E)|i
    输入串为i1i2+i3的分析过程
    image
    image
    image

算符优先分析

  1. 算符优先就是定义算符之间(终结符之间)的某种优先关系,借助优先关系来寻找可归约串和进行归约
    考虑二义文法G(E):i|E+E|EE|EE|E/E|(E)
    这个句子由几种不同的规范归约
    例如句子i+ii(i+i)的规约过程(按四则运算的优先顺序)

(1)i+ii(i+i)

(2)E+ii(i+i)

(3)E+Ei(i+i)

(4)Ei(i+i)

(5)EE(i+i)

(6)EE(E+i)

(7)EE(E+E)

(8)EE(E)

(9)EEE

(10)EE

(11)E

优先关系

image

算符文法及优先关表构造

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

"等于":image
"小于":
image
"大于":
image
image
FIRSTYT:image

LASTVT:image
比较:
image
算符优先关系表
有了FIRSTVTLASTVT这两个概念后,我们就可以用算法构造优先关系表

image
我们只需对每个产生式检查一遍,把所有优先关系都找到就可以了

如何求FIRSTVT和LASTVT

image
image

算符优先分析算法

素短语:至少包含一个终结符,并且除了它自身外不包含任何更小的素短语,最左素短语就是句型最左边的素短语
我们考虑句型:

#N1a1N2a2...NnanNn+1#

其中每一个ai都是终结符,Ni都是可有可无的非终结符。
一个算符优先文法G的任何上述句型的最左素短语是满足如下条件的最左子串Njaj...NiaiNi+1
image
算法
image

优先函数

我们在通常实现上面算法的时候在判断优先关系的时候一般不采用查表的方法而是用两个优先函数,优先函数可以将原来NN的时间复杂度降低到2N,缺点是原来可能两个符号不可比较优先级,但是经过优先函数之后会映射到自然数从而导致可以比较,这样会导致一些错误
image
f被称为栈优先函数
g被称为比较优先函数
如何构造优先函数(证明过程略)
image
经过构造完的优先函数需要我们进一步检验是否正确

posted @   cxy8  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2022-11-13 总结
点击右上角即可分享
微信分享提示