z第4章 语法分析 4.3 自下而上 LR分析法
第4章语法分析——自上而下分析
提取左因子后:
<IF语句> if E then S1 B; B else S2 |ε ;
第4章语法分析——自上而下分析
LL(1)分析条件:
是否满足:没有左递归,每个侯选式的首终结符集不相交这两个条 件,就一定能进行有效的自顶向下分析呢?
使A A。
如果是A A,则称为直接左递归,否则称为间接左递归。
例2:设有文法: (1) E->E+T|T
E E +T
(2) T->T*F|F
E +T
(3) F->(E)|i 现有输入串i*i+i, 其分析过程是:
E
+
T
…
产生的原因?
失败:由于使用最左推导,对左递归文法进 行自顶向下分析时,会导致死循环。
从推导的角度看,从开始符号出发,使用最左推导,试图 推导出与输入符号串相同的句子。
从语法树的角度看,从根节点出发,反复使用所有可能的 产生式,谋求输入串的匹配,试图向下构造一棵语法树, 其末端结点正好与输入符号串相同。
这是一个反复试探的过程。
第4章语法分析——自上而下分析
自顶向下分析面临的问题
第4章语法分析——自上而下分析
消除回溯的方法
反复使用“提取公共左因子”的方法来改造文法,使得文法 的每个非终结符号的各个候选式的首终结符两两不相交,来 避免回溯。
例:
设产生式为:
A→δα1|δα2|…|δαn 将其替换为:
AδA’
|…|α A’α1|α2
第4章语法分析——自上而下分析
编译原理第4章 语法分析——自上而下分析
17
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
x*y
S
IP x A y **
18
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
x*y
S
IP x A y **
19
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
一个文法消除左递归的条件
丌含以为右部的产生式
丌含回路
PP
30
例 文法G(S): S→Qc|c Q→Rb|b R→Sa|a
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
Q
Q
ⅹ
S
R
S→Qc|c Q→Rb|b R→Sa|a
35
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
消除S的直接左递归后: S→abcS | bcS | cS S→abcS | Q→Sab |ab | b R→Sa|a
关于Q和R的觃则已是多余的,化简为:
S→abcS | bcS | cS
S→abcS |
(4.4)
36
注意,由于对非终结符排序的丌同,最 后所得的文法在形式上可能丌一样。但 丌难证明,它们都是等价的。
分析输入串x*y(记为)。
x*y
S
IP
15
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
第四章 编译原理语法分析--自上而下
消除左递归 (P69.)
(1)直接左递归:文法存在产生式 A→Aα。 (2)间接左递归:文法不存在产生式 A→Aα, 但存在推导 A + Aα。
消除直接左递归的方法:引入新的非终结符号A‘,将 关于A的如下产生式 A→Aα|β (α非ε且β不以A打头) 替换为 A →βA‘ A‘ →αA‘|ε 注意:不要掉了 A‘ →ε
4
自上而下分析法的思想(P66.)
从文法的开始符号出发,逐步向下推导,不断替换和展开非 终结符,去匹配输入符号串(终结符号串、句子),即寻找输入 串的最左推导,推出句子,(---自上而下的实质) 并按与最左推导相对应的顺序,从文法的开始符号(根结)出 发,自上而下从左到右地建立输入串的语法分析树。---其末 端节点正好与输入符号串相同
3
4.2 自上而下分析法面临的问题
. 本小节首先通过例子P67:
说明自上而下分析的思想 认识自上而下分析时所遇到的主要困难
自上而下分析的主要困难是P66-68 : 文法的左递归性,可能使分析陷入无限循环 回溯的不确定性,要求将已完成的工作推倒重来 为解决这些问题,使得自上而下分析是确定的,考 虑要消除文法左递归和避免回溯。 最后构造确定的有效的自上而下分析器:递归下降 分析器
2
4.1 语法分析器的功能(P66.)
语法分析是编译程序的核心部分。
语法分析是在词法分析识别出单词符号的基础上, 分析并判定(即识别)一串单词符号(称为输入串) 的语法结构是否符合语法规则,是否是文法的一个 句子。
分析判定的方法:
建立输入串α的从文法开始符号S出发的推导 S α1 … αn α 即建立以开始符号S为根的与输入串α相匹配(即α 中的各个符号为叶结点)的语法树
编译原理第4章 语法分析(自下而上分析)
22
§4.8 LR分析法
LR分析法是一种规范归约的语法分析方法。L 表示从左到右扫描符号串,R表示构造一个最 右推导的逆过程。 这种分析法比递归下降分析法、预测分析法和 算符优先分析法对文法的限制要少得多,大多 数无二义性上下文无关文法描述的语言都可以 用LR分析法进行有效的分析。 优点:分析速度快;准时指出错误以及位置。 缺点:工作量大,具体实现较困难。
提出来的,Greis在1971年将它形式化。 这是一种古典而又实用的方法,用这种 方法分析程序设计语言中的各类表达式 尤为有效。不少编译程序使用这种方法 分析表达式,而使用其它方法分析其余 语言部分。这种方法简单直观,特别便 于手工实现。
6
一、概述
1 算符优先分析法:就是仿照算术表达式的四则运算 过程而设计的一种分析方法。这种方法首先规定 运算符之间(终结符号之间)的优先关系和结合 性质,然后,利用这种关系用比较相邻运算符之 间的优先顺序来确定句型的可归约串并进行归约。
16
3 算符优先分析算法
输入:输入符号串w和优先关系表 输出:若w是正确的句子,则接收, 否则输出错误信息。 方法:根据最左素短语定理,利用符 号栈来识别最左素短语(先找尾, 后找头),然后归约。
17
栈置初值:k:=1;s[k]:= #; 当前输入符号读入a ;
y
S[k] ∈VT
. S[j] > a
23
一、LR分析器的工作原理和过程
1、LR分析器的基本思想
所谓LR(k)分析,是指从左到右扫描和自下 而上的语法分析,且在分析的每一步,只 需根据分析栈当前已移进和归约的全部文 法符号(历史);并至多向前查看k个符号 (展望);以及目前读到的输入符号(现 实)就能确定句柄是否在分析栈的顶部形 成,从而决定当前应该采取的动作。
第四章 语法分析——自上而下分析
FOLLOW(Y) =FOLLOE(X)=end
则有LL(1)表:
begin
d
:
end s #
P begind : X end
X
d:X
sY
Y
:sY
第四章 语法分析--自上而下分析
[例3]:给出语言L={1na0n1ma0m|n>0, m>=0} 的LL(1)文 法G[S]并说明其理由。 解:观察句子,发现可分成两部分 1na0n 和 1ma0m两部 分中符号的个数n和m没有制约关系。则可改造成下列 文法:
T FT’
T’ *FT’|
F (E)| i
我们构造每个非终结符的FIRST和FOLLOW集合
解:FIRST(E) = { (, i }
FOLLOW(E’) = {+, }
FOLLOW(E’) = { ), #}
FIRST(T) = {(, i }
FOLLOW(T) = {+, ), # }
第四章 语法分析--自上而下分析
例题与习题解答
[例1]试构造与下列文法G[S]等价的无左递归文法。
G[S]: SSa|Nb|c
(1)
N Sd|Ne|f
(2)
对于(1)我们引入新非终结符S’
则: S NbS’ |cS’
[1]
S’ aS’|
[2]
将 S代入 (2)
N Ne |NbS’d |cS’d |f
5.1 自下而上分析基本问题 其基本问题包括下列问题:
5.1.1归约 5.1.2 规范归约简述
在这一部分应掌握短语和直接短语两个重要
概念
5.1.3 符号栈的使用与语法树的表示
第四章 语法分析--自上而下分析
编译原理第4章语法分析自上而下
(e) 当(d)中所有Yi * ε,(i=1,2,…n),则 FIRST(X)=FIRST(Y1)∪FIRST(Y2)∪…∪FIRST(Yn)∪{ε}
一 . 自上而下语法分析方法
给定文法G和源程序串$。从G的开始符 号S出发,通过反复使用产生式对句型中的 非终结符进行替换(推导),逐步推导出$ 。
是一种产生的方法,面向目标的方法。 分析的主旨是选择产生式的合适的侯选 式进行推导,逐步使推导结果与$匹配。
Ch4 语法分析 4.1 语法分析程序综述 4.1.2 语法分析的方法
计算Select集:
B ε | aD C AD | b
每个产生式的Select集合计算为:D aS | c
Select(SAB)= (first (AB) -{ε}) ∪Follow(S)={b,a,#}
Select(S bC)= first (bC)={b}
因为A B
Select(Aε)=(first (ε) -{}) ∪Follow (A)={c,a,#}
A ε | b B ε | aD C AD | b D aS | c
first(C)={first(A)-{}} ∪first(D) ∪first(b)={a,b, c}
first(D)={a} ∪{c}={a,c}
➢求出每个文法符号的FIRST集合后也就不难求出一个符号 串的FIRST集合
✓若符号串α∈V*,α=X1 X2 … Xn,当X1不能
∪{ε}
ε*,则置 ∈
z第4章 语法分析 4.2 自下而上 优先分析法
直观算符优先分析法
使用分析表,构造分析算法
记号使用说明:
#:语句括号(栈底 w后) θ:现行栈顶符 a:刚读入字符 OPTR:运算符栈 OPND:操作符栈(和课本稍有不同)
分析算法步骤:
①下一个输入符号读至a中;
②若a为i,则a—>OPND,转第一步; ③若a为算符且θ a,θ 为OPTR栈顶符号,则调用关于θ 的处理程序(语义程序),处理子表达式 : E(1) θ E(2) ;然后重新进入第3步;其中, E(1) 、E(2) 分别为OPND栈的次栈顶和栈顶)
定义:假设a、b∈VT, a和b在句型中:
1. 为…ab…形式; 2. 为…aAb…形式,A∈VN。
规定以下优先关系: 1. 2. a a b b a的优先性低于b a的优先性等于b
3.
4.
a
b
a的优先性高于b
a与b不可能相邻,即此符号串不是句型(出错)。
如果以上四种关系中的任意两种都不会同时成立,则可以根 据终结符号之间的归约关系进行语法分析。
直观算符优先关系表的构造方法
给定文法G:E→E+E|E*E|(E)|i 其中:VT={+,*,i,(,)} 文法G的语言是算术表达式,运算符:+、*、(、)。
1.
2.
3.
句型为E+E*E时,应先处理‚E*E”,而不是‚E+E”, 所以规定符‚+”和‚*‛存在于句型…+E*…中时, ‚+”号优先级低于‚*‛号。 句型为E+E+E时,应先处理左面的‚E+E”,所以规定 当 ‚+”存在于句型…+E+E+…中时,左面的‚+”号 优先级高于‚+”号。 句型为(E)*E 时,应先处理‚(E)”,所以规定终极符 ‚(”与‚)”的优先级相同。
编译原理完整课件_第4章 语法分析-自上而下分析
2022/3/20
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
➢ 顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
➢ 自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
设 ,有P→Pα|β,若α≠>ε,β不以P开头 (否则不可能消除左递归)。
则改写为:
可消除左递归。
2022/3/20
中南大学软件学院 陈志刚
12
第四章 语法分析-自上而下分析
一般地,若 αi≠ε,βj不以P开头, 则可改写为:
从而消除直接左递归。 ■ 例:S→Sabc|Sab|ab ■ 消除直接左递归得:
2022/3/20
中南大学软件学院 陈志刚
13
2、完全消除左递归 分析
第四章 语法分析-自上而下分析
虽不含直接左递归,但
所以含有左递归。
■ 如果文法G不含回路( ),也不含ε产生式,
则下列算法可消除左递归(完全)
①把G的非终结符按任意顺序排列成P1,…,Pn
②for i:=1 to n do
begin for j:=1 to i-1 do
➢ 关键:对一个文法,当给你一串(终结)符号 时,怎样知道它是不是该文法的一个句子呢? 这就要判断,看是否能从文法的开始符号出发 推导出这个字符串。或者,从概念上讲,就是 要建立一棵与输入串相匹配的语法分析树。
2022/3/20
中南大学软件学院 陈志刚
理学语法分析自底向上分析方法LR分析
3
4.5 LR分析器 ❖LR分析器的逻辑结构:
LR分析程序——固定不变的 分析表——动作表(action)、状态转移表
(goto) 栈——状态符号、文法符号 输入缓冲 输出——产生式序列
4
4.5 LR分析器
❖LR分析器运行:
根据当前栈顶状态符号与输入符号查分析表 决定下一步动作
假设当前 (s0X1s1X2s2…Xmsm, aiai+1…an$) 1、action [sm, ai] = shift s
可归前缀:包含完整句柄的活前缀
12
4.5 LR分析器
可以证明:一个文法的规范句型的所有活前缀 构成一个语言,而且是正规语言,可以用一个 DFA 来识别
** 并且可以由该 DFA 来决定下一步分析动作(根据当 前活前缀的识别态)
13
4.5 LR分析器
例子:
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
❖LR分析过程中的性质与特点:
栈中的文法符号串并上剩余的输入串构成一个右句 型(规范句型)
当该右句型的句柄出现在栈顶时,归约,否则,移进
栈中的文法符号串是当前(右)句型的前缀,该前缀不
包含当前句型的句柄后面的符号,称之为 活前缀
11
4.5 LR分析器
活前缀:上例 aAbcde , a , aA , aAb
18
4.5 LR分析器
项目集的闭包(closure) I 在 closure ( I ) 中
若 A→α·Bβ在 closure ( I ) ,且 B→γ是产生 式,将 B→·γ添加到 closure ( I ) 中
例: 求 closure ( { E’ ·E } )
自下而上的LR分析
自下而上的LR分析
一、语法分析复习讨论
语法分析的目的是建立到输入句子的推导, 语法分析的目的是建立到输入句子的推导, 换言之就是建立由文法开始符号到输入句子的推 导。 建立方式有两种:一是推导分析法,即由 建立方式有两种:一是推导分析法, 文法开始符号开始,根据将要输入的符号, 文法开始符号开始,根据将要输入的符号,寻找 合适的候选式进行推导, 合适的候选式进行推导,最终推导出输入的句子 或称与输入符号串相匹配); );另一是归约分析 (或称与输入符号串相匹配);另一是归约分析 即依次读入输入符号, 法,即依次读入输入符号,待出现短语后将其归 约成推导符号,最终归约到文法开始符号。 约成推导符号,最终归约到文法开始符号。
二、LR(0)分析
规范句型活前缀定义: 规范句型活前缀定义:设αβ是一个规范句 是一个规范句 最右推导句型),如果规范句型αβ之句柄 ),如果规范句型 型(最右推导句型),如果规范句型 之句柄 的后缀或不是α的子串 是α的后缀或不是 的子串,则称 是一个规范句 的后缀或不是 的子串,则称α是一个规范句 的活前缀。 型 的活前缀。 注:称α是活前缀的意义是 )存在一个符 是活前缀的意义是1) 号串β使得 是一个规范句柄; ) 中不含句柄 使得αβ是一个规范句柄 号串 使得 是一个规范句柄;2)α中不含句柄 或刚好含有句柄而其后无其他符号。 或刚好含有句柄而其后无其他符号。 例:
已知如下文法: 例:已知如下文法 已知如下文法 S A|B A aAb | c B aBb | d
栈中符号 aaac aaaA aaaAb aaA
第4章语法分析3 LR分析法概述
S2 x2
… …
Sm xm
ai…an #
5 6
7
以符号对去查表:
8 9
10
2024/8/10
LR分析表
action
ab c
S4
S5
r1 r1 r1
r2 r2 r2
rS44
r4
S5 r4
r6 r6 r6
S8 r3 r3 r3
S10 r5 r5 r5
计算机教研室
d# S6
acc r1 r1 r2 r2 S6 r4 r4 r6 r6
4 5
rS44
r4
S5 S6 r4 r4
6 r6 r6 r6 r6
7
S8
8 r3 r3 r3 r3
9
S10
10 r5 r5 r5 r5
分析成功!
计算机教研室
GoTo
#
SAB
1 23
acc r5
G [S]
0 S→S 1 S→A 2 S→B 3 A→aAb 4 A→c 5 B→aBb 6 B→d
1 S→A
并假设我们现在已经有了LR分析表,
2 S→B
则输入串#aacbb的分析过程为:
G[S] 3 A→aAb
0
a acbb #
#
由查表得action[0,a]=S4
04 #a
acb b # 再由查表得action[4,a]=S4
4 A→c 5 B→aBb 6 6 B→d
2024/8/10
计算机教研室
4-4-2 LR分析法
12
——LR(0)分析法 二、规范句型活前缀
1、前缀:字符串的任意首部。 Ex:字符串abc,前缀有:,a,ab,abc。
编译原理第四章语法分析-自上而下分析
• 例 4.4
4.4 递归下降分析程序构造
• 递归下降分析器:
这个分析程序由一组递归过程组成的,每个过程对应 文法的一个非终结符。 E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i
PROCEDURE E BEGIN T ; E’ END PROCEDURE E’ IF SYM=‘+’THEN BEGIN ADVANCE ; T ; E’ END
4.2 自上而下分析面临的问题
• 例4.1 假定有文法
(1) SxAy (2)A**|*
对输入串x*y,构造语法树。 • 构造过程:
(1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。
S x A y x
S
A y x
S
A y
*
*
*
(4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。
• 一个反例:
– 文法:SQc|c;QRb|b;RSa|a虽然不是直接 左递归,但S、Q、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• • • • 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj 的规则改写成 Pj+11|1|…k| 。其中 Pj1|1|…k 是关于 Pj 的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。
第四章 语法分析--自上而下分析
F
i+ i i
T’
+
F i
T
从T ’出发继续匹配,而输入字符 + 不 输入First(T’),但有T ’ ,所以 T’ 自动匹配
E’
i+ i
自动匹配的条件:当a是允许在文法的某个句 型中跟在A后的终结符时,A才能自动匹配。
P P A 1|2|…|n |1|2| … |m(每个不以开头) A|1|2| … |m 1|2|…|n
自动匹配——文法不含左递归,也满足任何非 终结符的所有首符集两两不相交的要求,要进 行有效的自上而下的语法分析,还要考虑空字 的自动匹配问题。
例子:对文法4.2 输入串i+i自上而下的分析: 由于E只有一个后选式TE’,i First E = i +i (TE’),所以用E TE’进行推导 T E’
= First(()并First(i)={(, i}
T ::=FT’
FIRST(E’)= First( + TE’ )并 First( )
= {+, }
FIRST(T’)= First( *FT’ )并 First( )
= {*, }
提取公因子——将文法改造成任何非终结符的 所有首符集两两不相交的方法
4.2 自上而下分析面临的问题
• 自上而下分析的实质:从推导的角度看,
从文法的开始符号出发,自上而下,推出句子。 (一般是最左推导)
• 自上而下分析的主旨:对任何输入串,试
图尝试一切可能的办法,文法的开始符号(根 节点)出发,试图自上而下建立一个语法树, 其末端节点正好与输入符号串相同。
第四章语法分析-自上而下分析
第四章语法分析—自上而下分析知识结构:带回溯分析法回溯自上而下分析面临的问题左递归问题的解决语法分析-求FIRST、FOLLOW集合的算法自上而下分析 LL(1)分析法证明LL(1)文法构造LL(1)分析表递归子程序的构造思想递归子程序法递归子程序的特点递归子程序的设计第一节语法分析综述一、语法分析的任务按照语言即定的语法规则,对字符串形式的源程序进行语法检查,并识别出相应的语法成分。
即语法结构是否符合语法规则。
二、语法分析器在编译程序中的地位(一遍扫描)三、语法分析方法通常把语法分析方法分为两大类,既自上而下分析与自下而上分析。
1、自上而下分析方法实际上是一种产生的方法,分析过程是一个推导过程。
⑴自上而下分析过程从文法G的开始符号S出发,通过反复使用产生式,逐步推导出与输入的符号串完全相匹配的句子。
采用最左推导,以文法开始符号为根结点,逐步为输入串自上而下地构造一棵语法树。
面临的输入符号为a,A所有的产生式:A→α1|α2|⋯|αn①若a∈FISRT(αi),则指派去执行匹配任务。
②若a不属于任何一个候选首字符集,则:a、若ε属于某个FISRT(αi)且a∈FOLLOW(A),则让A与ε自动匹配;b、否则,a的出现是一种错误。
例:设有文法G和输入符号串W:a*a+aG:S → aA∣aA → BaA∣εB → +∣ -∣*∣/推导过程:S⇒aA⇒aBaA⇒a*aA⇒a*aBaA⇒a*a+aA⇒a*a+a=W构造语法树:Sa AB a A* B a A⑵自上而下分析法自上而下分析法又可分为确定和不确定的两种。
①不确定的分析法(带回溯)是一种穷举的试探方法,效率低、代价高,极少使用。
②确定的分析法(不带回溯)实现方法简单、直观,便于手工构造或自动生成语法分析器,是目前常用的方法之一。
但是对文法有一定的限制。
2、自下而上分析法⑴自下而上分析过程分析过程是归约过程。
从给定的输入串W开始,不断寻找与文法G中某个产生式P的侯选式(右部)进行匹配,并用P代替也称为归约。
第04章_自上而下语法分析(1)
4.2.2 文法的左递归性和回溯的消除 我们分析发现引起回溯的原因是: 在 文法中,当某个非终结符A有多个候选式时: A → α1 | α2 | α3 |······| αn 遇到用A去匹配当前输入符号a时, 无法确定选用唯一的一个候选式,而只 能逐一进行试探,从而引起回溯。具体 表现在下面两种情况。
求FIRST集合的方法
求FIRST集合时,依次考察每一个产生式: 对于形如: A→α|β的产生式: 1:产生式左部:FIRST(A)=FIRST(α)∪FIRST(β). 2:产生式右部α : ①若α的第一个字符为VT,则FIRST(α)={左部第一个字符}。 ②对于α=Y1Y2…Yn,Y1∈VN , 若FIRST(Y1)中不含ε,则FIRST(α)=FIRST(Y1) ; 若FIRST(Y1)中含空字,而FIRST(Y2)中不含有ε,则 FIRST(α)=(FIRST(Y1)\{ε})∪FIRST(Y2); 若FIRST(Y2)中也含有空字,而FIRST(Y3)中不含ε,则 FIRST(α)=((FIRST(Y1)∪FIRST(Y2))\{ε})∪FIRST(Y3); 若FIRST(Y3)中也含有空字,而FIRST(Y4)中不含ε,则……
4.2.2 文法的左递归性和回溯的消除 例2 设有文法G[A]: A→ Ac | Aad | bd | e 消去直接左接左递归后文法G[A]改写为 A → bdA' | eA' A' → cA' | adA' | ε
4.2.2 文法的左递归性和回溯的消除 2. 回溯的消除 在自上而下分析过程中,由于回 溯,需要推翻前面的分析,包括已做 的一大堆语义工作,重新去进行试探, 这样大大降低了语法分析器的工作效 率,因此,需要消除回溯。
《编译原理课程教案》第4章:自下而上语法分析
构造识别活前缀的DFA, 并根据DFA构造分析表
构造过程中需要消除直接 左递归和提取左因子等操 作
SLR(1)文法及其分析表的构造
SLR(1)文法是LR(0)文法 的简化版本,通过引入 FOLLOW集解决冲突问题
FOLLOW集表示在当前非 终结符之后可能出现的终 结符集合
ABCD
构造SLR(1)分析表时,需 要计算每个非终结符的 FOLLOW集
算符优先分析算法
01
02
03
算符优先分析算法是一 种自下而上的语法分析 方法,通过不断归约和
移进来构造语法树。
在分析过程中,需要维 护一个分析栈和一个输 入缓冲区,分别用于存 储已经分析过的部分和
待分析的部分。
根据优先关系表和分析 栈顶的元素,可以确定 下一步的操作是移进还
是归约。
算符优先分析法的局限性
《编译原理课程教案》第4章:自 下而上语法分析
contents
目录
• 引言 • 自下而上语法分析基本概念 • 算符优先分析法 • LR分析法 • 自下而上语法分析的优化技术 • 实验环节:自下而上语法分析器设计 • 章节小结与拓展思考
01 引言
编译原理课程概述
编译原理是计算机科学的一个重 要分支,研究将高级语言程序转 换为机器语言程序的原理和技术。
总结经验教训
总结实验过程中的经验教训,包括设计思路 的合理性、实现过程的难点和易错点等,为 今后的学习和工作提供参考。
07 章节小结与拓展思考
章节小结:关键知识点回顾
自下而上语法分析基本概念
从输入串开始,逐步进行归约,直到文法的 开始符号。
LR分析法
利用移进-归约思想,结合栈和状态转移表 进行语法分析。
第四章(2)自下而上语法分析
练习
给定文法G[S]:
S T a | (T) T,S | S
(a,(a,a)) 开始 #
a,(a,a))# 移进 ,(a,a))# 移进 ,(a,a))# 归约 ,(a,a))# 归约 (a,a))# 移进 a,a))# 移进 ,a))# 移进 ,a))# 归约 ,a))# 归约 a))# 移进 ))# 移进 ))# 归约 ))# 归约 )# 移进 )# 归约 )# 归约 # 移进
最左推导(Left-most Derive)
每次推导都替换当前句型的最左边的非终结符.— —与最右归约对应
最右推导(Right-most Derive) 最右推导
每次推导都替换当前句型的最右边的非终结符.— —与最左归约(规范归约)对应,得规范句型 例:设有文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d 使用最右推导: ( 2 ) (1 ) (4 ) (3 ) 因为S aAcBe aAcde aAbcde abbcde,所以 rm rm rm rm abbcde是文法G的句子.
(1) E T | E+T (2) T F | T*F (3) F i | (E) E
T E T F id1 + T F id2 * F id3
所得的结果是: 所得的结果是:用产生式序列表示语法分析树
1
#
#( #(a #(S #(T #(T, #(T,( #(T,(a #(T,(S #(T,(T #(T,(T, #(T,(T,a #(T,(T,S #(T,(T #(T,(T) #(T,S #(T #(T)
存 放 句 型 前 缀 ) 栈 X1 X2 X3 … # ( 输入串 a1 a2 a3 …… # 输出 "移进-归约" 分析程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法一:LR(0)分析表的构造步骤 方法一 LR(0)分析表的构造步骤 ①确定G的LR(0)项目 确定G LR(0)项目 ②以LR(0)项目为状态,构造一个能识别文法G的 LR(0)项目为状态,构造一个能识别文法G 项目为状态 所有活前缀的NFA 所有活前缀的NFA ③利用子集法,将NFA确定化,成为以项目集合为 利用子集法, NFA确定化, 确定化 状态的DFA根据 状态的DFA根据 DFA ④上述DFA可直接构造出LR分析表 上述DFA可直接构造出LR分析表 DFA可直接构造出LRFra bibliotek移进状态2
进行归约,即 进行归约,
(3) T T *F
例 利用上述分析表,假定输入串为 i * i + i ,描述LR分析器的工作过程。(续) 利用上述分析表, 分析器的工作过程。
状 态 (10) 016 ) (11) 0165 ) (12) 0163 ) (13) 0169 ) (14) 01 ) 符号 #E+ #E+i #E+F #E+T #E 输入串 i# # # # #
(2)归约 归约:设LR(0)分析表中的ACTION[mn,a]= rj, 归约 其中rj表示使用文法的第j个产生式A→x1x2…xp归 约;mn表示LR分析表的一个状态。 假设总控程序按S栈顶状态mn和现行输入符号a 查LR分析表,得 ACTION[mn,a]= rj 此时,S栈的状态为: m1,…,mn-p+1,…,mn 文法符号T栈的符号为: …x1x2…xp 按ACTION[mn,a]= rj 的要求:
2. 句型分析过程
设所给输入串为#i*i+i#,则总控程序分析此 输入串的过程,如表4-11所示,通过分析,说 明i*i+i是文法例4.4的句子。
例 利用上述分析表,假定输入串为 i * i + i ,描述LR分析器的工作过程。 利用上述分析表, 分析器的工作过程。
状 态 (1) 0 ) (2) 05 ) (3) 03 ) (4) 02 ) (5) 027 ) (6) ) (7) ) (8) ) (9) ) 符号 # #i #F #T 输入串 i*i+i# *i+i# *i+i# *i+i# i+i# +i# +i# +i# +i#
LR分析器总控程序 总控程序的工作十分简单,它的 总控程序 任一步只需按分析栈栈顶状态s和现行输入 栈顶状态s 栈顶状态 现行输入 符a执行ACTION[s,a]所规定的动作。 LR分析器的工作过程 LR 分析器的工作过程可看成是栈中状态 分析器的工作过程 序列、已归约串和输入串构成的三元式的 变化过程。
ACTION[1,#]=acc 接受输入串! 接受输入串!
LR文法 LR文法
①定义:对于一个文法,如果能够构造一张分 定义:对于一个文法, 析表,使得它的每个入口均是唯一确定的, 析表,使得它的每个入口均是唯一确定的,则 我们把这个文法称为LR文法。 LR文法 我们把这个文法称为LR文法。
LR( 文法:一个文法, ② LR(k)文法:一个文法,如果能用一个每 步顶多向前检查k个输入符号的LR LR分析器进行 步顶多向前检查k个输入符号的LR分析器进行 分析,则这个文法就称为LR(k)文法。 LR(k)文法 分析,则这个文法就称为LR(k)文法。
LR分析法 4.3 LR分析法
LR分析法是一种自下而上进行规范归约 规范归约的 规范归约 语法分析方法, L指自左向右扫描输入串, R指 最右推导(规范归约)。 LR分析法比递归下降分析法、LL(1)分析法 对文法的限制要少得多, 大多数无二义性CFG 无二义性CFG 无二义性 语言都可用LR分析器识别, 且速度快, 并能准 确、指出输入串的语法错误及出错位置。 LR分析法的主要缺点: 手工构造工作量相当大, 必须求助自动产生 工具。
B、句型的活前缀及文法的LR(0)分析表 句型的活前缀及文法的 分析表
①定义:文法G每一个产生式的右部添加一个圆点, 定义:文法G每一个产生式的右部添加一个圆点, 的一个LR(0)项目。设文法G LR(0)项目 称为 G的一个LR(0)项目。设文法G的某一产生式 为A→x1x2…xn,则A→x1…xi.xi+1…xn称为文法G A→x1x2…xn, A→x1…xi.xi+1…xn称为文法G 称为文法 的LR(0)项目。 LR(0)项目。 项目
给出下述文法G LR分析表 给出下述文法G的LR分析表
文法G ① 文法G
(1)E (3) T (5) F E+T T *F (E) (2) E (4) T (6) F T F i
② 分析表(图 )
③ 分析表中记号的含义 移进栈; 把下一状态 j 和现行输入符号 a 移进栈; s j: 个产生式进行归约; r j: 按第 j 个产生式进行归约; acc: 接受; acc: 接受; 空白格:出错标志, 空白格:出错标志,报错
#T* ACTION [[0, i*] ] ACTION 5, =r6 GOTO[0,F]=3#T*i =s5 0275 按第6 和 i 移进状态3 #T*F 移进 5个产生式 02710 进行归约, + 进行归约 10, ACTION [,即:] 02 #T =r3 F i (6) 01 #E 按第3个产生式 GOTO[0,T]=2
LR分析器(分析表)的分类: LR分析器(分析表)的分类: 分析器
LR(0)表构造法 表构造法。这种方法的局限性较大、但它 1. LR(0)表构造法 是建立其它较一般的LR分析法的基础。 2.简单LR(简称SLR)表构造法。虽然一些文法 2.简单LR(简称SLR)表构造法 简单LR SLR 不能构造SLR分析表,但是,它是一种比较容 易实现又很有使用价值的方法。 3.规范LR表构造法 规范LR表构造法。这种分析表能力最强,能够 3.规范LR表构造法 适用一大类文法,但实现代价高,或者说,分 析表的体积非常大。 4.向前LR表构造法 简称LALR 向前LR表构造法( LALR) 4.向前LR表构造法(简称LALR)。这种分析表的 能力介于SIR和规范LR之间,可以高效地实现。
4.3.2、 项目集规范族和LR(0)分析表 4.3.2、 LR(0)项目集规范族和 项目集规范族和 分析表
LR分析法的主要任务:构造一张LR分析表 LR分析法的主要任务:构造一张LR分析表 分析法的主要任务 LR
首先讨论一种只概括“历史”资料而不包含 推测性“展望”材料的“状态”。希望仅由这 种简 单状态就能识别呈现在栈顶的某些句柄。 下面讨论的LR(0)项目集就是这样一种简 单状态。
LR分析器的工作原理 LR分析器的工作原理 规范归约(最右推导逆过程)的关键是寻找 寻找 句柄。 句柄 LR分析法的基本思想:在规范归约过程中, 一方面记住已移进和归约出的符号串,即记住 “历史”; 另一方面根据所用产生式推测未 来可能遇到的输入符,即对未来进行“展望”。 当一串貌似句柄的符号串呈现于分析栈栈顶 时,希望能根据所记载的“历史”、“展望” 及“现实”材料来确定栈顶符号是否构成句 柄。
m:代表产生式编号 n:指出圆点的位置
C、字的前缀:指该字的任意首部 字的前缀: 如:abc前缀:ε,a,ab,abc abc前缀: 前缀 ab, 活前缀:规范句型的一个前缀, 活前缀:规范句型的一个前缀,该前缀是不含句柄之后 的任何符号。 的任何符号。
例4.5 文法为: (1)S→E (2)E→aA (3) A→cA (4) A→d 其句型 “acd”,d是句柄,活前缀为:ε;a;ac;acd 同理,在句型“acA”中,句柄是“cA”活前缀为: ε;a;ac;acA
① S栈应删除栈顶p个状态: mn-p+1,…,mn 删除后,S栈成为: m1,…,mn-p ② T栈中x1x2…xp归约成A,即T栈栈顶删除 p个文法符号,非终极符A进T栈; ③ 若 GOTO[mn-p ,A]=j,则状态j进S栈。
(3)接受 宣布分析成功,分析器停止工作。 接受: 接受 当S栈顶状态为k,现行输入符号为a,总控 程序根据“k”和“a”查LR分析表得: ACTION[k,a]=acc acc说明语法分析成功。 (4)报错 报告发现源程序有错,调用出错处 报错: 报错 理程序。 总控程序若按“k”和“a”查表得: ACTION[k,a]=空白 说明语法分析出错,所给输入串不是本 文法的句子。
s5 r6 s5 s5 s6 r1 r3 r5 s7 r3 r5
幻灯片 9
ACTION[k, a]的动作: (1)移进 设表中ACTION[k,a]= Sj,当S栈 移进: 移进 顶状态为k,现行输入符号为a,总控程序 根据“k”和“a”查LR(0)分析表,得: ACTION[k,a]= Sj 此时,Sj 表示j状态进S栈,a进T栈(文法符 号栈)。
存在不是LR的上下文无关文法 存在不是LR的上下文无关文法 LR 若一个文法的任何“移进-归约”分析器都存在下 述情况: 尽管栈的内容和下一输入符都已了解, 但仍无法确 定是“移进”还是“归约”, 或无法从几种可能的 归约中确定其一, 则该文法为非LR(1)文法。
注意: 注意:
(1) LR文法肯定是无二义的, 一个二义文法不会是 LR文法。 (2) LR分析技术可适当修改以适于一定的二义文法。
LR分析程序结构 分析程序结构 分析程序 分析表 产生器
文法
分析表
输 总控 入 程序 串
输出
分析表
一个LR分析器实质上是一个带先进后出存储器(栈) 的确定有限状态自动机。 我们将把“历史”和“展望”材料综合地抽象成某些 “状态”(自动机)。 分析栈(先进后出存储器)用来存放状态 状态。栈里的每 状态 个状态概括了从分析开始直到某一归约阶段的全部 “历史”和“展望”资料。 任何时候,栈顶的状态 栈顶的状态都代表了整个的历史和已推测 栈顶的状态 出的展望。因此,在任何时候都可从栈顶状态得知所 想了解的文法的一切信息,而没有必要从底而上翻阅 整个栈。 LR分析器的每一步工作都是由栈顶状态和现行输入 符号所唯一决定的。