清华大学编译原理第七章 LR分析法

合集下载

7 编译原理-LR分析法

7 编译原理-LR分析法
若项目 A1.B2 对活前缀 = 1 是有效的,且
B 是产生式,则项目 B . 对活前缀 = 1 也是有 效的。
:伽马 :艾塔
据假设,存在一个规范推导S *Aw 1 B 2w
设2w
*
rm
xw,
则对任何B
有规范推导
S *Aw 1 B 2w 1 B xw 1 xw
所以 B . 对活前缀 1 也是有效的。
r1 r1 r1 r1
r2 r2 r2 r2
r3 r3 r3 r3
r5 r5 r5 r5
r4 r4 r4 r4
r6 r6 r6 r6
goto AB
6 7
8 9
第十四页,编辑于星期五:十点 三十四分。
三、LR分析器的结构和工作过程
LR分析器的结构如图,它的工作过程由算法1描述。
输入 a1 ... ai ... an #
+
I6 E E+ T
T E E+ T T T*F
I9
T T*F
(
T F F (E)
F I3
*
I4 F ( E)
E E+T E T
( T T*F
T F F (E)
F id
id
T
I8
I5
I7
F
I2
E F (E ) E + E+T
I6
I3
F id
(
id
I5
)
F (E) I11
F I3 T F
4. 其余情况报错.
第十八页,编辑于星期五:十点 三十四分。
SLR分析算法
算法2 (构造SLR分析表)
输入:一个拓广文法G
输出:对于G的分析表的action 子表和goto子表

编译原理_06_07LR语法分析方法与中间代码

编译原理_06_07LR语法分析方法与中间代码
27
属性可以分为综合属性和继承属性两类。综合属性一 般用于自下而上传递信息,而继承属性常常用于自上而 下传递信息。下述为简单算术表达式求值的属性文法: 规则 语义规则 1. S→E print(E.val) 2. E→E1+T E.val := E1.val+T.val 3. E→T E.va1 := T.valv 4. T→T1 F T.val := T1.val F.val 5. T→T1 T.val := T1.val 6. F→(E) F.val := E.val 7. F→digit F.val := digit.lexval 每一个非终结符都有一个表示整数值的属性val。规 则左部符号E、T、F的属性值取决于各自规则的右部, 称为综合属性;对于文法符号S,其属性是虚的或空的。
6
2. 分析器的动作决定于栈顶状态和当前输入符号,有 四种可能:
(1) 移进:栈顶未出现句柄,当前输入符号进符号栈, 状态转换,新的状态进状态栈; (2) 归约:栈顶出现句柄,按某个产生式进行归约。 归约后的文法符号进符号栈,同时根据状态转换 表,新状态进状态栈。 (3) 接受(acc) :符号栈只剩开始符且当前输入符号为 ‘#’,则分析成功。 (4) 出错(error) :栈顶状态与当前输入符不匹配。
17
例如:若有项目集{ A· , B· }此时 栈顶为,根据项目集无法确定是移进还是归约。 项目集是不相容的。
2. LR(0)分析表的构造 构造原则: 设有文法 G[S],则LR(0)分析表的构造规则为: 对于A · XIk,且GO (Ik,X)= Ij 若X Vt,则置action[Ik,X]= Ij 若X Vn,则置goto[Ik,X]=j
15
(5) 项目类型: 项目类型有归约项目、移进项目、待约项目 和接受项目。 归约项目:圆点后符号为 的项目称为归约 项目。 如:A · 此时已对分析结束,栈顶句柄形 成,从而可按相应的产生式进行归约。 移进项目:符号为终结符的项目称为移进项 目。如A · X , X VT 此时X进符号栈,相应状态进状态栈。 待约项目:圆点后符号为非终结符的项目, 称为待约项目。此时期待着向X进行归约。

第七章LR分析法

第七章LR分析法

识别活前缀的DFA
拓广文法G[S]: 句子abbcde的可归前缀:
S’ → S[0]
S[0]
S → aAcBe[1] ab[1]
A → b[2]
aAb[3]
A → Ab[3]
aAcd[4]
B → d[4]
aAcBe[1]
识别活前缀及可归前缀的有限自动机
0S 2a
a 5
a 9
14 a
1*
b
3
4
6 A7b
第7章 LR分析法
LR分析法
自底向上分析法的关键是如何在分析过程中 确定句柄
LR分析法给出一种能根据当前栈中的符号 串进行分析的方法,即:向右查看输入串的 K个符号就可以唯一确定分析器的动作是移 进还是归约;用哪个产生式归约。
因而也就能唯一地确定句柄 R 最右推导
规范推导 规范句型 规范归约
LR分析算法
then begin pop || 令当前栈顶状态为S’ push GOTO[S’,A]和A(进栈)
end else if ACTION[s,a]=acc
then return (成功) else error end.重复
7.2 LR(0)分析
例 G[S]: S aAcBe A b A Ab B d
⇔aAcBe[1]
用(1)规约,前部aAcBe[1]
⇔S
这些前部符号串为归约时在栈里的符号串, 规范句型的这种前部称为可归前缀。
可归前缀和子前缀
分析上述每个前部的前缀,对应分别为:
ab[2]
,a,ab
aAb[3] ,a,aA,aAb
aAcd[4] ,a,aA,aAc,aAcd
aAcBe[1] ,a,aA,aAc,aAcB,aAcBe

第07章、LR分析法

第07章、LR分析法
一种比较实用的构造方法:------由文法的产生式直 接构造识别活前缀和可归前缀的有限自动机。
10
三、 LR分析器
1. LR分析器的组成 由3部分组成:总控程序、分析表、分析栈。 2. LR分析器的构造 (1) 构造识别文法活前缀的确定有限自动机 (2) 根据该自动机构造相应的分析表(ACTION表、GOTO表)
圆点不在产生式右部最左边的项目称为核,唯一的 例外是S’ → • S。因此用GO(I,X)转换函数得到的J为 转向后状态所含项目集的核。 使用闭包函数(CLOSURE)和转换函数(GO (I,X)) 构造文法G’的LR(0)的项目集规范族,步骤如下: (1) 置项目S’→ • S为初态集的核,然后对核求闭包 CLOSURE({S’→ • S})得到初态的项目集; (2) 对初态集或其它所构造的项目集应用转换函数GO (I,X)= CLOSURE(J)求出新状态J的项目集; (3) 重复(2)直到不出现新的项目集为止。
28
例:文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
a S2 ACTION c e b d # acc S5 r2 r3 r4 r1 S4 S6 r2 r3 r4 r1 3 r2 S8 r3 r4 r1 r2 r3 r4 r1 GOTO S A B 1
是否推导出abbcde?
每次归约句型的 前部分依次为: ab[2] aAb[3] aAcd[4] aAcBe[1]
9
二、LR分析要解决的问题
• LR分析需要构造识别活前缀的有穷自动机
可以把文法的终结符和非终结符都看成有 穷自动机的输入符号,每次把一个符号进 栈看成已识别过了该符号,同时状态进行 转换,当识别到可归前缀时,相当于在栈 中形成句柄,认为达到了识别句柄的终态。

编译第七章LR分析方法

编译第七章LR分析方法


LR 文法 对于一个上下文无关文法 , 如果能够构造一 张 LR 分析表, 使得它的每一个入口均是唯 一的(Si,rj,acc,空白),则称该上下文无关 是LR 文法.
15
7.1 LR分析概述

对于一个文法,状态集是如何确定的? LR分析表是如何构造的? 引入可归前缀与活前缀概念
16
7.1 LR分析概述
9
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
步骤 符号栈
1) 2) 3) 4) 5) 6) 7) # #a #ab #aA #aAb #aA #aAc
输入符号串
abbcde# bbcde# bcde# bcde# cde# cde# de#
1) 2) # #a abbcde# bbcde#
动作
移进 移进
状态栈
0 02
ACTION
S2 S4
GOTO
对输入串abbcde#的LR分析过程
S
1 * 2 5
d
b
4 3 7
b
e

0
a
A
c B
6 9
29
8
步骤 符号栈 输入符号串
1) 2) 3) # #a #ab abbcde# bbcde# bcde#
then begin pop || 项 若当前栈顶状态为Sk push GOTO[Sk,A] 和A(进栈) end else if ACTION[Si,a]=acc (接受) then return (成功) else error (出错) end . (重复结束)
8
例6.1文法

例6.1:G[S]为: (1)S aAcBe (2)A b (3)A Ab (4)B d

wsx(编译原理第07章) LR分析法

wsx(编译原理第07章) LR分析法

LR分析法是给出一种能根据当前分析栈中的 符号串(通常以状态表示)和向右顺序查看输入 串的K个(K>=0)符号就可唯一地确定分析器的 动作是移进还是归约和用哪个产生式归约,因而 也就能唯一地确定句柄。 LR分析法的归约过程是规范推导的逆过程, 所以LR分析过程是一种规范归约过程。
LR(k)分析法可分析LR(k)文法产生的语言 –L :从左到右扫描输入符号, –R :最右推导对应的最左归约(反序完成最右推导)
第七章
• • • • • •
LR分析法
LR分析概述 LR(0)分析 SLR(1)分析 LR(1)分析 LALR(1)分析 二义性文法在LR分析中的应用
第1页,102页
• 前一部分我们已讨论过,自底向上分析方法是一种移 进-归约过程。 • 先复习一下:移进-归约分析
• 上一章的优先分析方法是当分析的栈顶符号串形成句 柄时就采取归约动作,因而自底向上分析法的关键问 题是在分析过程中如何确定句柄。 • 算符优先分析法存在的问题 –强调算符之间的优先关系的唯一性,这使得它的 适应面比较窄 –算法在发现最左素短语的尾时,需要回头寻找对 应的头
S
1 * 2 5
d
b
4 3 7
b
e

0
a
A
c B
6 9
第21页,102页
8
步骤 符号栈 输入符号串
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进
S A B
8)
9) 10) 11)
# aAcd
#aAcB #aAcBe #S
e#
e# # #
归约(B→d)
移进 归约(S→aAcBe) 接受
A
对输入串abbcde#的移进-规约分析过程

编译原理第七章

编译原理第七章
符号串的前缀是指符号串的任意首部,包括
安徽理工大学
《编译原理》 信息安全系 赵宝
2
空串ε。
定义:对于文法G[S],若有
S
* r
αβ,β∈Vt*
则称α为规范前缀,也称为活前缀。
若α是含句柄的活前缀,并且每个句柄是α 的后缀或本身,则称α是可归规范前缀或可归 前缀(含有句柄的活前缀)。
活前缀不含句柄之右的任何符号。 是规范
由此可见,构造LR分析器的主要工作是构造 分析表
•LR分析表的组成: LR分析表由分析动作(ACTION)表和状态转换 (GOTO)表组成。
1). 分析动作表
安徽理工大学
《编译原理》 信息安全系 赵宝
ቤተ መጻሕፍቲ ባይዱ
10
在分析动作表中,其元素由action(si,aj)来表 示。action(si,aj)表示当前分析栈的状态栈栈顶 元素为si,文法符号栈栈顶元素为aj(当前输入 符号)时,所执行的动作。
特殊符号也可以用“.”,并且要加在产生 式右部的任何地方,表示一个位置。
➢项目集:若干个项目组成的集合称为项目集, 又称为配置集合。
➢后继符号:项目中紧跟在特殊符号“△”后 面的符号称为该项目的后继符号。
安徽理工大学
《编译原理》 信息安全系 赵宝
18
后继符号表示下一时刻读到的符号。有如下两 种情况:
下面我们以输入串 #a,b,a# 为例,具体讲述LR分析过程。
安徽理工大学
《编译原理》 信息安全系 赵宝
15
状态栈 S0 S0S3
S0S2
S0S2S5 S0S2S5S4
S0S2S5S2
S0S2S5S2S5 S0S2S5S2S5S3
S0S2S5S2S5S2

《编译原理》第7章LR分析法

《编译原理》第7章LR分析法

7.2 LR(0)分析表的构造4.构造LR(0)分析表——举例G[S′]:[0] S′→S [1] S→S(S)[2] S→εG[S]:[1] S→S(S)[2] S→εG[S]:[0] S′→SS′→.SS→.S(S)S→S.(S)S→.S(S) S→.7.3 SLR(1)分析表的构造1.LR(0)方法的不足LR(0)分析表的构造方法实际上隐含了这样一个要求:构造出的识别规范句型活前缀的有穷自动机中,每个状态均不能有冲突项目,这显然对文法的要求太高,也限制了该方法的应用。

7.3 SLR(1)分析表的构造1.LR(0)方法的不足例如,对文法G[S]:0S→E1 E→E+T2 E→T3 T→T*F4 T→F5 F→(E)6 F→i1I S→E.E→E.+TT→.T*F T→.FFT E #)(*+i G[S]:7.3 SLR(1)分析表的构造2.LR(0)方法的问题分析状态{ E→T.,T→T.*F}该状态含有移进-归约冲突,在分析表中表现为重定义。

7.3 SLR(1)分析表的构造2.LR(0)方法的问题①若U→x.ay ∈Ii ,且GO(Ii,a)=Ij,a∈VT,则ACTION[i,a]=“Sj”。

②若S′→S. ∈Ii,则置ACTION[i,$]=“acc”。

③若U→x. ∈Ii ,则对任意终结符a和$,均置ACTION[i,a]=“rj”或ACTION[i,$]=“rj”。

④若GOTO(Ii ,U)=Ij,其中U∈VN,则置GOTO[i,U]=“j”。

⑤除上述方法得到的分析表元素外,其余元素均置“报错标志”。

7.3 SLR(1)分析表的构造3.解决问题的方法所以在状态{ E→T.,T→T.*F}中,只需要向前看下一输入符号是*,还是FOLLOW(E)中的符号,便可解决冲突了。

7.3 SLR(1)分析表的构造3.解决问题的方法假设一个状态Ii中含有冲突项目I i ={ U1→x.b1y1,U2→x.b2y2,…,Um→x.bmym,V1→x.,V 2→x.,…,Vn→x.}若{b1,b2,…,bm}和FOLLOW(V1)、FOLLOW(V2)、…、FOLLOW(Vn)两两互不相交,就可以采用向前看一个输入符号的方法来解决状态中的冲突。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Shift Shift Reduce: Reduce: Shift Shift Reduce: Reduce: Shift Reduce: Reduce: Reduce:
T → int E→T
T → int E→E+T T → (E) E→T S→E
8 9 9
(E + T
(E
)# Reduce:E → E + T why?不用 E → T )#
当规约到文法符号栈中只剩文法的开始符号时,并且输 入符号串已结束即当前输入符号是“#”,则分析成功。
(4)报错:
当遇到状态栈顶为某一状态下不该遇到的文法符号时, 说明输入串不是该文法的一个句子,则报错。
LR分析器

一个LR分析器由3个部分组成:
程序都是相同的。
(1)总控程序:也称驱动程序。对所有的LR分析器总控 (2)分析表(或分析函数):不同的文法其分析表不同,
或者分析程序归约时有多个产生式可选
例子 ( dangling el| if E then S else S
如输入if E then if E then S else S 分析某一时刻,栈的内容:if E then if E then S 而 else 是下一 token 归约还是移进?

SP
Input#
Si Xm 总控程序 … … S1 X1 S0 #
状态 文法符号
output
ACTION GOTO LR分析表
SP:栈指针 S[i]:状态栈 X[i]:文法符号栈
产 生 式 表
文法要求
shift-reduce or reduce-reduce 冲突(conflicts)
分析程序不能决定是shift 还是 reduce
由规范推导所得的句型称为规范句型
G[S]: S→E E→E+T|T T→(E)|int SE T (E) (E+T) (E+int) (T+int) (int+int)
规范归约
假定α 是G的一个句子,称序列α 如果该序列满足:
( 1) α
n
n

n-1
…,α 0是 α 的一个规范归约
= α
REMAINING INPUT
PARSER ACTION
1 (int + int)# 2 ( int + int)# 3 (int + int)# 4 (T + int)# 5 (E + int)# 6 (E + int)# 7 (E + int )# 8 (E + T )# 9 (E )# 10 (E) # 11 T # 12 E # 13 S #
LR(0)分析表的结构


LR(0)分析法采用规范规约。
LR(0)分析表的构造思想和方法是构造其它LR
分析表的基础。 LR(0)分析表分为两个部分:
(1)ACTION(动作表)部分: 列标志为文法的终结符号以及输入结束符#。表中的元 素为某个状态或某条规则,或接受标志acc。 (2)GOTO(转换表)部分: 列标志为非终结符号。表中的元素为要装入的状态。

LR(K)的含义:
L表示由左向右处理输入;
R表示生成了最右推导; 数字K表示使用了先行的K个符号。

LR分析法同样要用到先行集合(FIRST集合)和 后跟集合(FOLLOE集合)。

SLR(1)是“简单LR(1)”的简写,是对LR
(1)分析的改进。

LALR(1)即先行LR(1),是比SLR(1)分析
Reduce的一个特殊情况:栈中的全部内容w 归约为开始符号S (即施用 S → w) ,且 没有余留输入了,意味着已成功分析了整个 输入串. 移进归约分析中还会出现一种情况,就是出 错,比如当前的token不能构成一个合法句 子的一部分,例如上面的文法,试分析 int+)时就会发生错误。
STACK
稍微强大但却比一般LR(1)分析简单的方法。
S→E
E→T|E+T
T → int | (E)
Reduce: 如能找到一产生式 A → w 且栈中的内容是 qw (q 可能为空), 则可以将其归约为 qA。即倒过 来用这个产生式。 如上例, 若栈中内容是 (int ,我们使用产生式 T → int 并把栈中内容归约为(T Shift: 如不能执行一个归约且在输入串中还有 token , 就把它从输入串移到栈中。 如上例,假定栈中内容是 ( ,输入中还有 int+int)#.不 能对( 执行一个归约,因为它不和任何产生式的右 端匹配,所以把输入的第一个符号移到栈中,于是栈 中内容是 (int ,而余留的输入是 +int)# 。
同一文法采用的LR分析器不同时,分析表也将不同。分析 表由动作表(ACTION)和状态转换表(GOTO)组成,在 计算机里常用二维数组表示。
(3)分析栈:包括文法符号栈和相应的状态栈。都为先进
后出栈。
分析器的动作由栈顶状态和当前输入符号 决定。 LR分析器的关键部分是LR分析表的构造。

LR分析器模型
(2) α 0为文法的开始符号 (3)对任何j,0<j<=n, α
j-1是从α j
经把句柄替换为相应产生式的左部而得到的
LR分析表中动作表的四种动作
(1)移进:
把Sj=GOTO[Si,a]移入到状态栈,把a移入到文法符号 栈。(i,j表示状态号)
(2)规约:
在确定当前句柄时进行的替换操作。
(3)接受acc:
第7章 LR分析法
7.1 LR类分析法
LR分析法根据当前分析栈和输入串来确定 句柄。 LR分析过程是一种规范规约过程。 LR分析法适用于大多数无二义性的上下文 无关文法。 常用的LR分析法有:

(1)LR(0)分析法 (2)SLR(1)分析法 (3)LALR(1)分析法 (4)LR(1)分析法
若使用了E → T,在栈中形成的(E+E不是规范句 型的活前缀(viable prefixes) (E+E不能和任何产生式的右端匹配 (E+E)不是 规范句型 活前缀:是规范句型(右句型)的前缀,但不超 过句柄

移进归约分析的栈中出现的内容加上余留输入 构成规范句型
规范推导 规范句型 规范归约
最右推导:在推导的任何一步α β ,其中α 、β 是句型,都是对α 中 的最右非终结符进行替换。 最右推导被称为规范推导。
相关文档
最新文档