编译原理,课件第六章 LR分析
编译原理课件 语法分析_自下而上__LR分析思想_可归前缀和活前缀
识别文法所有活前缀的
DFA
小结
识别文法所有活前缀的DFA LR分析表 LR分析
7.2.1 可归前缀和活前缀
归约 移进 归约 移进 移进 归约 移进 归约 接受
A→b
A→Ab
B→d S→aAcBe
A
B
#abbcde# 的规范归约过程
a b b c d e
定义
• 活前缀: 规范句型的一个前缀, 这种前缀不包含 句柄之后的任何符号. • 可归前缀: 包含句柄的活前缀.
LR 分析思想
规范归约过程中可能出现在栈中的符号串 活前缀
• LR 分析思想: 构造一个DFA, 识别 规范归约过程中出现在栈中的符号串
活前缀
G:S→aAcBe A→b A→Ab B→d [1] [2] [3] [4]
S 0 a
1
*
b
3
A 4 b 5 c e B 6 8 9 d 2 7
步 符号栈 骤 活前缀 1 # 2 #a
3
4 5
剩余 动作 输入串 abbcde# 移进 bbcde# 移进
G: S→ aAcBe A→ b | Ab B→ d 1.栈里的文法符号与剩 余符号串一起构成了 规范句型 2.栈里的文法符号串 • 规范句型的前缀 • 不包含句柄之后的任 何符号 S A源自67 89
10 11
#ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
bcde# bcde# cde# cde# de# e# e# # #
编译原理LR分析(主要是LR(0)分析)
编译原理LR分析(主要是LR(0)分析)⼀、LR分析的基本原理1、LR分析的基本思想LR⽅法的基本思想就是,在规范归约的过程中,⼀⽅⾯要记住已移进和归约出的整个字符串,也就是说要记住历史;⼀⽅⾯能够根据所⽤的产⽣式的推测未来可能碰到的输⼊符号,也就是说能够对未来进⾏展望。
这样,当⼀串貌似句柄的字符串出现在分析栈的顶部时,我们希望能够根据历史和展望以及现实的输⼊符号这三部分的材料,决定出现在栈顶的这⼀串符号是否就是我们要找的句柄。
2、LR分析器的构成采⽤下推⾃动机这种数据模型。
包括以下⼏个部分:1.输⼊带2.分析栈:包括状态栈和⽂法符号栈两部分。
(s0,#)为分析开始前预先放在栈⾥的初始状态和句⼦括号。
3.LR 分析表:包括动作表和状态转移表两张表。
3、LR分析表是LR分析器的核⼼部分⼀张LR分析表包括两部分:动作表(ACTION)和状态转换表(GOTO)。
它们都是⼆维数组。
ACTION[s,a]规定了当状态s⾯临输⼊符号a时应采取什么动作(移进、归约、接受和报错),⽽GOTO[s,X]规定了当状态s⾯对⽂法符号X(终结符或⾮终结符)时的下⼀状态是什么。
显然,GOTO[s,X]定义了⼀个以⽂法符号为字母表的DFA。
不同的 LR 分析法构造LR分析表的⽅法都不同,由此产⽣了不同的LR分析法。
4、LR分析算法置ip指向输⼊串w的第⼀个符号 令Si为栈顶状态 a是ip指向的符号(当前输⼊符号) BEGIN(重复开始) IF ACTION[Si,a]=Sj THENBEGINPUSH j,a (进栈) ip前进(指向下⼀输⼊符号) END ELSEIF ACTION[Si,a]=rj(若第j条产⽣式为A→β) THEN BEGIN pop|β| 项 若当前栈顶状态为Sk pushGOTO[Sk,A] 和A(进栈) END ELSEIF ACTION[Si,a]=acc THEN return (成功) ELSE error END. (重复结束)⼆、LR(0)分析器1、可归前缀与规范句型的活前缀⽂法G[S]:(1) S → aAcBe[1](2) A → b[2](3) A → Ab[3](4) B → d[4]S ÞaAcBe[1]ÞaAcd[4]e[1]ÞaAb[3]cd[4]e[1]Þab[2]b[3]cd[4]e[1]每次归约句型的前部分依次为:ab[2]aAb[3]aAcd[4]aAcBe[1]规范句型的这种前部分符号串称为可归前缀我们把形成可归前缀之前包括可归前缀在内的所有规范句型的前缀都称为活前缀(活前缀就是可归前缀的前缀)如下:e,a,abe ,a,aA,aAbe ,a,aA,aAc,aAcde ,a,aA,aAc,aAcB,aAcBe三、LR分析(⼀)LR分析构造识别活前缀的有穷⾃动机项⽬(item):在每个产⽣式的右部适当位置添加⼀个圆点构成项⽬。
编译原理 第06章_LR分析法(3)
的。将同心集合并为: I5,12: L→i•, =/# I4,11: L→*•R, =/# R→•L, =/# I7,13: L→*R•, =/# L→•*R, =/# I8,10: R→L•, =/# L→•i, =/#
6.4 LALR(1)分析法
我们看到合并同心集后的项目集其核心 部分不变,仅搜索符合并。对合并同心集后 的项目集的转换函数为GO(I,X)自身的合并, 这是因为相同的心之转换函数仍属同心集, 例如: GO(I4,11, i)=GO(I4, i)∪GO(I11, i)= I5,12 GO(I4,11, R)=GO(I4, R)∪GO(I11, R)= I7,13 GO(I4,11, *)=GO(I4, *)∪GO(I11, *)= I4,11
0. S' →S 1. S →L=R
2. S →R 3. L →*R
4. L →i 5. R →L
6.4 LALR(1)分析法
3. 若LALR(1)项目集族中不存在归约一 归约冲突,则该文法是LALR(1)文法。对例 中的文法,由于合并同心集后不存在归约— 归约冲突,所以该文法是LALR(1)文法。
S'→•S,# I0: R→•L,# S→•L=R,# L I :R→L•,# L→• * R,# S→•R,# 10 L I2:S→L•=R,# L→•i,# L→•*R,=/# L R→L•,# * i L→•i,=/# i R I11: L→*•R,# R→•L,# I3: S→R•,# I12: L→i•,# R→•L,# * i L→• * R,# R L→ * •R,=/# I4: I13:L→*R•,# L→•i,# R→•L,=/# I5: L→i•,=/# L→•*R,=/# R * i I7: L→*R•,=/# L→•i,=/#
《编译原理LR分析》ppt课件
a
– aAb[3]
a,aA
– aAcd[4]
a,aA,aAc
– aAcBe[1]
a,aA,aAc,aAcB
LR分析程序
LR 文法 对于一个cfg 文法, 假如可以构造一张 LR 分析表, 使得它的每一个入口均是唯一的 〔Sj,rj,acc,空白〕,那么称该 cfg 是LR 文法.
LR分析
特征: – .标准的 – .符号栈中的符号是标准句型的前缀,
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进 归约(B→d) 移进 归约 承受
对输入串abbcde#的移进-规约分析过程
符号串abbcde是否是G[S]的子
S aAcBe aAcde aAbcde abbcde
步骤 符号栈 输入符号串 动作
状态栈 ACTION GOTO
1〕 #
LR〔0〕LC〔Ab〕=ab
LR〔0〕LC〔AAb〕=aAb
LR〔0〕LC〔Bd〕=aAcd 的正规式
〔 =VnVt〕上
x
0 S①
2
a 3
b④
5
a
A 6
7
b
⑧
9
a
A
c
10
11
12
d⒀
a
A
c
14 15
16
17
B 18 e ⒆
DFA
a
A
b
x
2
3
6
S
b
1
4
c
B
e
5
7
9
d
8
构造LR〔0〕工程集标准族
活前缀与句柄的关系:
G[S]:
R
=>αβω
编译原理-清华大学-第6章-LR分析法(2+1,2+1)
r1 5
三、LR分析算法
状态/符号
Sm Xm Sm-1Xm-1 …… …… …… S1 X1
0#
输入缓冲区 a1…ai…an#
LR主控 程序
动作表 转移表 action goto
产生式 序列
分析表
置ip指向输入串w的第一个符号;
状态0和符号#分别进分析栈;
令S为状态栈的栈顶状态;a是ip指向的符号;
作为DFA的初始状态。
21
3)定义状态转换函数GO (产生新的项目集)
GO(I,X)定义为CLOSURE(J),其中I,J都是项目集, X(VN∪VT), J={AX•|当A•XI}。
J 的构造方法类似于词法分析的 MOVE函数
GO(I,X)类似于 CLOSURE( MOVE(I,X))
4)构造LR(0)项目集规范族的算法
2、S′S• 称为句子识别态或接受项目;
3、转换关系:项目i为XX1…Xi-1•Xi…Xn, 项目j为XX1…Xi • Xi+1…Xn, 则从项目i画一弧线射向j,标记为Xi;
4、若项目i为X•A,其中A是非终结符,则从i项目画 弧射向所有A•的项目,V*
5、规约项目为终态用双圈表示,双圈外有*号者为接受态 18
(最左规约,规范规约)
ab[2]b[3]cd[4]e[1]
(用[2]归约)
<= aAb[3]cd[4]e[1]
<= aAcd[4]e[1] <= aAcBe[1]
(用[3]归约) (用[4]归约) (用[1]归约)
<= S
其中<=表示规约
问题:在归约过程中,那些是可归前缀?
13
4、活前缀:G=(Vn,Vt,P,S'), 若有规范推导 S′* αAωαβω,
编译原理-LR分析法 PPT
并用SLR(1)方法分析id*id+id∈L(G[E]) ?
G的拓广文法G[E]:
(0) E E
(4) TF
(1) EE+T
(5) F (E)
(2) ET
(6) F id
(3) TT*F
I0:E.E E.E+T E.T T.T*F T.F F.(E) F.id
Q = G的LR(0)项目集规范族, q0 = closure( {S.S} ), F = 所有含归约项目的有效项目集组成的集合, = go(I,X) )。
若将所有状态均视为终态,则识别活前缀的自动 机DFA M= ( = VTVN,
Q = G的LR(0)项目集规范族, q0 = closure({S.S}), F = Q, = go (I,X) )。
I8: (I4,A) AcA.
I9: (I5,B) BcB.
I10: (I4,d) Ad.
I11: (I3,d) Bd.
识别文法 活前缀的DFA
c
a
S.S
start S.aA
S
S.bB
I0
b
c
Ac.A A.cA A.d
I4 c
Sa.A A.cA A.d
I2
Sb.B B.cB B.d
J ={A X . | A . X I }
称函数go(I, X)为转移函数。
项目A X . 称为项目A . X后继。
二、识别句柄和活前缀的自动机
若文法G = ( VT, VN, S, P),则识别G的句柄的自动 机为DFA M = ( = VTVN,
B 是产生式,则项目 B . 对活前缀 = 1 也是 有效的。
编译原理 第6章课件
第6章LR分析法教学要求:1.掌握:活前缀的概念,2.理解:LR (0 ), SLR (1), LR(1)和LALR(1)分析过程,各类分析表的构造3.了解:二义性文法在LR 分析中的应用目录 6.1 LR 分析概述6.2 LR (0) 分析6.3 SLR(1) 分析6.4 LR (1)分析6.5 LALR(1)分析6.6 二义性文法在LR 分析中的应用强调算符之间的优先关系的唯一性,这使得它的适应面比较窄算法在发现最左素短语的尾时,需要回头寻找对应的头LR(k)分析法可分析LR(k)文法产生的语言– L :从左到右扫描输入符号,– R :最右推导对应的最左归约(反序完成最右推导)– k :向前读入k 个符号,以便确定归约用的产生式LR 分析法正是给出一种能根据当前分析栈中的符号串和向右顺序查看输入串的K 个( K ≥0)符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能唯一地确定句柄。
LR 分析法的归约过程是规范推导的逆过程,所以LR 分析过程是一种规范归约过程。
6.1 LR分析概述L:从左到右扫描输入串R : 最右推导的逆过程分析器模型和分析算法• LR分析特征讨论说明:S[i] 为状态栈, X[i]为文法符号栈。
状态转换表用GOTO[S i ,X]= S j 表示,规定当栈顶状态为S i ,遇到当前文法符号为X 时应转向状态S j ,X 为终结符号或非终结符号。
ACTION[S i ,a]规定了栈顶状态为S i ,遇到输入符号为a 应执行的动作。
动作有如下四种: 移进: S j = GOTO[S i ,a]移入状态栈,a 移入到文法符号栈。
归约: 栈顶形成句柄为β时,文法有产生式 A →β,若 β的长度为r ,则从两个栈顶去掉r 个符号,把A 移入符号栈,S j =GOTO[S i ,A] 移入状态栈。
接受acc 报错LR 分析算法 置ip 指向输入串w 的第一个符号 令S 为栈顶状态 a 是ip 指向的符号 重复 begin if ACTION[S,a]=S j then begin PUSH j,a(进栈)ip 前进(指向下一输入符号) end else if ACTION[S,a]=r j (第j 条产生式为A →β)then beginpop |β| 项令当前栈顶状态为S’push GOTO[S’,A]和A(进栈)end else if ACTION[s,a]=accthen return (成功)else errorend.重复LR 文法:对于一个上下文无关文法(Context Free Grammar)-cfg 文法, 如果能 够构造一张 LR 分析表, 使得它的每一个入口均是唯一的(Sj,rj,acc,空白), 则称该 cfg 是LR 文法.LR分析:特征:规范的符号栈中的符号是规范句型的前缀,且不含句柄以后的任何符号(活前缀)分析决策依据:栈顶状态和现行输入符号.• 四种技术 LR(0) SLR(1) LR(1) LALR(1)6.2 LR(0) 分析LR(0)文法--------能力最弱,理论上最重要:存在FA 识别活前缀识别活前缀的DFA 如何构造(LR(0)项目集规范族的构造)LR(0)分析表的构造一、可归约前缀和子前缀最右推导过程(每条产生式尾部加上编号)S ⇒aAcBe[1] ⇒aAcd[4]e[1] ⇒aAb[3]cd[4]e[1]⇒ab[2]b[3]cd[4]e[1]归约时在栈里的句型的前缀 归约前可在栈里的规范句型(不含句柄) 的前缀 ab[2] aaAb[3] a,aAaAcd[4] a,aA,aAcaAcBe[1] a,aA,aAc,aAcB可归约前 子前缀活前缀(viable prefixes )G=(Vn,Vt,P,S),若有S’ ⇒ αA ω ⇒ αβω,γ是αβ的前缀,则称是文法G 的活 前缀. 其中S’是对原文法扩充(S’→S)增加的非终结符.? 为使S’不出现在任何产生式的右部.活前缀是规范句型(右句型)的前缀,但不超过句柄移进归约分析的栈中出现的内容加上余留输入构成规范句型二、识别活前缀的FA启示:可以把非终结符号和终结符号都看成一个FA 的输入符号,每把一个符号 进栈时看成已识别过了该符号,而状态进行转换,当识别到可归约前缀 时,相当于在栈顶形成了句柄,则认为达到了识别句柄的终态。
编译原理LR分析法
编译原理是研究如何将高级语言程序转换成等价的低级机器语言程序的学科, LR分析法是其中一种重要的语法分析方法。
何为编译原理
编译原理是计算机科学的一个分支,研究将高级语言程序转换为等价的底层机器代码的过程。它涉及词法分析、 语法分析、语义分析、优化和代码生成等多个阶段。
LR分析法的概述
LR分析法的步骤
1
1. 构建LR项集族
基于文法的产生式,生成LR(0)项集族,
2. 构建LR分析表
2
包括起始项集和其它项集。
根据LR项集族和文法的终结符和非终结
符,构建LR分析表,包括移进、规约和
接受操作。Leabharlann 33. 进行语法分析
使用构建的LR分析表,对输入的符号串 进行逐步解析,直到接受或出错。
构建LR分析表
项集的闭包
通过对项集进行闭包运算,计算 出项集中的所有项。
项集的转移
根据项目集的状态和接收符号, 进行项集的状态转移。
规约项的处理
确定规约的产生式和规约动作, 构建规约表。
LR分析表的使用
使用构建的LR分析表,可进行能够解析输入符号串的自底向上语法分析。它 根据输入符号和栈顶符号,执行移进、规约或接受操作来推导和验证语法结 构。
优缺点和应用
优点
具有广泛适用性,支持大多 数上下文无关文法。解析效 率高,能够快速生成语法树。
缺点
对于某些复杂的语法,可能 需要构建大型的分析表。编 写LR分析器的难度较高。
应用
LR分析法被广泛用于编译器 设计、解析器生成器和语法 分析工具的开发中。
LR分析法是一种自底向上的语法分析方法,用于构建一个确定性的有限状态 自动机(LR自动机)以解析各种语法结构。它具有广泛的应用,包括编译器 设计和语法分析工具的开发。
编译原理LR分析法
编译原理LR分析法编译原理中的LR分析法是一种自底向上的语法分析方法,用于构建LR语法分析器。
LR分析法将构建一个识别句子的分析树,并且在分析过程中动态构建并操作一种非常重要的数据结构,称为句柄(stack)。
本文将详细介绍LR分析法的原理、算法以及在实际应用中的一些技巧。
1.LR分析法的原理LR分析法是从右向左(Right to Left)扫描输入串,同时把已处理的输入串的右侧部分作为输入串的前缀进行分析的。
它的核心思想是利用句柄来识别输入串中的语法结构,从而构建分析树。
为了实现LR分析法,需要识别和操作两种基本的语法结构:可规约项和可移近项。
可规约项指的是已经识别出的产生式右部,可以用产生式左部进行规约。
可移近项指的是当前正在处理的输入符号以及已处理的输入串的右侧部分。
2.LR分析法的算法LR分析法的算法包括以下几个步骤:步骤1: 构建LR分析表,LR分析表用于指导分析器在每个步骤中的动作。
LR分析表包括两个部分:动作(Action)表和状态(Goto)表。
步骤2: 初始化分析栈(stack),将初始状态压入栈中。
步骤3:从输入串中读取一个输入符号,并根据该符号和当前状态查找LR分析表中的对应条目。
步骤4:分析表中的条目可能有以下几种情况:- 移进(shift):将输入符号移入栈中,并将新的状态压入栈中。
- 规约(reduce):将栈中符合产生式右部的项规约为产生式左部,并将新的状态压入栈中。
- 接受(accept):分析成功,结束分析过程。
- 错误(error):分析失败,报告错误。
步骤5:重复步骤3和步骤4,直到接受或报错。
3.LR分析法的应用技巧在实际应用中,为了提高LR分析法的效率和准确性,一般会采用以下几种技巧:-使用LR分析表的压缩表示:分析表中的大部分条目具有相同的默认动作(通常是移进操作),因此可以通过压缩表示来减小分析表的大小。
-使用语法冲突消解策略:当分析表中存在冲突时,可以使用优先级和结合性规则来消解冲突,以确定应该选择的操作。
编译原理第6章 LR分析
• [B]=aAc 令 ={[S’],[S],[A], [B],a,
A,c} 则方程两边都是上的正规式
• [S]=[S’] • [A]=[S]a+[A] • [B]=[S]aAc
而[A]=a+[A] 即为 [A]=a | [A] 由 正规式所表示的正规集
• 得: [A]=a
G[S]: (0) S’S (1) S a A c B e (2)A b (3) A Ab (4)B d
寻找DFA
• 启示: LR(0)分析使用的信息之一是句柄左部
的内容.
• 定义(非终结符的左文)
LC(A)={ | S’* A, V*, 对拓广文法的开R 始符号S’:
Vt*},
LC(S’)={}
若有BA 则:LC(A)LC(B).{}因为: S’R* B A
G[S]: (0) S’S (1) S a A c B e
• 9 02357 #aAcB
• 10 023579 #aAcBe #
• 11 01 #S
action goto s2 s4 r2 s6 r3 s5 s8 r4 s9
r1 acc
LR分析
• 特征:
– .规范的 – .符号栈中的符号是规范句型的前缀,且不
含句柄以后的任何符号 – .分析决策依据――栈顶状态和现行输入符
L 从左到右扫描输入串 LR分析器模型
R 构造最右推导
栈
Input$(#)
总控程序
output
…
产
生
LR分析表
式
表
LR分析表
(1)S a A c B e (2)A b (3)A Ab (4)B d
LR分析表
ACTION
编译原理课件PPT 第6章
Chapter 6 Type Checking Section 2 Specification of a Simple Type Checker 3. Type Checking of Statements – S while E do S1 – {S.type= if (E.type==boolean) S1.type else type_error} – S S1;S2 – {S.type= if (S1.type==void) && (S2.type== void) void else type_error}
Chapter 6 Type Checking Section 3 Equivalence of type expressions s for type expression type link=^cell 3.Cycles in representations of types type link=^cell; cell=record info:integer; next :link end;
Chapter 6 Type Checking Section 2 Specification of a Simple Type Checker 1. A simple language 1)Grammar for source language – PD;E – DD;D | id:T – T char | integer | array [num] of T | ^T – E literal | num | id | E mod E | E[E] | E^
Chapter 6 Type Checking Section 2 Specification of a Simple Type Checker 2. Type Checking of Expressions – E E1[E2] – {E.type= if (E2.type==integer) && (E1.type==array(s,t) t else type_error} – E E1^ – {E.type= if (E1.type==pointer(t)) t else type_error}
第6章LR分析法
第6章LR分析法LR(Left to Right Rightmost)分析法,是一种自底向上的分析方法,用于构建给定文法的句子的语法树。
它是由Donald Knuth于1965年首次提出,并成为编译原理课程的重要内容之一LR分析法的核心思想是将输入的符号串从左到右进行分析,并以右边界为参考点来进行规约动作。
其中,"L"表示从左到右扫描符号串,"R"表示使用逆推的方式构建语法树,"rightmost"表示将规约动作应用于右边界才开始构建语法树。
LR分析法分为两个关键步骤:构建LR分析表和执行分析过程。
首先是构建LR分析表。
我们需要构建两个表格,即项目集规范族和LR分析表。
项目集规范族是由多个项目集构成,每个项目集是一组项目的集合。
项目是文法规则的一种特殊形式,它包含文法规则的产生式以及一个“·”,表示正在扫描的位置。
LR分析表是一个二维表,行代表项目集,列代表终结符和非终结符。
表格中的每个条目包含动作和状态信息。
接下来是执行分析过程。
分析过程中需要构建一个分析栈和一个输入缓冲区。
分析栈用来保存已经处理的符号串,输入缓冲区用来保存待处理的符号串。
在分析过程中,根据当前的状态和输入符号,查找LR分析表中的相应条目来确定下一步的动作。
根据动作的类型(移进、规约或接受),对分析栈和输入缓冲区进行相应的操作。
LR分析法的优点是可以处理任意的LR文法,而不仅仅局限于SLR或LALR文法。
它能够进行自动错误恢复,并且适用于那些上下文无关文法的语法结构分析。
然而,LR分析法也存在一些缺点。
首先,构建LR分析表需要消耗大量的时间和空间。
其次,对于一些复杂的文法,可能会出现冲突(reduce-reduce或shift-reduce冲突),需要通过手动修改文法来解决冲突。
总而言之,LR分析法是一种强大的自底向上的分析方法,能够处理广泛的文法,并提供自动错误恢复的功能。
编译原理lr分析
编译原理lr分析编译原理是计算机科学中的一个重要领域,涉及到将源代码转化为可执行代码的过程。
LR分析是编译原理中一种常用且有效的语法分析方法,它通过构建自底向上的语法分析表格,可以对大部分上下文无关文法进行分析。
1. 简介LR分析是一种基于有穷状态自动机模型的语法分析方法,它基于Look-Ahead操作来向前预测分析所需的动作。
LR分析是一种自底向上的语法分析方法,从输入串右侧开始构建句子,直到最后归约为文法的起始符号。
2. LR分析表格LR分析表格是LR分析算法的核心,它将输入符号和状态作为表格的行和列,并填充相应的动作和转移信息。
LR分析表格一般分为动作表和转移表两部分。
在动作表中,我们记录了各个状态下的移进(shift)、归约(reduce)和接受(accept)等动作。
在转移表中,记录了各个状态下的状态转移信息。
3. LR分析算法步骤LR分析算法的主要步骤如下:步骤1: 构建文法的项集族根据给定的上下文无关文法,利用闭包和转移规则构建项集族,形成项目集的有限状态机。
步骤2: 构建LR(0)自动机在项集族的基础上,通过状态间的转移关系构建LR(0)自动机,确定自动机的开始状态和结束状态。
步骤3: 构建LR(0)分析表根据LR(0)自动机,填充LR(0)分析表的动作和转移信息,用于后续的分析过程。
步骤4: 使用LR(0)分析表进行分析利用构建好的LR(0)分析表格,根据输入符号和当前状态,执行相应的移进、归约和接受动作,直到完成分析或出现错误。
4. LR分析的优势和应用相比其他的语法分析方法,LR分析具有以下优势:- 适用性广泛:LR分析适用于大部分上下文无关文法的分析,能够应对复杂的语法结构。
- 自底向上:LR分析从输入串的右侧开始构建句子,逐步归约为文法的起始符号,更为高效。
- 错误检测:LR分析能够及时发现语法错误,并给出相应的错误提示,提高了代码的可靠性和稳定性。
LR分析在实际编译器的设计和实现中得到了广泛的应用。
编译原理chapter6
宣布分析成功,退出总控程序。
第六章 LR分析法及分析程序构造 第二节 LR分析器 三、LR分析器的总控程序
4、报错
报告输入串含有错误,调用相应错误错误 处理程序。
注:1)不管哪一类分析程序,总控程序的动作 都一样。
2)LR分析器的动作情况也可以描述成机器内 部的格局间转换。
例:根据表达式文法的LR分析表分析输入串 i*i+i的LR动作过程。
状态栈
符号栈
输入串
动作
0
#
i*i+i#
05
#i
*i+i#
移进
03
#F
*i+i#
R6 归约
02
#T
027
#T*
*i+i#
R4 归约
i+i#
移进
0275
#T*i
+i#
移进
02710
#T*F
+i#
R6 归约
02
#T
+i#
R3 归约
01
#E
+i#
016
#E+
i#
R2 归约 移进
0165
#E+i
#
移进
0163
(2)与普通不带回溯的自上而下预测技术相比 也要好些。
(3)在自左向右扫描输入串时就能发现其中 的错误,并能准确地指出出错位置,其他分析 方法无法比拟。
第六章 LR分析法及分析程序构造 第一节 引言 三、LR分析法的缺点
若用手工构造分析程序,则工作量太大, 而且容易出错,因此,必须使用自动产生这种 分析程序的产生器。
4、若项目i为X•A,其中A是非终结符,则从 i项目画弧射向所有A• 的项目,V*
第六章编译原理
1. 分析栈中的文法符号+栈外余留输入串 规范句型 2. 规约实质:不断进栈,等待栈顶形成当前句型的句柄 3 句柄一定是产生式的右部候选式
关键:找出当前句型的“可归约串x”
最左素短语 算符优先分析法
句柄
L(R)文法 如何找当前句柄归约?
1.
引入一个新的状态栈来表示符号栈中的符 号目前状态 用LR分析表来表示不同状态下对于各输入 符号应采取的动作
对符号串#a,b#的分析过程 步骤 1 2 3 4 5 6 状态栈 符号栈 余留符号 产生式 ACTION/GOTO
S0
S0 S3 S0 S2 S0 S2 S5
#
#a #B #B,
a,b#
,b# ,b# b# # # # # B→b A→B A→B,A B→a
S3
γ S5 S4 γ γ γ
4, 2 2 ,6 3 ,2
1
2
3
8
2 9
3 3 10
6
7 8 9 10 11
6.4 SLR 分析表的构造
为了解决LR(0)中一个项目集合中存在“移进—归约”和“归 约—归约“冲突,而产生的。
例 6.2 P102 的LR(0) 分析表
解决冲突的办法: 对于一个状态Si的项目集: Si={A→α △β ,B→γ △,C→δ △} 其中, α , γ , δ ∈V* First(β )∈VT 存在“移进—归约” “归约—归约”冲突 若Follow(B)∩Follow(C)∩First(β )=ф 则 当输入符号为a时,(a∈VT∪’#’)
则C→△γ ∈CLOSURE(I) b. 重复b,直到CLOSURE(I)不再增加为止.
论述: 1 .把G[
S
]第一个项目 S →△S作为初始状态项目集的核
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主要内容 6.1 自下而上分析及其LR分析概述 6.2 LR (0) 分析 6.3 SLR(1) 分析 6.4 LR(1)分析 6.5 LALR分析 6.6 使用二义文法 重点、难点 LR (0) 分析、 LR(1)分析
自下而上分析算法 能力强 构造复杂 最常用和最有效的模型----移进归约(动作)
每个非终结符的左文方程组 LC(S’)={} LC(S)=LC(S’).{} LC(A)=LC(S).{a} LC(A){} LC(B)=LC(S).{aAc} 化简为: [S’]= [S]=[S’] [A]=[S]a+[A] [B]=[S]aAc
用代入法求解得: [S’]= [S]= [A]=a+[A] [B]=aAc 令 ={[S’],[S],[A], [B],a, A,c} 则方程两边都是上的正规式 而[A]=a+[A] 即为 [A]=a | [A] 由 正规式所表示的正规集 得: [A]=a
G[S]: (0) S’S (1) S a A c B e (2)A b (3) A Ab (4)B d 定义(产生式的LR(0)左文) * LR(0)LC(A)={| =且S’A , Vt*} R R 有推论:LR(0)LC(A )=LC(A).{} 则有: LR(0)LC(S’S)=S LR(0)(LC(SaAcBe)=aAcBe LR(0)LC(Ab)=ab LR(0)LC(AAb)=aAb LR(0)LC(Bd)=aAcd ( =VnVt)上的正规式
0 1 2 3 4 5 6 7 8 9 r4 r1 r4 r1 r3 r3 r2 S5 r2 S2
d
# acc
S 1
A
B
S4 S6 r2 r3 S9 r4 r1 r4 r1 r4 r1 r4 r1 r2 r3 r2 S8 r3 r3 r2
3
7
LR分析程序
推导过程 – S aAcBe[1] aAcd[4]e[1] aAb[3]cd[4]e[1] R – ab[2]b[3]cd[4]e[1]
Shift Shift Reduce: T –> int Reduce: E –> T Shift Shift Reduce: T –> int Reduce: E –> E + T Shift Reduce: T –> (E) Reduce: E –> T Reduce: S –> E
8 9 9
规约时在栈里的句型的前缀 – – 规约前可在栈里的规范句型(不含句柄) 的前缀
–
–
ab[2] aAb[3] aAcd[4] aAcBe[1]
a a,aA a,aA,aAc a,aA,aAc,aAcB
LR分析程序
文法 对于一个cfg 文法, 如果能够构造一张 LR 分析表, 使得它的每一个入口均是唯一的 (Sj,rj,acc,空白),则称该 cfg 是LR 文 法.
对输入串abbcde#的移进-规约分析过程
步骤 符号栈 输入符号串
1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) # #a #ab #aA #aAb #aA #aAc # aAcd #aAcB #aAcBe #S abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
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 #
(E + T
(E
)# Reduce:E –> E + T why?不用 E –> T )#
若使用了E –> T,在栈中形成的(E+E不是规范句 型的活前缀(viable prefixes) (E+E不能和任何产生式的右端匹配 (E+E)不是 规范句型 活前缀 是规范句型(右句型)的前缀,但不超过 句柄
LR
LR分析
特征:
.规范的 – .符号栈中的符号是规范句型的前缀, 且不含句柄以后的任何符号(活前缀) – .分析决策依据――栈顶状态和现行 输入符号.?识别活前缀的 DFA. 四种技术 – LR(0) SLR(1) LR(1) LALR(1)
–
LR(0) 分析
LR(0)文法 能力最弱,理论上最重要 存在FA 识别活前缀 识别活前缀的DFA如何构造 (LR(0)项目集规范族的构造) LR(0)分析表的构造
LR分析
活前缀
G=(Vn,Vt,P,S),若有S’ α Aω α β ω , R γ 是α β 的前缀,则称是文法G的活前缀. 其中S’是对原文法扩充(S’S)增加的非终 结符. ? 为使S’不出现在任何产生式的右部. 如G=({S},{a},{SSa,Sa},S)
* R
识别活前缀的DFA
LR分析程序
begin pop || 项 令当前栈顶状态为S’ push GOTO[S’,A]和A(进栈) » end » else if ACTION[s,a]=acc then return (成功) else error end.重复
» then
–
LR分析程序
例:
GOTO
b
S4 S6 r2
c
e
d
#
acc
S
1
A
3
B
r2
S5 r2
r2
r3
r4 r1
r3
r4 r1
r3 S9 r4 r1
r3
r4 r1
r2 S8 r3 r4 r1
r2 7
r3
rቤተ መጻሕፍቲ ባይዱ r1
LR分析算法
置ip指向输入串w的第一个符号 – 令S为栈顶状态 – a是ip指向的符号 – 重复 begin – if ACTION[S,a]=Sj – then begin PUSH j,a(进栈) – ip 前进(指向下一输入符号) – end – else if ACTION[S,a]=rj (第j条产生式为A)
G[S]: S a A c B e [1] – A b[2] – A Ab[3] – B d[4] w=abbcde#
–
Step 1 2 3 4 5 6 7 8 9 10 11
states. Syms. The rest of input 0 # abbcde# 02 #a bbcde# 024 #ab bcde# 023 #aA 0236 #aAb cde# 023 #aA 0235 #aAc de# 02358 #aAcd e# 02357 #aAcB 023579 #aAcBe # 01 #S
规范归约 假定α 是G的一个句子,称序列α 如果该序列满足: (1) α
n n
,α
n-1
…,α 0是 α 的一个规范归约
= α (2) α 0为文法的开始符号 (3)对任何j,0<j<=n, α j-1是从α j经把句柄替换为相应产生式的左部 而得到的
文法要求
shift-reduce or reduce-reduce 冲突(conflicts)
特定的一种shift-reduce实现技术 LR分析
L R 最右推导 分析器模型和分析算法 LR 分析特征讨论
LR分析器模型
栈
S1 Xm 总控程序 … … S1 X1 S0 #
状态 文法符号
Input#
output
ACTION GOTO
LR分析表
产 生 式 表
ACTION
a
0 1 2 3 4 5 6 7 8 9 S2
Reduce的一个特殊情况:栈中的全部内容 w归约为开始符号S (即施用 S –> w) , 且没有余留输入了,意味着已成功分析 了整个输入串. 移进归约分析中还会出现一种情况,就是 出错,比如当前的token不能构成一个合 法句子的一部分,例如上面的文法,试 分析 int+)时就会发生错误.
STACK
启示:LR分析使用的信息之一是句柄左部
的内容.
定义(非终结符的左文) * LC(A)={ | S’A, V*, R
Vt*},
对拓广文法的开始符号S’: LC(S’)={} 若BA 则:LC(A)LC(B).{}
G[S]: (0) S’S (1) S a A c B e (2)A b (3) A Ab (4)B d
action goto s2 s4 r2 goto(2,A) s6 r3 s5 s8 r4 s9 r1 acc
文法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#
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进
S A B
8)
# aAcd
e#
e# # #
归约(B→d)
移进 归约 接受
9) #aAcB 10) #aAcBe 11) #S
A
a b b c d e 符号串abbcde是否是G[S]的子 S aAcBe aAcde aAbcde abbcde