当前位置:文档之家› 编译原理第七章

编译原理第七章


例题

设有文法G(L)

LE,L LE Ea Eb
文法G(L)的LR分析表如下
ACTION表
状态 0 1 2 3 4 5 S3 S4 S5 r3 r4 a S3 b S4 acc r2 r3 r4 2 6 , # E 2
GOTO表
L 1
6
r1
以输入串“a,b,a”为例,给出LR分析 器的分析过程如下表示:
步骤 1 2 3 4 5 0 03 02 025 0254 状态栈 # #a #E #E, #E,b 符号栈 输入符号串 分析动作 a,b,a# S3(移进) ,b,a# r3(规约) ,b,a# S5(移进) b,a# S4(移进) ,a# r4(规约)
6
7 8 9
0252
02525 025253 025252
S4
S6 r2 r2 S8 r3 r3 r3 r2
3
7
r4 r1
r4 r1
r4 r1
以输入串“abbcde”为例,给出LR分析器的分析过程如下表示:
步骤 1 2 3 4 5 6 7 8 9 0 02 024 023 0236 023 0235 02358 02357 状态栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcdB 符号栈 输入符号串 分析动作
7.1.2 分析表或分析函数

LR分析表是LR分析器的核心。 分析表由两个子表构成,即动作表(ACTION表)和状 态转换表(GOTO表)。它们都是二维数组形式(数组 名称分别是GOTO和ACTION)。


对于GOTO表。它的一个数组元素GOTO(Sm,Xi)代表一 个状态。表示当状态Sm面临输入符号Xi时转移到的下一个状态 (通常Xi是非终结符)。 对于ACTION表。它的一个数组元素ACTION(Sm, ai)代表一 个动作,表示当状态Sm面临输入符号ai时完成的分析动作(通 常ai是终结符)。动作可以有四种可能,分别是移进、规约、 接受和出错。
例题

设文法G(E):

EE+F|T TT*F|F F(E)|i
S3
T

当前输入字符串i+i*i,扫 描到第二个i时,分析栈 的状况如右:
S2
+
S1
E
S0
#





当前分析栈顶状态S3表示已经扫描过的输入符 号i+i已经规约成#E+T这个历史情况 通过S3这个状态,结合文法,可以预测继续扫 描的输入符号只可能是“+”,“*”,“)” 或“#”之一 进一步判断,如果扫描是“*”则可以将其移 进;如果是“+”,“)”或“#”,则应将E+T 规约到E。 可见,知道了当前状态和扫描符号,就知道了 分析所需的信息和条件,从而就可以确定应该 做的动作。 状态信息是客观存在,分析判断是主观努力, 分析表扮演重要角色。
7.2 LR(0)分析
1.


LR(0)分析的实现思想 LR(0)分析是仅仅根据当前分析栈顶状态(该状 态记录着已进行的分析历史情况)而不需要从当前 输入字符串再向前查看输入符号,来决定当前的分 析动作。 LR(0)分析的实现是基于只根据“历史”资料即 可决定当前分析栈是否已构成句柄,从而确定分析 动作。 LR(0)分析中涉及的概念、定义和术语,在其他 的LR分析中都是一样的。



7.2 LR(0)分析
3.





识别活前缀的有限自动机 LR方法实际分析过程中并不是去直接分析文法符号栈中 的符号是否形成句柄 可以把终结符和非终结符都看成一个有限自动机的输入 符号; 符号进栈,引起状态的转变; 当识别到可归前缀时,相当在栈中形成句柄,到达识别 句柄的终态。 而有限自动机包括五元素:状态集、输入符号、转换函 数、初始状态集和终态状态集。 活前缀和句柄的有限自动机可以构造分析表。但是实现 起来比较复杂,可以通过 LR ( 0 )项目集规范族构造分 析表。
例题

设有文法G(L)

SaAcBe Ab AAb Bd
文法G(L)的LR分析表如下
ACTION表 状态 0 1 a S2 acc c e b d # S 1 GOTO表 A B
2
3 4 5 6 7 8 9 r4 r1 r4 r1 r3 r3 r3 S9 r4 r1 r2 S5 r2 r2
第七章 LR分析法
华北电力大学控制与计算机工程学院
7.0 准备




LR分析法是目前编译程序的语法分析中最常用而且有效 的自下而上的分析技术,它能适用于绝大多数上下文无关 文法语言分析。 与算符优先分析法相比较,LR分析法对文法限制较少。 LR泛指一类自左向右(“L”:Left to right)对输入字符 串进行扫描且自下而上分析(“R”:分析过程构成最右推 导的逆序)的方法。 所谓LR(K)分析,是指从左至右扫描输入符号串并进行 自下而上的语法分析,且在分析的每一步,只须根据分析 栈当前已移进和规约出的全部文法符号,再向前查看K个 输入符号,就能确定适合于文法规则的句柄是否已在分析 栈顶形成,从而可以立即确定当前的分析动作。 LR分析法是一种方法,这种方法的使用形式常见四种: LR(0)、SLR(1)、LR(1)、LALR(1)。
7.1.4 LR文法




一个文法G,若能构造一个G的LR分析表,并 使它的每一个入口是唯一确定的,则文法G称 为LR文法。 一个文法G,若每步最多向前查看K个输入字 符,就能决定当前分析动作,从而按LR方法 进行分析,则称文法G为LR(K)文法。 实际上,LR(K)中的K是从“展望”未来的 角度来定义的。如果K=0,则不用“展望”未 来,只根据“历史”信息就可以作出分析动作。 所以LR(0)不用查看输入字符,只根据“历 史”信息就能判定动作。关键还是构造分析表。
7.2 LR(0)分析
4.




LR(0)项目与LR(0)项目集规范族 LR ( 0 )项目:在文法中每个产生式的右部适当位置添 加一个圆点构成项目。 例如:设文法G(S),产生式为:S A|B AaA|b| BC 则G(S)的LR(0)项目有:S A S A S B S B AaA AaA AaA Ab Ab A BC BC 这个项目将构成识别文法所有活前缀的有限自动机 NFA 的每个状态。 一个产生式可对应的项目为它的右部符号长度加1。 空产生式A的项目为: A
可规约前缀和子前缀


对例6.1文法G[S]的每条产生式编上序号,用[i]表示,加 在每个产生式尾部,使产生式变为:S→aAcBe[1]; A→b[2];A→Ab[3];B→d[4] 序号[i]不是产生式的文法符号,对输入串进行推导过程 中把序号带入,最右推导过程如下: SaAcBe[1]aAcd[4]e[1]aAb[3]cd[4]e[1] ab[2]b[3]cd[4]e[1] 它的逆过程最左规约是红色表示的2、3、4、1产生式。 每次规约前,句型的前部依次为:ab、aAb、aAcd和 aAcBe。我们称之为可规约前缀。 除上述四个前缀以外,其他的前缀都不是可规约前缀。
总控程序
Sn Sn-1 … S1 S0 Xn Xn-1 …… X1 X0
语法分析结果 输出
分析表
ACTION 表
GOTO 表
LR分析器逻辑结构示意图
7.1.1 分析栈



包括文法符号栈和相应的状态栈两个部分。 分析栈每一项包括两部分内容,即状态符号Si和文法符号 Xi。 Xi表示在分析过程中移进或规约的符号,类似“移进-规约” 分析中符号栈的顶。 状态Si概括了栈中位于 Si下边的全部信息,也就是记录分 析过程从开始到某一规约阶段的整个分析历程或预测继续 扫描可能回遇到的输入符号,即刻画了分析过程的“历史” 情况和“展望”未来信息。 分析栈处于 S0 初始状态,这时,分析栈中压入状态 S0 和 输入字符串的左界符“#”,这个时候的状态唯一刻画了栈 内当前仅有一个符号“#”的事实和预测将扫描的输入字符 应刚好是可作为句子首字符的那些符号。 类 似 地 , 状 态 Si 刻 画 了 分 析 栈 中 已 经 存 在 的 符 号 串 #X1…Xi#的情况及当前可能扫描到的输入符号的预测。



7.2 LR(0)分析
2.

最右推导通常称为规范推导.
规范句型的活前缀
定义:一个句型的任意首部,称为该句型的一个前缀。例如:abc 为某文法的句型,则 ε , a , ab , abc 皆为该句型的前缀;而 ac , bcd,c则不是。 定义:规范句型的一个前缀,称为该句型的一个活前缀。 活前缀与前缀的区别是,活前缀所属的句型一定是经规范推导得 到的句型。 在LR分析过程中,在分析的每一步,如果已被扫描的输入串无语 法错误,则此时分析栈中全部文法符号应是某一规范句型的前缀, 即活前缀。 一个LR分析器的工作过程,是一个逐步产生文法G的规范句型 的活前缀的过程。也即使说分析过程中句柄的确定和规约是通 过寻找规范句型的活前缀来实现的。 从寻找活前缀入手,来确定句柄和分析动作,从而构造 LR 分 析表。
#E,E
#E,E, #E,E,a #E,E,E
,a# S5(移进)
a# S3(移进) #1 12
025256
0256 01
#E,E,L
#E,L #L
# r1(规约)
# r1(规约) # acc(接受)




LR分析法的关键是分析表 不同的文法分析表将不同,同一个文法采用的 LR分析器不同时,分析表将不同。 分析表可分为动作表(ACTION)和状态转换 表(GOTO)两个部分。 构造不同的LR分析器关键是构造分析表。
相关主题