编译程序构造原理和实现技术

advertisement
Chapter
4.4
Bottom-Up Parsing自底向上的分析
4.4.1 OVERVIEW OF BOTTOM-UP PARSING
自底向上分析概述
4.4.2 FINITE AUTOMATA OF LR(0) ITEMS AND
LR(0) PARSING
LR(0)项的有穷自动机与LR(0) 分析
4.4.3 SLR(1) Parsing SLR(1)分析
4.4.4 General LR(1) and LALR(1) Parsing
一般的LR(1)和LALR(1)分析
4.4.1 OVERVIEW OF BOTTOM-UP PARSING
自底向上分析概述
●自底向上分析的一般形式:
$
…
…
$ StartSymbol
●
Inputstring$
…
…
$
accept
A bottom-up parser has two possible actions (besides "accept")
1. Shift(移进) a terminal from the front of the input to
the top of the stack.
2. Reduce(归约) a string α at the top of the stack to a
nonterminal A, given the BNF choice A→α.
●
example
1)已知G: S→(S) S∣ε,请应用自底向上分析方法解() L(G)?
解: (1)拓广文法
S' → S
S → (S)S|ε
(2)分析过程
S’=>S
=>(S)S
=>(S)
=>( )
[S' → S]
[S→(S)S]
[S→ε]
[S→ε]
分析栈
输入
动作
1$
2 $(
3 $(S
4 $(S)
5 $(S)S
6 $S
7 $S’
() $
)$
)$
$
$
$
$
移进
S→ε规约
移进
S→ε规约
S → (S)S规约
S’→ S规约
接受
●
example
2)已知G: E→E + n | n ,请应用自底向上分析方法解n+n L(G)?
解: (1)拓广文法
E’→E
E→E + n | n
(2)分析过程
E’=>E [E' → E]
=>E+n [E→E+n]
=>n+n [E→n]
分析栈
输入
动作
1$
2 $n
3 $E
4 $E+
5 $E+n
6 $E
7 $E’
n+n$
+n$
+n$
n$
$
$
$
移进
E→n规约
移进
移进
E→E+n规约
E’→E规约
接受
●
example
3)已知文法G[S],请应用自底向上分析方法判断accd L(G)?
S  aA
A  cA | d
解: (1)拓广文法
S’→S
S  aA
A  cA | d
(2)有穷自动机
c
S’S.
s
S
start S’→S
S.aA
s0
a
Ac.A
A.cA
A.d
s2
c
Sa.A
A.cA
A.d
s1
A
d
AcA.
s4
d
Ad.
s3
A
SaA.
s5
解: (1)拓广文法
(2)有穷自动机
S’S.
s
S’→S
S  aA
A  cA | d
start
(3)分析过程
分析栈
1 $s0
2 $ s0as1
3 $ s0as1cs2
4 $ s0as1cs2cs2
5 $s0as1cs2cs2ds3
6 $s0as1cs2cs2As4
7 $ s0as1cs2As4
8 $ s0as1As5
9 $ s0 S
10 $ S’
S
S’.S
S.aA
s0
Ac.A
A.cA
A.d
s2
c
c
a
输入
accd$
ccd$
cd$
d$
$
$
$
$
$
$
Sa.A
A.cA
A.d
s1
A
d
d
A
动作
shift
shift
shift
shift
reduce Ad
reduce AcA
reduce AcA
reduce SaA
reduce S’S
accept
AcA.
s4
Ad.
s3
SaA.
s5
●
相关术语
1) the right sentential form 右句型
S’=>S =>(S)S =>(S) => ( )
推导中的终结符和非终结符的每个中间串称为右句型。
2) 右句型的可行前缀 viable prefix(活前缀)
当前栈和输入串之间发生了间隔,例E || +n, E+ || n,…, 在每
种情况下,分析栈的符号序列被称为右句型的可行前缀。
∴E, E+, E+n都是右句型E+n的可行前缀。
3) The handle of the right sentential form 右句型的句柄
这个串,在右句子格式中发生的位置以及用来规约它的产
生式被称为右句型的句柄。
4.4.2 FINITE AUTOMATA OF LR(0) ITEMS AND LR(0)
PARSING
LR(0)项的有穷自动机与LR(0) 分析
4.4.2.1 LR(0) ITEMS
1) LR(0) ITEMS
LR(0)项
LR(0)项
a production choice with a distinguished position in its
right-hand side.
Example
if A → αis a production choice, and if β and Y are any two
strings of symbols (including the empty string s) such that βγ
= α, then A→ β·γis an LR(0) item.
●
example
1)已知G,求其项目。
S' → S
S → (S)S|ε
2)已知G,求其项目。
E’→E
E→E + n | n
解: This grammar has
three production choices
and eight items:
S' → ·S
S' → S·
S → ·(S)S
S → (·S)S
S → (S·)S
S → (S)·S
S → (S)S·
S→·
解: This grammar has
three production choices
and eight items:
E’→·E
E’→E·
E→·E + n
E→E· + n
E→E +· n
E→E + n·
E→·n
E→n·
●
相关术语
1) 项目
在文法产生式右部某个位置标有‘.’ 的产生式,称为文
法的一个LR(0)项目 。
形如 A .  的项目称为初始项目;
形如 A . 的项目称为归约项目(完整项目);
形如 A . B 的项目称为待约项目(基本项目) B∈N;
形如 A . a 的项目称为移进项目(基本项目) a∈T。
2) 有效项目
 :伽马
:艾塔
项目A1.2对活前缀  = 1 是有效的
(存在规范推导 S =>*Aw => 12w)。
若项目 A1.B2 对活前缀  = 1 是有效的,且 B
是产生式,则项目 B  . 对活前缀  = 1 也是有效的。
●
相关术语
3)有效项目集,项目集规范族
文法G的某个活前缀的所有有效项目组成的集合,称为
活前缀的LR(0)有效项目集。
文法G的所有有效项目集组成的集合,称为G的LR(0)项
目集规范族。
●
相关术语
4)项目闭包
设I是文法G的一个LR(0)项目集合,I的项目闭包
closure(I)定义如下:
(1) I  closure(I)。
(2) 若项目A   . B  closure(I),且 B   是G的产生
式,则项目B  .  closure(I)。
(3) closure(I)仅包含上述两条规则确定的LR(0)项目。
5)转移函数
若I是文法G的一个LR(0)项目集,X是G中的文法符号。
go(I, X) = closure(J) 其中J ={AX .  | A . XI }
称函数go(I, X)为转移函数。
项目A   X . 称为项目A   . X后继。
●
相关术语
6) 识别G的句柄的自动机
若文法G = ( VT, VN, S, P),则识别G的句柄的自动机为
DFA M = (  = VTVN,
Q = G的LR(0)项目集规范族,
q0 = closure( {S.S} ),
F = 所有含归约项目的有效项目集组成的集合,
 = go(I,X) )。
4.4.2.2 Finite Automata of Items 项目的有穷自动机
●
LR(0)项的NFA的转换
A→α·Xη
A→α·Xη
X
ε
X→β
A→αX · η
X→·β
●
example
1)已知G,求其DFA。
S' → S
S → (S)S|ε
解:
S' → ·S
S' → S·
S → ·(S)S
S → (·S)S
S → (S·)S
S → (S)·S
S → (S)S·
S→·
eight items
S'→·S
ε
S
S'→S·
ε
S→·(S)S
S→(S)S·
S→ ·
NFA
eight states
(
ε
S→(·S)S
ε
S
S→(S·)S
ε
ε
)
S
S→(S)·S
S'→·S
ε
S
S'→S·
ε
S→·(S)S
S→(S)S·
S→ ·
NFA
(
ε
S→(·S)S
ε
S
S→(S·)S
ε
)
S
S→(S)·S
ε
DFA
(
S'→·S
S→·(S)S
S→ ·
0
(
S→(·S)S
S→·(S)S
S→ · 2
S
S'→S·
S
(
S→(S·)S
3
)
S→(S)·S
S
S→·(S)S
S→(S)S·
5
S→ ·
4
1
●
example
2)已知G,求其DFA 。
E’→E
E→E + n | n
eight items
解:
E’→·E
NFA
E’→E·
E→·E + n eight states
E→E· + n
E→E +· n
E→E + n·
E→·E
DFA
E→E·
E'→·E
ε
E→·E+n
E
E'→E·
ε
ε
E→·n
n
E→n·
E
ε
n
+
E→E·+n
E→E+·n
E→E+n·
E'→·E
E'→E·
E→·E+n E
E→E· +n 1
E→·n 0
+
n
n
E→E+·n
E→E+n·
E→n·
2
3
4
例:已知拓广文法G[S],求其LR(0)的分析表。
S  S
S  aA | bB
A  cA | d
B  cB | d
解: (1)识别文法活前缀的DFA
S
start S.S
S.aA
S.bB
0
a
b
SS. 1 A
Sa.A
A.cA
A.d
2
核心项
闭包项
SaA. 4
Sb.B
B.cB
B.d 3
所有的闭包项都是初始项
c
d
B
c
d
Ac.A 5
A.cA A
AcA. 10
A.d
c
d
Ad.
6
SbB. 7
Bc.B 8
B.cB B BcB. 11
B.d
c
d
Bd.
9
SaA. 4
(1)识别文法活前缀的DFA
S
SS.
1
A
c
start S.S
S.aA
S.bB
0
(2)LR(0)分析表
状态
a
0
1
2
3
4
5
6
7
8
9
10
11
action
b c d
goto
$
s2 s3
S A B
1
a
b
Sa.A
A.cA
A.d
d
r1 r1
r4 r4
r2 r2
r6 r6
r3 r3
r5 r5
s5
s8
r1
s5
r4
r2
s8
r6
r3
r5
s6
s9
r1
s6
r4
r2
s9
r6
r3
r5
c
Bc.B 8 B
B.cB
B.d
r1
10
r4
r2
11
c
d
9
BcB. 11
7
r6
r3
r5
SbB. 7
Bd.
4
6
B
3 d
acc
c
d
Ad.
2
Sb.B
B.cB
B.d
Ac.A 5
A
A.cA
A.d
0 SS
1 SaA
2 SbB
3 AcA
4 Ad
5 BcB
6 Bd
AcA. 10
●
LR分析器的结构和工作过程
输入 a1 ... ai ... an $
栈 sm
Xm
sm-1
Xm-1
...
s0
LR
驱动程序
action
goto
输出
分析表
● The
LR (0) parsing algorithm LR分析算法
Let s be the current state (at the top of the parsing
stack).Then actions are defined as follows:
1.
If state s contains any item of the form A → α·Xβ, where X
is a terminal. Then the action is to shift the current input
token on to the stack.
If this token is X. and state s contains item A → α·Xβ, then
the new state to be pushed on the stack is the state containing
the item A → α·Xβ. If this token is not X for some item in
state s of the form just described, an error is declared.
2.
If state s contains any complete item (an item of the form
A→γ·), then the action is to reduce by the rule A → γ·. (唯一性)
A reduction by the rule S` → S, where s is the start state, is
equivalent to acceptance, provided the input is empty, and error if
the input is not empty.
● LR分析算法
输入:一个输入串w和文法G的一张LR分析表M。
输出:若w L(G),输出w的一个自底向上的分析;
否则,输出一个出错表示。
方法:分别置放s0到栈中和w$到输入缓冲器中;
置ip指向w$的第一个符号;
repeat forever begin
令s是栈顶状态且a是ip所指向的符号
if action[s,a] = shift s then begin
将a和s先后压入栈内;
使ip指向输入串中的下一个符号;
end
else if action[s,a] = reduce A  then begin
从栈顶弹出2*||个符号;
令s是当前栈顶状态;
把A和goto[s,A]先后入栈;
输出产生式A 
end
else if action[s,a] = accept then
return
else
error( )
end
● example
例:已知文法G[S],求其LR(0)的分析表
S  A | B, A -> aAb | c, B -> aBd | d
解:
(1)拓广文法
S’->S
S->A S->B A->aAb A->c B->aBd B->d
1) S' →.S
2) S'→S. 3) S→.A
4) S→A .
5) S→.B
6) S→B.
7) A→.aAb 8) A→a.Ab
9) A→aA.b 10) A→aAb . 11) A→.c 12) A→c.
13) B→.aBd 14) B→a.Bd 15) B→aB.d
16) B→aBd . 17)B→.d
18) B→d.
(2)识别文法的活前缀的 DFA
S ’S
S A
S B
A aAb
A c
B aBd
Bd
0
S
A
B
S B
3
A  c.
6
A aAb.
8
b
5 c
B  d.
S A
2
a
c
d
S ’S
1
d
A a.Ab
B a.Bd
A aAb
A c
B aBd
Bd
4
A
B
A aA.b
B aB.d
7
9
d
a
B aBd.
10
(2)LR(0)分析表
a
action
b c d
s4
s5 s6
状态
0
1
2
3
4
5
6
7
8
9
10
r1
r2
S4
R4
r6
goto
$
S A B
1 2
acc
r1
r2
s6
r4
r6
r1 r1 r1
r2 r2 r2
s5
r4 r4 r4
r6 r6 r6
s8
R3 r3 r3 r3 r3
s10
r5 r5 r5 r5 r5
3
7 9
● example
例:已知文法G[A],求其LR(0)的分析表,并判断((a))∈L(G)?
A (A) |a
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)LR(0)分析表
(4)分析过程
4.4.3 SLR(1) Parsing SLR(1)分析
● The
SLR(1) parsing algorithm
Let s be the current state (at the top of the parsing stack).
Then. actions are defined as follows:
1. If state s contains any item of form A → α·Xβ,where X is a
terminal, and X is the next token in the input string, then the
action is to shift the current input token onto the stack, and the
new state to be pushed on the stack is the state containing the
item A → α·Xβ.
2 If state s contains the complete item A → γ·, and the next token
in the inupt string is in Follow(A), then the action is to reduce by
the rule A → γ.
A reduction by the rule S' →S, where s is the start state, is
equivalent to acceptance; this will happen only if the next input
token is $. In all other cases, the new state is computed as
follows.
Remove the siring Y and all of its corresponding states from
the parsing stack. Correspondingly, back up in the DFA to the
state from which the construction of γ began. By construction,
this state must contain an item of the form B → α·Aβ. Push A
onto the stack, and push the state containing the item B → αA·β.
3. If the next input token is such that neither of the above two
cases applies, an error is declared .
●
Conditions
A grammar is an SLR(l) grammar if the application of the above
SLR( 1 ) parsing rules results in no ambiguity. In particular, a
grammar is SLR( 1) if and only if, for any state s, the following
two conditions are satisfied:
1. For any item A → α·Xβin s with X a terminal, there is no
complete item B → γ. in s with X in Follow(B).
2. For any two complete items A → α· and B →β· in s, Follow(A)
∩ Follow(B) is empty.
● SLR(1)分析
若有效项目集中存在冲突动作:
I = { X   . b,
A  . ,
B  . }
将b移进栈
将归约为A
将归约为B
设当前输入符号为a,
1. 若a = b, 则移进;
2. 若aFollow(A), 则用A  进行归约;
3. 若aFollow(B), 则用B  进行归约;
4. 其余情况报错.
● SLR分析算法
输入:一个拓广文法G
输出:对于G的分析表的action 子表和goto子表
方法:
1. 构造G的LR(0)项目集规范族。
2. 对于状态Ii的分析动作如下:
(a) 若A . aB  Ii且 go (Ii ,a)= Ij
action[i,a] = shift j
(b) 若A .  Ii, 对于所有a  Follow(A)
action[i,a] = reduce A , A S
(c) 若SS.  Ii, action[i, $]= accept
3. 若go(Ii, A) = Ij, AVN , 则 goto[i,A] = j
4. 分析表其余位置为error
SLR(SLR(1))算法:如果文法G按上述算法构造出的分析表
不存在冲突动作,则称G为SLR文法。类似地,不难定义
LR(0)文法。
问题. 如何定义LR(0)文法?
若将上述算法的2(b)步中的aFollow(A)改为aVT{$},
则由此修改后的算法所定义的文法,称为LR(0)文法。
● example
例:已知文法G[E],并用SLR(1)方法分析id*id+id∈L(G[E]) ?
EE+T | T
TT*F | F
F (E) | id
解: (1)拓广文法
G的拓广文法G[E]:
(0) E  E
(4) TF
(1) EE+T
(5) F (E)
(2) ET
(6) F id
(3) TT*F
(2)识别文法的活前缀的 DFA
(3)SLR(1)分析表
(4)分析过程
(2)识别文法的活前缀的 DFA I
T E E+ T  I9
E
E+

T
6
I1
T T*F
+
T T*F
E’E
T F
F I
*
E E+T
(
3
F  (E)
F id
I7
id
E
I0
I4 F  ( E)
I5
I8
E E+T T
E ’E
I2 E F  (E ) +
( E T
E E+T
I6
T T*F F
E E+T
E T
T F
I3
F  (E) id
T T*F
)
I5
( F id
T F
I11
F

(E)

F  (E)
F I3
F id
T F
I5
id
id
T
I2
I10
F id
F
E T
I7 T T*  F
T T* F 
T T*F
*
F  (E)
(
F id
G:(0) E  E (1) EE+T
I4
(2) ET (3) TT*F (4) TF
(5) F (E) (6) F id
(2)识别文法的活前缀的 DFA
E+ T  I9
I1
I6 E E+  T T E
T T*F
+
T
T*F
E’E
T F
F I
*
(
E E+T
3
F  (E)
I7
F id
id
I0
I4 F  ( E)
E
I5
E E+T
I8
T
E ’E
E T
I2 E F  (E ) +
(
I6
T T*F
E E+T
E
E+T
F
T
F
I3
E T
F  (E) id
)
T T*F
F
id
I5
(
T F
F  (E)  I11
F  (E)
F I3
T F
F id
id I5
id
I10
T
I2
F id
F
T
T*

F
I7
E T
T T* F 
*
F  (E)
T T*F
(
F id
I4
I1:E´E
E E+T
I2: E T 
I9: E E+T 
T T  *F
T T  *F
I={X  b , A  , B  }
若{b}FOLLOW(A)  FOLLOW(B)=
则,面对当前读入符号a,状态I的解决方法:
1. 若a=b,则移进。
2. 若a≠b, 且a FOLLOW(A),则用A 进行归约。
3. 若a≠b, 且a FOLLOW(B),则用B进行归约。
4. 此外,报错。
这种解决方法是比较简单的,因此称作SLR
分析,由此构造的分析表,称作SLR分析表。
对于表达式文法的例子,FOLLOW集如下:
G:
(0) E  E (4) TF
(1) EE+T (5) F (E)
(2) ET
(6) F id
(3) TT*F
I1:{ E’E EE+T}
I2:{ET T T  *F}
I9:{E E+T 
T T *F}
E‘
E
T
F
FOLLOW集
$
$,),+
$,),+,*
$,),+,*
I1:FOLLOW(E’)∩{+}=Φ
I2: FOLLOW(E)∩{*}=Φ
I9: FOLLOW(E)∩{*}=Φ
∴可用SLR(1)方法实现
Follow(E)={$, +,)}
(3)SLR分析表
ACTION
+
*
0
(
)
S4
GOTO
id
$
S5
1
S6
2
R2
S7
R2
R2
3
R4
R4
R4
R4
S4
R6
T
F
1
2
3
8
2
3
9
3
ACC
4
5
E
R6
S5
R6
R6
6
S4
S5
7
S4
S5
10
8
S6
S11
9
R1
S7
R1
R1
10
R3
R3
R3
R3
11
R5
R5
R5
R5
(4) id*id+id的LR分析过程
分析栈
(1) 0
(2) 0id5
(3) 0F3
(4) 0T2
(5) 0T2*7
(6) 0T2*7id5
(7) 0T2*7F10
(8) 0T2
(9) 0E1
(10) 0E1+6
(11) 0E1+6id5
(12) 0E1+6F3
(13) 0E1+6T9
(14) 0E1
输入串
动作
id*id+id$
*id+id$
*id+id$
*id+id$
id+id$
+id$
+id$
+id$
+id$
id$
$
$
$
$
shift
reduce by Fid
reduce by TF
shift
shift
reduce by Fid
reduce by TT*F
reduce by ET
shift
shift
reduce by Fid
reduce by TF
reduce by EE+T
accept
● example
例:已知文法G[E],求其SLR(1)的分析表,并判断n+n∈L(G)?
E→E + n | n
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)SLR(1)分析表
(4)分析过程
● example
例:已知文法G[S],求其SLR(1)的分析表,并判断( )( )∈L(G)?
S → (S)S|ε
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)SLR(1)分析表
(4)分析过程
4.4.4 General LR(1) and LALR(1) Parsing
一般的LR(1)和LALR(1)分析
● Definition
of LR(1) transitions
(part 1).Given an LR(1) item [A→α·Xγ,a], where X is any
symbol (terminal or nonterminal ), there is a transition on X
to the item [A→ αX·γ,a]
(part 2). Given an LR(1) item [A→α·Bγ,a], where B is a
nonterminal, there areε-transitions to items [B→·β,b] for
every production B →βand for every token b in First(γa).
● example
例:已知文法G[S],求其LR(1)的分析表,并判断 id:=id∈L(G)?
S → id | V := E
V→ id
E→V|n
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)LR(1)分析表
(4)分析过程
解:
(1) 拓广文法
S’ → S
S → id
S → V := E
V→ id
E→V
E→n
(2) 识别文法活前缀的DFA
0 S
S’ → .S ,$
start S → .id ,$
S → .V := E ,$
V→ .id ,:=
SS. ,$
1
id Sid. ,$ 2
V Vid. ,:=
S→V:=.E,$
:= E→.V ,$
E→.n ,$
S→V. :=E,$
V→ .id,$
3
4
S→V:=E.,$ 5
E V E→V. ,$
6
n
E→n. ,$
7
id
V→id. ,$
8
0 S
S’ → .S ,$
start S → .id ,$
S → .V := E ,$
V→ .id ,:=
SS. ,$
1
S→V:=E.,$ 5
id Sid. ,$ 2
V Vid. ,:=
S→V:=.E,$
:= E→.V ,$
E→.n ,$
S→V. :=E,$
V→ .id,$
3
4
E V E→V. ,$
6
n
E→n. ,$
7
id
V→id. ,$
8
(3) LR(1)分析表
0
1
2
3
4
5
6
7
8
id
S2
Action
:=
n
$
S
1
V
3
E
ACC
R1
R3
S4
S8
goto
S7
S6
R2
R4
R5
R3
6
5
0 S’ → S
1 S → id
2 S → V := E
3 V→ id
4E→V
5E→n
0
1
2
3
4
5
6
7
8
id
S2
Action
:=
n
$
S7
S6
R2
R4
R5
R3
(4) id:=id的LR分析过程
分析栈
(1) 0
(2) 0id2
(3) 0V3
(4) 0V3:=4
(5) 0V3:=4id8
(6) 0V3:=4V6
(7) 0V3:=4E5
(8) 0S1
S
1
V
3
E
ACC
R1
R3
S4
S8
goto
输入串
id:=id $
:=id $
:=id $
id $
$
$
$
$
6
5
0 S’ → S
1 S → id
2 S → V := E
3 V→ id
4E→V
5E→n
动作
shift
reduce by V → id
shift
shift
reduce by V → id
reduce by E → V
reduce by S → V := E
accept
● example
例:已知文法G[A],求其LR(1)的分析表,并判断((a))∈L(G)?
A (A) |a
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)LR(1)分析表
(4)分析过程
解:
(1) 拓广文法
A’ A
A (A) |a
(2) 识别文法活前缀的DFA
1
start
A.A ,$
A.(A),$
A.a ,$
0
A
AA. ,$
A(.A),$
A.(A) ,)
a A.a ,)
A(A .),$
2 A
A(.A) ,)
A.(A) ,)
a A.a ,)
(
Aa. ,$
4
3
Aa. ,)
A(A) .,$
5
(
a
)
A
(
6
A(A .),)
7
8
)
A(A) .,)
9
1
start
A.A ,$
A.(A),$
A.a ,$
0
A
4 )
7
A(A .),$
A(A) .,$
AA. ,$
A(.A),$
A.(A) ,)
a A.a ,)
2 A
A(.A) ,)
A.(A) ,)
a A.a ,)
(
5
(
Aa. ,$ 3
A
a
Aa. ,) 6
(
A(A .),)
8
)
A(A) .,) 9
(3) LR(1)分析表
0
1
2
3
4
5
6
7
8
9
(
S2
Action
)
a
S3
$
goto
A
1
ACC
S5
S6
4
R2
S7
S5
S6
8
R2
R1
S9
R1
0 AA
1 A(A)
2 Aa
0 AA
1 A(A)
2 Aa
(4) ((a))的LR
分析过程
分析栈
(1) 0
(2) 0(2
(3) 0(2(5
(4) 0(2(5a6
(5) 0(2(5A8
(6) 0(2(5A8)9
(7) 0(2A4
(8) 0(2A4)7
(9) 0A1
0
1
2
3
4
5
6
7
8
9
(
S2
Action
)
a
S3
$
goto
A
1
ACC
S5
S6
4
R2
S7
S5
S6
8
R2
R1
S9
R1
输入串
((a)) $
(a)) $
a)) $
)) $
))$
)$
)$
$
$
动作
shift
shift
shift
reduce by Aa
shift
reduce by A(A)
shift
reduce by A(A)
accept
● example
例:已知文法G[S],求其LR(1)的分析表,并判断cdcd∈L(G)?
SCC
CcC|d
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)LR(1)分析表
(4)分析过程
● Definition
of LALR(1) transitions
FIRST PRINCIPLE OF LALR(1) PARSING
The core of a state of the DFA of LR(l) items is a state of the
DFA of LR(0)-items.
◆
SECOND PRINCIPLE OF LALR(1) PARSING
Given two states s1 and s2 of the DFA of LR(l) items that have
the same core, suppose there is a transition on the symbol X
from s1 to a state t1. Then there is also a transition on X from
state s2 to a state t2, and the states t1 and t2 have the same
core.
◆
●
相关术语
1)同心项
如果两个LR(1)项目集去掉搜索符之后是相同的,则称
这两个项目集具有相同的心。
2)核
对于初始状态I0,有效项目[S.S, $]称为I0的核;而对
于非初始状态,则其中 “点不在最左端”的有效项目
称为它的核。
在LR(1)项目集规范族中, LALR分析法合并同心
项以减少状态的数目;在存储LR(1)有效项目集时,仅
存储其中的核。
由于同心项的合并,使项目的搜索符与活前缀的对
应关系不唯一,降低了分析器的识别能力。
● example
例:已知文法G[S’],求其LR(1)的分析表
SS
SaAd | bBd | aBe | bAe
Ac
Bc
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)LR(1)分析表
(4)分析过程
解:识别文法活前缀的DFA
I0 :
I2:(I0 a)
S.S
$
Sa.Ad
S.aAd $
Sa.Be
S.bBd $
A.c
S.aBe $
B.c
S.bAe $
I3:(I0 b)
I1:(I0 S)
Sb.Bd
SS.
$
Sb.Ae
A.c
B.c
$
$
d
e
$
$
e
d
I4:(I2 A)
SaA.d
I5:(I2 B)
SaB.e
I6:(I2 c)
Ac.
Bc.
I7:(I3 B)
SbB.d
I8:(I3 A)
SbA.e
若将同心项I6和I9合并,则得到项目集
I69: Ac. d/e
Bc. d/e
该项目集含“归约-归约”冲突。
I9:(I3 c)
Ac.
Bc.
I10:(I4 d)
SaAd.
I11:(I4 e)
SaBe.
I12:(I7 d)
SbBd.
I13:(I8 e)
SbAe.
$
$
d
e
$
$
合并同心项
I69: Ac. d/e
Bc. d/e
因此,文法G是LR(1)文法,但不是LALR文法。
e
d
$
$
$
$
● LALR(1)分析表的原理性构造方法
构造LR(1)项目集族, 如果它不存在冲突, 就把同心集
合并在一起。若合并后不存在归约-归约冲突,则按这个
集族构造文法LALR(1)分析表。
●
算法: LALR分析表的构造
输入:拓广文法G'
输出:对于G'的LALR(1)分析表
方法:1. 构造文法的LR(1)项目集族C={I0, I1, …, In}
2.合并C中的同心集,得到C'={J0, J1, …, Jm}
3. 从C'出发构造action表:
(a) 若[A . a,b]  Ji且 go (Ji ,a)= Jj
置action[i,a] = shift j
(b) 若[A. ,a]  Ji,置action[i,a] = r A , A S
(c) 若[SS., $]  Ji,置action[i, $]= accept
4. 若go(Ik, A) = Jj, AVN , 则 goto[k,A] = j
5. 分析表其余位置为error
● example
例:已知文法G[S],求其LALR(1)的分析表
SCC
CcC|d
解:
(1)拓广文法
(2)识别文法活前缀的DFA
(3)LALR(1)分析表
(4)分析过程
● example
例:已知文法G[S],文法G是LALR(1)文法吗?若是则构造分析
表的分析表
S  L = R | R L  *R | i R  L
Chapter
4.4
Bottom-Up Parsing自底向上的分析
4.4.1 OVERVIEW OF BOTTOM-UP PARSING
自底向上分析概述
4.4.2 FINIT AUTOMATA OF LR(0) ITEMS AND LR(0)
PARSING
LR(0)项的有穷自动机与LR(0) 分析
4.4.3 SLR(1) Parsing SLR(1)分析
4.4.4 General LR(1) and LALR(1) Parsing
一般的LR(1)和LALR(1)分析
END
Chapter
4
Syntax Analysis语法分析
4.1 语法分析器的作用
4.2 上下文无关文法
4.3 自顶向下语法分析
4.4 自底向上语法分析
END
●
作业
编译原理: 4.1 4.2 4.3
4.33 4.34 4.35
4.37 4.39
请将作业压缩成一个文件发送!
发送的文件名:班级名学号姓名章节名作业.rar
例:计科070105×××第5章作业.rar
发送地址: buctCompiler@163.com
●
上机程序要求
input
源程序
input
上下文
无关文法
程序1
output
output
LL或LR
分析表
程序2
语法
分析
程序
语法树或其他形式
Download