Professional Documents
Culture Documents
Hình 1.1. Chöông trình thöïc thi theo cô cheá dòch cuûa trình bieân dòch
- Trình thoâng dòch
Chöông trình Trình thoâng
Keát quaû
nguoàn dòch
Döõ lieäu
Hình 1.2. Chöông trình thöïc thi theo cô cheá dòch cuûa trình thoâng dòch
Ñaëc taû ngoân ngöõ laäp trình
1. Taäp caùc kyù hieäu caàn duøng trong caùc chöông trình hôïp leä
2. Taäp caùc chöông trình hôïp leä
3. Nghóa cuûa chöông trình hôïp leä
- Phöông phaùp thöù nhaát laø ñònh nghóa baèng pheùp aùnh xaï. Söû
duïng pheùp toaùn haøm: haøm Lamda.
- Phöông phaùp thöù hai: Maùy tröøu töôïng.
- Phöông phaùp thöù ba: Taäp (x,y) laø söï bieân dòch.
2. Cuù phaùp vaø ngöõ nghóa
- AÙnh xaï cuù phaùp (syntactic mapping)
<sentence>
<adjective> <noun>
the pen
Hình 1.3 Caáu truùc caây cuûa caâu tieáng Anh: the pig is in the pen
- AÙnh xaï cuù phaùp
<expression>
<expression> + <term>
<term> ∗ <factor>
<term>
<indentifier> <indentifier>
a b c
Hình 1.4. Caây cuù phaùp cuûa bieåu thöùc soá hoïc a + b * c
1.2. Trình bieân dòch
1. Caùc thaønh phaàn cuûa trình bieân dòch
1. Phaân tích töø vöïng
Nhaän daïng token.
Token: danh bieåu, haèng, töø khoùa, caùc toaùn töû pheùp toaùn, caùc kyù
hieäu phaân caùch, khoaûng traéng, caùc kyù hieäu ñaëc bieät
Ví duï:
COST := ( PRICE + TAX )*65
Ñaàu ra cuûa boä phaân tích töø vöïng:
(<id,1>) := ( (<id,2>) + (<id,3>) ) * (<num>,4)
Vieát goïn : id1 := (id2 + id3) * num4
Boä phaân tích töø vöïng thao taùc khoâng tröïc tieáp
2. Baûng danh bieåu
Ví duï: COST := (PRICE + TAX) * 65
Baûng 1.1 Baûng danh bieåu
id1 n2
:=
n1 num4
*
id2 + id3
Hình 1.6. Caây cuù phaùp cuûa phaùt bieåu
5. Phaân tích ngöõ nghóa n3
id1 n2
:=
n2 intoreal (65)
*
PRICE TAX
Hình 1.7. Caây cuù phaùp coù xöû lyù ngöõ nghóa
6. Sinh maõ trung gian
temp1 := intoreal (65)
temp2 := id2 + id3
temp3 := temp2 * temp1
id1 := temp3
n1
id1 n2
:=
n3
* num4
id2 + id3
n1
n2
id1 :=
n3
* intoreal (65)
id2 + id3
Boä sinh maõ trung gian
movF id2 , R1
movF id3 , R2
ADDF R2 . R1
mulF # 65.0, R1
Hình 1.8. Bieân dòch phaùt bieåu
movF R1 ,id1
1.3. Caùc moái lieân quan vôùi trình bieân dòch
1. Boä tieàn xöû lyù
- Xöû lyù macro (macro processing)
- Cheâm taäp tin (file inclusion)
- Boä xöû lyù hoaø hôïp (rational processor)
- Môû roäng ngoân ngöõ (language extension)
CHÖÔNG 2
TRÌNH BIEÂN DÒCH ÑÔN GIAÛN
2.1. Toång quaùt
Chuoãi kyù töï Boä phaân tích Chuoãi token Boä bieân dòch tröïc Maõ trung gian
töø vöïng tieáp cuù phaùp
9 5 5 2
a) b)
2.3. Söï bieân dòch tröïc tieáp cuù phaùp (Syntax-Directed Translation)
1. Kyù hieäu haäu toá
1) Neáu E laø bieán hoaëc haèng soá thì kyù hieäu haäu toá cuûa E chính laø E.
2) Neáu E laø bieåu thöùc coù daïng E1 op E2 vôùi op laø toaùn töû hai ngoâi thì
kyù hieäu haäu toá cuûa E laø E1’ E2’ op.
3) Neáu E laø bieåu thöùc coù daïng (E1) thì kyù hieäu haäu toá cuûa E1 cuõng laø
kyù hieäu haäu toá cuûa E.
Löu yù: Khoâng caàn coù daáu ñoùng, môû ngoaëc trong kyù hieäu haäu toá.
2. Ñònh nghiaõ tröïc tieáp cuù phaùp (Syntax-directed definition)
Vaên phaïm phi ngöõ caûnh vaø taäp luaät ngöõ nghiaõ seõ thieát laäp ñònh nghóa
tröïc tieáp cuù phaùp. Bieân dòch laø pheùp aùnh xaï töø nhaäp → xuaát. Daïng
xuaát cuûa chuoãi nhaäp x ñöôïc xaùc ñònh nhö sau:
1. Xaây döïng caây phaân tích cho chuoãi x.
2. Giaû söû nuùt n cuûa caây phaân tích coù teân cuù phaùp X, X.a laø trò thuoäc
tính a cuûa X, ñöôïc tính nhôø luaät ngöõ nghóa. Caây phaân tích coù chuù thích
caùc trò thuoäc tính ôû moãi nuùt ñöôïc goïi laø caây phaân tích chuù thích
Toång hôïp thuoäc tính (synthesized attributes)
Thí duï 2.4. Cho vaên phaïm G coù taäp luaät sinh P:
Taäp luaät sinh Taäp luaät ngöõ nghóa
exp → exp + term exp.t ::= exp.t || term.t || ‘+’
exp → exp – term exp.t ::= exp.t || term.t || ‘-’
exp → term exp.t ::= term.t
term → 0 term.t ::= ‘0’
… …
term → 9 term.t ::= ‘9’
exp.t ::= 95 – 2 +
termt ::= 9
5 + 2
9 -
Hình 2.3. Caây phaân tích chuù thích cho ñònh nghóa tröïc tieáp cuù phaùp
Löôïc ñoà dòch
Löôïc ñoà dòch laø vaên phaïm PNC, trong ñoù caùc ñoaïn chöông trình goïi laø
haønh vi ngöõ nghiaõ ñöôïc nhuùng vaøo veá phaûi cuûa luaät sinh.
Thí duï 2.5. Löôïc ñoà dòch cuûa vaên phaïm G:
Taäp luaät sinh Taäp luaät ngöõ nghóa
exp → exp + term exp → exp + term { print (‘+’)}
exp → exp – term exp → exp – term {print (‘-’)}
exp → term exp → term
term → 0 term → 0 {print (‘0’)}
…….
term → 9 term → 9 {print {‘9’)}
exp
exp
+ term {print (‘+‘)}
exp - term {print (‘-‘)}
9 {print (‘9‘)}
Hình 2.4. Löôïc ñoà dòch cuûa caâu 9 – 5 + 2
Moâ phoûng 2.1. Giaûi thuaät depth- first traversals cuûa caây phaân tích
Procedure visit (n: node);
begin
for vôùi moãi con m cuûa n, töø traùi sang phaûi do
visit (m);
tính trò ngöõ nghiaõ taïi nuùt n
end;
integer
2. Söï phaân tích cuù phaùp ñoaùn nhaän tröôùc
Daïng ñaëc bieät cuûa phaân tích cuù phaùp töø treân xuoáng laø phöông phaùp
ñoaùn nhaän tröôùc. Phöông phaùp naøy seõ nhìn tröôùc moät kyù hieäu nhaäp ñeå
quyeát ñònh choïn thuû tuïc cho kyù hieäu khoâng keát thuùc töông öùng.
Thí duï 2.8. Cho vaên phaïm G: P: S → xA A → z | yA
Duøng vaên phaïm G ñeå phaân tích caâu nhaäp xyyz
Baûng 2.1. Caùc böôùc phaân tích cuù phaùp cuûa caâu xyyz
Luaät aùp duïng Chuoãi nhaäp
S xyyz
xA xyyz
yA yyz
A yz
yA yz
A z
z z
- -
Thí duï 2.9. Cho vaên phaïm vôùi caùc luaät sinh nhö sau :
S → A | B A → xA | y B → xB | z
Baûng 2.2. Phaân tích cuù phaùp cho caâu xxxz khoâng thaønh coâng
Thí duï 2.12. Cho vaên phaïm nhö ôû thí duï 2.6, chuùng ta duøng phöông
phaùp phaân tích ñoaùn nhaän tröôùc ñeå phaân tìch caâu array[num dot dot
num] of integer (töï xem ôû trang 41).
Caùc thuû tuïc ñöôïc goïi khi sinh caây phaân tích cho caùc caâu thuoäc vaên
phaïm ôû thí duï 2.12.
2.5. Trình bieân dòch cho bieåu thöùc ñôn giaûn
Thí duï: exp → exp + term {print (‘+’)} (2.5)
exp → exp – term {print (‘-’)}
exp → term
term → 0 {print (‘0’}
…….
term → 9 {print (‘9’}
Loaïi boû ñeä quy traùi:
exp → term rest
exp.t ::= term.t || rest.t
rest → + exp
rest.t ::= exp.t || ‘+’
rest → - exp
rest.t ::= exp.t || ‘-’
rest → ∈
term → 0
term.t ::= ‘0’
rest → ∈
term → 0
term.t ::= ‘0’
term → 9
term.t ::= ‘9’
Vaên phaïm naøy khoâng phuø hôïp cho bieân dòch tröïc tieáp cuù phaùp.
Löôïc ñoà dòch:
exp → exp + term {print (‘+’)}
exp → exp –term {print (‘-’)}
exp → term
term → 0 {print (‘0’)}
……..
term → 9 {print (‘9’)}
Loaïi boû ñeä quy traùi cho löôïc ñoà dòch:
exp → term rest
rest→ + term {print (‘+’)} | - term {print (‘-’)} | ∈
term → 0 {print (‘0’) }
….
term → 9 {print (‘9’)}
Caây phaân tích chuù thích cho caâu: 9-5 = 2 ôû tr.44
Chöông trình bieân dòch bieåu thöùc töø daïng trung toá sang daïng haäu toá:
procedure exp;
procedure match ( t : token );
begin if lookahead = t then
lookahead := nexttoken
else error
end;
procedure term ;
begin
if lookahead = num then begin
write ( num);
match (lookahead);
end
else error
end;
procedure rest;
begin
if lookahead = ‘ +‘ then begin
match (‘+‘); term;
write (‘+’);
end
else if lookahead = ‘-’ then
begin
match (‘-’); term; write(‘-’);
end;
end;
begin
term; rest;
end;
if ab> ab>
Hình 2.10. Nhaän daïng token cuûa boä phaân tích töø vöïng
2.7. Söï hình thaønh baûng danh bieåu
1. Giao tieáp vôùi baûng danh bieåu
Hai thao taùc vôùi baûng danh bieåu: insert (s,t) vaø lookup (s).
2. Löu giöõ töø khoùa
3. Hieän thöïc baûng danh bieåu
Baûng danh bieåu goàm coù baûng symtable vaø daõy lexemes.
Baûng symtable
init scanner
emit
Hình 3.1. Söï giao tieáp giöõa boä phaân tích töø vöïng vaø boä phaân tích
cuù phaùp
p1 p2
N kyù töï
N kyù töï
p1 p2
Hình 3.3. Caëp boä ñeäm theo phöông phaùp caàm canh
Giaûi thuaät:
p2 := p2 + 1;
if p2 ^ eof then
if p2 ôû ranh giôùi moät nöûa boä ñeäm then
begin
chaát ñaày N kyø hieäu nhaäp vaøo nöûa beân phaûi boä ñeäm;
p2 := p2 + 1
end
else if p2 ôû taän cuøng beân phaûi boä ñeäm then
begin
laáp ñaày N kyù hieäu vaøo nöû beân traùi boä ñeäm; chuyeån p2
veà ñaàu boä ñeäm
end
else /* döøng söï phaân tích töø vöïng */
Töø ñònh nghóa chính quy ta xaây döïng baûng maãu cho token nhö ôû baûng
3.3 trang 74.
3.6. Sô ñoà dòch
1. Mieâu taû
> =
Baét ñaàu 0 6 7 Hình 3.4. Sô ñoà dòch cho >=
vaø =
other *
8
Start < =
0 1 2 return (relop, LE)
> 3 return (relop, NE)
other *
4return (relop, LT)
=
5 return (relop, EQ)
> =
6 7 (relop, EQ)
other *
8 return (relop, EQ)
Hình 3.5. Sô ñoà dòch nhaän daïng token relop
Löu yù:
- Phaàn khai baùo bao goàm khai baùo haèng, bieán bieåu thò vaø caùc ñònh
nghóa chính quy.
- Phaàn quy taéc bieân dòch laø caùc phaùt bieåu coù daïng:
p1 → {haønh vi ngöõ nghóa 1}
p2 → {haønh vi ngöõ nghóa 2}
……
pn → {haønh vi ngöõ nghóa n}
start a a b b
0 0 1 1 3
a
∈ 2 3 ∈
start ∈ a b b
0 1 6 7 8 9 10
∈ b
4 5 ∈
start a
i f
3. Giaû söû N( s ) vaøN( t ) laø NFA cho bieåu thöùc chính quy s vaø t
- Vôùi s | t xaây döïng NFA hoãn hôïp N (s| t)
∈ N(s) ∈
start f
i
∈ ∈
N(t)
- Vôùi bieåu thöùc st, xaây döïng NFA hoãn hôïp N (st)
start ∈ ∈
i f
∈
- Bieåu thöùc s thì N (s) laø NFA nhaän daïng L (s)
Caùc tính chaát cuaû NFA xaây döïng theo caáu truùc Thompson’
Thí duï 3.7.
Giaûi thuaät 3.4. Moâ phoûng NFA
Nhaäp: NFA goïi laø N ñöôïc xaây döïng theo giaûi thuaät 3.3, chuoãi nhaäp x.
X ñöôïc keát thuùc baèng eof, N coù traïng thai baét ñaàu s0 vaø taäp traïng thaùi
keát thuùc F.
Xuaát: Giaûi thuaät traû lôøi ñuùng neáu N chaáp nhaän x, ngöôïc laïi traû lôøi sai
Phöông phaùp:
Giaûi thuaät: Moâ phoûng 3.4.
Thí duï 3.8. Giaû söû ta coù NFA ôû (H.3.13 ), x laø chuoãi nhaäp chöùa a.
Duøng giaûi thuaät 3.4 xeùt xem NFA coù chaáp nhaän x ?. Keát quûa giaûi thuaät
traû lôøi sai ( nghiaõ laø a khoâng thuoäc ngoân ngöõ do NFA nhaän daïng
Thôøi gian vaø khoâng gian caàn thieát cho vieäc nhaän daïng moät chuoãi nhaäp:
- Ñoái vôùi DFA: khoâng gian O (2 ( )) vaø thôøi gian O (|x | ).
- Ñoái vôùi NFA: khoâng gian O (|r | ) vaø thôøi gian O (| r | * | x | ).
3.10. Xaây döïng DFA tröïc tieáp töø bieåu thöùc chính quy vaø vaán ñeà toái
öu hoùa vieäc so truøng maãu
1. Traïng thaùi quan troïng cuûa NFA
Traïng thaùi quan troïng laø töø noù coù söï truyeàn khaùc roãng. Nhö vaäy neáu
hai taäp traïng thaùi coù cuøng soá traïng thaùi quan troïng thì chuùng ñöôïc
ñoàng nhaát. NFA ñöôïc xaây döïng theo caáu truùc Thompson’ coù traïng thaùi
keát thuùc khoâng coù söï truyeàn ra, nhö vaäy noù khoâng phaûi laø traïng thaùi
quan troïng ( nhöng thöïc söï noù laïi raát quan troïng ). Ñeå traùnh tình traïng
naøy ngöôøi ta theâm kyù hieäu # vaøo sau bieåu thöùc chính quy, vaø traïng
thaùi keát thuùc coù söï truyeàn treân kyù hieäu #. Khi xaây döïng taäp con hoaøn
taát thì traïng thaùi naøo coù söï truyeàn treân # laø traïng thaùi chaáp nhaän.
- Bieåu thöùc r# ñöôïc goïi laø bieåu thöùc chính quy gia toá.
Vaên phaïm cuûa bieåu thöùc chính quy:
exp → exp | term exp → term term → term • factor
term → factor factor → factor* factor → ( exp )
factor → a factor → b
•
•
• #
• b 6
* b 5
a 4
3
a b
1 2
Hình 3.16. Caây phaân raõ cuûa bieåu thöùc gia toá (a| b )* abb#
∈
a
∈ 1 C ∈
start ∈
A B ∈ a a b b #
F 3 4 4 6 F
∈ b
2 D ∈
∈
Hình 3.17. NFA ñöôïc xaây döïng töø ( a| b )* abb#
Löu yù:
- Caùc traïng thaùi ñöôïc kyù hieäu baèng soá laø traïng thaùi quan troïng; Caùc
traïng thaùi ñöôïc kyù hieäu baèng chöõ laø traïng thaùi khoâng quan troïng.
- ÔÛ thí duï 3.6 traïng thaùi A vaø C coù cuøng soá traïng thaùi quan troïng laø
2,4,7 , trong (H 3.17) laø 1,2,3:
A = {0,1,2,4,7} C = {1,2,4,5,7}
Baûng 3.6. Caùc quy taéc ñeå tính ba haøm nullable, firstpos, lastpos
Nuùt n nullable (n) firstpos (n) lastpos (n)
n laø nuùt coù teân true
laø ∈
n laø nuùt coù teân
false {i} {i}
laø vò trí i
| n nullable(c1) or firstpos(c1) ∪ lastpos(c1) ∪
c1
nullable(c2) firstpos(c2) lastpos(c2)
c2
° n if nullable(c1) if nullable(c2)
nullable(c1) and then firstpos(c1) ∪ then lastpos(c1)
nullable(c2) firstpos(c2) ∪ lastpos(c2)
c1 c2
else firstpos(c1) else lastpos(c2)
∗ n
true firstpos(c1) lastpos(c1)
c1
Caùc quy taéc tính haøm followpos (n):
1. Neáu nuùt n laø nuùt cat vôùi con beân traùi laø c1, con beân phaûi laø c2 vaø i laø
vò trí trong lastpos(c1), thì taát caû vò trí trong first(c2) seõ cho vaøo
followpos(i).
2. Neáu n laø nuùt star vaø i laø vò trí trong lastpos(n) thì taát caû caùc vò trí
trong firstpos(n) seõ cho vaøo followpos(i).
Thí duï 3.10. Ta xaùc ñònh DFA cho bieåäu thöùc (a | b)* abb
{1,2,3} {1,2,3} {6}
{1,2,3} {5}
{4} {6} # {6}
{1,2,3}
{3} {5}a{5}
{1,2} ∗ {1,2} {4}a{4}
{3}a{3}
{1,2} {1,2}
Giaûi thuaät 3.5. Xaây döïng DFA töø bieåu thöùc chính quy
Nhaäp: Bieåu thöùc chính quy r.
Xuaát: DFA goïi laø D, nhaän daïng ngoân ngöõ L( r)
Phöông phaùp :1. Xaây döïng caây phaân tích cho BTCQ gia toá r#.
2. Tính caùc haøm nullable, firstpos, lastpos vaø followpos cho caùc nuùt
treân caây phaân tích
3. Xaây döïng caùc traïng thaùi, haøm truyeàn vaø baûng truyeàn cho D baèng
thuû tuïc ôû (moâ phoûng 3.5).
Thuû tuïc taïo taäp con laø caùc traïng thaùi cuûa DFA:
Luùc ñaàu D chæ coù moät traïng thaùi baét ñaàu laø firstpos(root) , chöa ñöôïc
ñaùnh daáu.
Moâ phoûng 3.5. Thuû tuïc taïo taäp con
while coù traïng thaùi T chöa ñöôïc ñaùnh daáu, trong taäp traïng thaùi
cuûa D do begin ñaùnh daáu T;
for vôùi moãi kyù hieäu nhaäp a do;
begin vôùi U laø taäp caùc vò trí trong followpos (p), p laø vò trí trong
T, sao cho kyù hieäu taïi vò trí p laø a;
if U khoâng roãng vaø chöa coù trong taäp traïng thaùi cuûa D
then begin theâm U vaøo taäp traïng thaùi cuûa D vaø laø traïng thaùi
chöa ñöôïc ñaùnh daáu;
D[T, a] := U;
end;
end;
end;
Löu yù: traïng thaùi keát thuùc cuûa D coù chöùa vò trí cuûa y.
Thí duï 3.10. Xaây döïng DFA töø btcq ( a| b )* abb. (trang 103 -104)
Thí duï 3.11. Cho DFA nhö ôû (H. 3.14, tr. 90).
Caùch giaûi ôû tr. 106 – 107.
4. Caùc phöông phaùp neùn baûng truyeàn FA
1. Thu giaûm haøng vaø coät dö thöøa
0 – 0 1 0000 222222222 0 – 0 3 0 – 0
y next
yrmap 0 0 -1 3 1 -1 0
1 1 -1 2 1 5 1
2 2 -1 -1 2 5 2
3 3 -1 -1 2 -1 3
4 4 -1 -1 -2 -1 4
5 4 -1 -1 4 -1 4
0 1 2 3
Hình 3.21. Baûng truyeàn ñöôïc neùn baèng phöông phaùp thu giaûm haøng vaø
coät dö thöøa
2. Neùn caëp
ynext
0 • 7 ‘0’,3 ‘0’,1 ‘1’,1 ‘2’,1 ‘3’,1 ‘4’,2 ‘5’,2 ynext 0
Hình 3.22. Baûng truyeàn neùn theo phöông phaùp neùn caëp
Moâ phoûng 3.7. Giaûi thuaät tìm traïng thaùi keá tieáp treân baûng truyeàn ñaõ
ñöôïc neùn
row := ynext [t];
I := row^[0], /* row^ laø ma traän 1 chieàu ynext t */
if I = 0 then
begin c := ord (a)
s := row^[c]; /* s laø traïng thaùi keá tieáp */
end
else begin
while (a < > row^ [i]. chart) and (i < I) do
i := i + 1;
if a = row^[i]. chart then s := row^[i]. State
else writen (‘sai – loãi töø vöïng’);
end;
3.11. Thieát keá boä sinh boä phaân tích töø vöïng
Chöông trình moâ phoûng FA vaø
Ñaëc taû lex Trình bieân dòch baûng truyeàn
Lex
a)
Baûng truyeàn
b)
Hình 3.23. Trình bieân dòch Lex vaø Boä phaân tích töø vöïng
1. Maãu so truøng treân cô sôû NFA
N(p1)
∈
so N(pi)
∈
N(pn)
Hình 3.24. NFA ñöôïc tao ra töø söï ñaëc taû LEX
CHÖÔNG 4
PHAÂN TÍCH CUÙ PHAÙP
Moâ phoûng 4.1. Giaûi thuaät loaïi boû ñeä quy traùi töø vaên phaïm
for i := 1 to n do
for j := 1 to i - 1 do begin
- Thay caùc luaät sinh coù daïng Ai → Aj γ baèng caùc luaät sinh
Ai→ δ1γ⏐δ2γ⏐…..⏐δkγ
- Vôùi Aj luaät sinh coù daïng Ai → δ1⏐δ2⏐ ….⏐δk
- Loaïi taát caû caû caùc luaät sinh coù ñeä quy traùi tröïc tieáp trong caùc
Ai luaät sinh
end;
Thí duï: Chuùng ta coù aùp duïng giaûi thuaät 4.1 vaøo vaên phaïm sau ñeå loaïi
boû ñeä quy traùi.
S→ Aa⏐ b A → Ac⏐ Sd ⏐∈
Thöøa soá traùi: Thí duï ta coù hai luaät sinh:
stmt → if exp then stmt else stmt
⏐if exp then stmt
Caû hai luaät sinh ñeàu coù if daãn ñaàu neân ta seõ khoâng bieát choïn luaät sinh
naøo ñeå trieån khai. Vì theá ñeå laøm chaäm laïi quyeát ñònh löïa choïn chuùng
ta seõ taïo ra thöøa soá traùi.
Giaûi thuaät 4.2. Taïo vaên phaïm coù thöøa soá traùi
Nhaäp: cho vaên phaïm G.
Xuaát: vaên phaïm G’ coù thöøa soá traùi töông ñöông.
Phöông phaùp: Tìm chuoãi daãn ñaàu chung cuûa caùc veá phaûi luaät sinh, thí
duï: A → αβ1⏐αβ2⏐…..⏐αβn⏐γ . γ laø chuoãi khoâng baét ñaàu bôûi α. Ta
thay caùc luaät treân baèng caùc luaät A→αA’ A’→ β1⏐β2⏐…⏐βn
Thí du: ï Ta aùp duïng giaûi thuaät treân cho vaên phaïm phaùt bieåu if, nöôùc
vaên phaïm töông ñöông
S → i E t SS’⏐a S’→ e S⏐∈ E→b
4.3. Phaân tích cuù phaùp töø treân xuoáng
Phaân tích cuù phaùp ñeä quy ñi xuoáng.
Phaân tích cuù phaùp ñoaùn nhaän tröùôc.
1. Phaân tích cuù phaùp ñeä quy ñi xuoáng
Thí duï: Cho vaên phaïm G : S→ cAd A → ab ⏐ a
S S
c A d c A d
a b a
a) b)
Hình 4.4. Caùc böôùc phaân tích cuù phaùp töø treân xuoáng
2. Phaân tích cuù phaùp ñoaùn nhaän tröôùc
- Haõy loaïi boû ñeä quy traùi cho vaên phaïm maø chuùng ta thieát keá.
- Haõy taïo vaên phaïm coù thöøa soá traùi neáu caàn thieát.
Sô ñoà dòch cho boä phaân tích ñoaùn nhaän tröôùc
Sô ñoà naøy coù ñaëc ñieåm nhö sau:
- Moãi kyù hieäu khoâng keát thuùc coù moät sô ñoà.
- Teân caùc caïnh laø token vaø caùc kyù hieäu khoâng keát thuùc.
Söï truyeàn treân token seõ ñöôïc thöïc hieän neáu kyù hieäu nhaäp truøng vôùi
token ñoù. Neáu coù söï truyeàn treân kyù hieäu khoâng keát thuùc A thì ta thöïc
hieän moät leänh goïi thuû tuïc A.
Ñeå xaây döïng sô ñoà chuùng ta seõ tieán haønh caùc böôùc sau ñaây:
1. Taïo traïng thaùi baét ñaàu vaø keát thuùc.
2. Vôùi moãi luaät sinh coù daïng A Æ X1X2…Xn , ta xaây döïng ñöôøng ñi töø
traïng thaùi baét ñaàu ñeán traïng thaùi keát thuùc sao cho caùc caïnh coù teân X1,
X2, X3…Xn.
Cô cheá hoaït ñoäng cuûa boä phaân tích ñoaùn nhaän tröôùc
Thí duï 4.3. Chuùng ta haõy taïo sô ñoà dòch cho vaên phaïm
G: E Æ TE’
E’ Æ + TE’ |∈
T Æ FT’
T’ Æ ∗ FT’ |∈
F’ Æ (E) | id
T E’ + T E’
E: 2 3 4 5 6
0 1
E’: ∈
F T’
T: 7 8 9
T’ 1 ( )
T’: 10 ∗ F’ 12 ∈ 1
11 3
14 15 16 7
∈ F: id
Hình 4.5. Sô ñoà dòch cuûa caùc kyù hieäu khoâng keát thuùc cuûa G
+ ∗
T ∈ F ∈ ( E )
E: 0 3 6 T: 7 10 13 F: 14 15 16 17
id
Hình 4.6. Sô ñoà dòch cuûa caùc kyù hieäu khoâng keát thuùc cuûa G, ñaõ ñöôïc
thu giaûm
Giaûi thuaät:
procedure E;
procedure T;
procedure F;
begin nextchar (c);
if c = ‘(‘ then begin
match (‘(‘); E;
match (‘)‘); end
else if c = id then match (id)
else error;
end; {F}
begin
F;
while c = ‘*‘ do F;
end; {T}
begin
T;
while c = ‘+‘ do T;
end; {E}
3. Phaân tích cuù phaùp ñoaùn nhaän tröôùc khoâng ñeä quy
Caáu taïo cuûa boä phaân tích cuù phaùp
Stack a1a2 … an $ boä ñeäm nhaäp
Xuaát
X Chöông trình ñieàu khieån
Y
Z
$
Hình 4.7. Moâ hình caáu taïo cuûa boä phaân tích ñoaùn nhaän tröôùc
khoâng ñeä quy.
Hoaït ñoäng cuûa boä phaân tích
ÔÛ traïng thaùi baét ñaàu, stack chæ chöùa caùc kyù hieäu muïc tieâu cuûa vaên
phaïm naèm treân $, treân ñænh stack. Baûng phaân tích M laø ma traän. Hai
kyù hieäu X vaø a seõ xaùc ñònh haønh vi cuûa boä phaân tích. Boä phaân tích coù
ba haønh vi nhö sau:
1. Neáu X = a = $.
2. Neáu X = a ≠ $.
3. Neáu X laø kyù hieäu khoâng keát thuùc.
Giaûi thuaät 4.2. Phaân tích cuù phaùp ñoaùn nhaän tröôùc khoâng ñeä quy.
Nhaäp: chuoãi nhaäp w vaø baûng phaân tích M cho vaên phaïm G.
Xuaát: neáu w thuoäc L (G), seõ taïo ra daãn xuaát traùi cuûa w, ngöôïc laïi seõ
baùo loãi.
Phöông phaùp: luùc ñaàu caáu hình cuûa boä phaân tích laø ($S, w$) vôùi S laø
kyù hieäu muïc tieâu cuûa G. Ñaët ip (laø con troû hoaëc coøn goïi laø ñaàu ñoïc
cuûa boä phaân tích) vaøo kyù hieäu nhaäp ñaàu tieân cuûa w$.
Moâ phoûng 4.2. Chöông trình phaân tích cuù phaùp ñoaùn nhaän tröôùc
repeat
X treân stack vaø kyù hieäu a ñang ñöôïc ñaàu ñoïc ip ñoïc;
if X laø kyù hieäu keát thuùc hoaëc $ then
if X = a then begin
- ñaåy X ra khoûi stack;
- dòch ñaàu ñoïc ñeán kyù hieäu nhaäp keá tieáp; end
else error ()
else if M [X, a] = X Æ X1X2…Xk then begin
- ñaåy X ra khoûi stack;
- ñaåy XkXk-1… X1 leân stack (X1 treân ñænh stack);
- xuaát luaät sinh X Æ X1X2 … Xk ; end
else error ()
until X = $
Thí duï 4.4. Giaû söû chuùng ta coù vaên phaïm G.
EÆE+T|T
TÆT∗F|F
F Æ (E) | id
Chuùng ta seõ thöïc hieän loaïi boû ñeä quy traùi, nhaän ñöôïc G’:
E Æ TE’
E’Æ + TE’ |∈
T Æ FT’
T Æ ∗ FT’ |∈
F Æ (E) | id
Baây giôø chuùng ta seõ phaân tích cuù phaùp cho caâu nhaäp w = id + id * id
baèng baûng phaân tích M cho tröôùc, ôû Baûng 4.1.
Baûng 4.1. Baûng phaân tích M cho vaên phaïm G
Kyù hieäu khoâng Kyù hieäu nhaäp
keát thuùc id + * ( ) $
E E Æ TE’ E Æ TE’
E’ EÆ E’ Æ ∈ E’ Æ ∈
+TE’
T T Æ FT’ T Æ FT’
T’ T’ Æ ∈ T Æ* FT’ T’ Æ ∈ T’ Æ ∈
F F Æ id F Æ (E)
Quaù trình phaân tích cuù phaùp caâu nhaäp w = id + id ∗ id seõ ñöôïc trình
baøy ôû baûng 4.2.
S’ S’ Æ ∈ S’ Æ ∈
S’ Æ eS
E EÆb
- Vaên phaïm khoâng coù phaàn töû naøo cuûa baûng phaân tích M coù nhieàu hôn
moät trò thì ñöôïc goïi laø vaên phaïm LL (1).
- Vaên phaïm LL (1) coù caùc tính chaát sau.
Khaéc phuïc loãi trong phaân tích cuù phaùp ñoaùn nhaän tröôùc
Loãi xuaát hieän trong caùc tröôøng hôïp sau: Moät laø kyù hieäu keát thuùc treân
stack khoâng truøng vôùi kyù hieäu nhaäp ñang ñöôïc ñoïc. Hai laø A laø kyù
hieäu khoâng keát thuùc treân ñænh stack, a treân chuoãi nhaäp, ñöôïc ñoïc, maø
M [A, a] laø troáng.
Moät soá heuristics ñöôïc aùp duïng cho vieäc khaéc phuïc loãi.
T’ T’ Æ ∈ T’ Æ * FT’ T’ Æ ∈ T’ Æ ∈
Xaây döïng daãn xuaát phaûi ngöôïc töø w = γn . Ta tìm βn trong γn sao cho
βn laø veá phaûi luaät sinh An Æ βn . Thay βn trong γn baèng An , ta nhaän
ñöôïc daïng caâu thöù (n – 1) laø γn – 1.
Quaù trình thu giaûm cöù tieáp tuïc nhö vaäy cho ñeán khi ñaït ñöôïc γo chæ coøn
laø moät kyù hieäu khoâng keát thuùc vaø laø kyù hieäu muïc tieâu.
$ X1 X2 … Xn-1 Xn Y1 Y2 … Yn-1 Yn $
Baûng phaân
tích S-R
Hình 4.9. Moâ hình boä phaân tích cuù phaùp thöù töï yeáu
2. Hoaït ñoäng
Thí duï 4.10. Cho vaên phaïm cuûa phaùt bieåu gaùn
< assign stmt > Æ id = < exp >
< exp > Æ < exp > + < term > | <term>
< term > Æ < term > * < factor > ⏐ < factor >
< factor > Æ id ⏐ (< exp >)
Kyù hieäu <assign stmt> laø kyù hieäu muïc tieâu.
Baûng 4.6. Baûng phaân tích S-R cho vaên phaïm ôû thí duï 4.10.
id ∗ + ( ) = $
<assign stmt> R*
<exp> S S R
<term> S R R R
<factor> R R R R
id R R R S R
* S S
+ S S
( S S
) R R R R
= S S
$ S
Giaûi thuaät 4.4. Phaân tích cuù phaùp thöù töï yeáu
Moâ phoûng 4.3. Giaûi thuaät cuûa chöông trình phaân tích thöù töï yeáu
- Luùc ñaàu stack traïng thaùi chæ coù kyù hieäu $. Stack nhaäp chöùa
chuoãi nhaäp, ñöôïc keát thuùc bôûi daáu $ ; c:=false ;
repeat
if Kyù hieäu muïc tieâu ôû treân ñænh vaø kyù hieäu $ ôû ñaùy stack traïng thaùi,
ñoàng thôøi stack nhaäp chæ chöùa $ then
c:=true /∗phaân tích thaønh coâng, caây cuù phaùp xaây döïng xong∗/
else begin
- X ôû treân ñænh stack traïng thaùi, Y ôû treân ñænh stack nhaäp.
- Giaû söû T laø trò cuûa phaàn töû S-R [X, Y];
if T laø roãng then error ()
else if T = R then
if treân ñænh stack coù chöùa veá phaûi cuûa luaät sinh naøo ñoù
then begin
- Goïi A Æ X1 X2 … Xn laø luaät sinh naøo coù veá phaûi daøi
nhaát so truøng vôùi chuoãi treân stack traïng thaùi: (a) Giaûi toûa X1 X2 … Xn
ra khoûi stack; (b) Thay A leân stack. (c) Taïo nuùt môùi A treân caây cuù
phaùp, coù caùc con laø X1 X2 … Xn
end
else error ()
else begin
(a) Giaûi toûa Y ra khoûi stack nhaäp; (b) Ñaåy Y leân ñænh
stack traïng thaùi; (c) Tao nuùt môùi teân Y treân caây cuù phaùp;
end;
end;
until c;
1. Boä phaân tích cuù phaùp coù caáu taïo nhö sau:
Stack Sm
Xm
Chöông trình xuaát
Sm –1
ñieàu khieån
Xm – 1
…
Giaûi thuaät tính goto: haøm goto (I, X) vôùi I laø taäp caùc thöïc theå, X laø kyù
hieäu vaên phaïm. Goto (I, X) laø closure cuûa taäp caùc thöïc theå coù daïng A
Æ αX.β sao cho thöïc theå A Æ α.Xβ ôû trong I.
Moâ phoûng 4.5. Giaûi thuaät tính taäp tuyeån caùc taäp thöïc theå
procedure items (G’);
begin
C := {closure ({S’ Æ • S}}}
repeat
for vôùi moãi taäp thöïc theå I trong C vaø vôùi moãi kyù
hieäu vaên phaïm X sao cho pheùp goto (I, X) khoâng roãng vaø khoâng coù
trong C do
theâm goto (I, X) vaøo C;
until khoâng theå theâm taäp thöïc theå môùi vaøo C;
end;
Thí duï 4.17. Xaây döïng caùc taäp thöïc theå LR (1) cho vaên phaïm gia toá
G’: S’ Æ .S ; S Æ CC ; C Æ cC|d
Giaûi thuaät 4.8. Xaây döïng baûng phaân tích Canonical LR.
Nhaäp: vaên phaïm gia toá G’
Xuaát: baûng phaân tích Canonical LR vôùi hai haøm action vaø goto cho G’
Phöông phaùp:
1. Xaây döïng C = {Io, I1, …, In}.
2. Traïng thaùi i ñaïi dieän cho Ii.
a. Neáu thöïc theå [A Æ α.aβ, b] ôû trong Ii vaø goto (Ii , a) = Ij thì
phaàn töû action [i, a] = shift(j), a phaûi laø kyù hieäu keát thuùc.
b. Neáu [A Æ α• , a] ôû trong Ii, A ≠ S’ thì action[i, a]=reduce(AÆα)
c. Neáu [S’ Æ S• , $] ôû trong Ii thì action [i, $] = accept.
3. Neáu goto (Ii , A) = Ij thì phaàn töû goto [i, A] = j.
4. Taát caû caùc phaàn töû khoâng aùp duïng ñöôïc quy taéc 2 vaø 3 thì laø loãi.
5. Traïng thaùi baét ñaàu cuûa boä phaân tích cuù phaùp laø taäp thöïc theå co
chöùa thöïc theå [S’ Æ •S , $].
Baûng phaân tích Canonical LR cho vaên phaïm ôû thí duï 4.17. ñöôïc xaây
döïng döïa vaøo giaûi thuaät 4.7.
Baûng 4.10. Baûng phaân tích Canonical LR
action goto
Traïng thaùi
c d $ S C
0 s3 s4 1 2
1 acc
2 s6 s7 5
3 s3 s4 8
4 r3 r3
5 r1
6 s6 s7 9
7 r3
8 r2 r2
9 r2
Boä sinh phaân tích cuù phaùp
Boä sinh phaân tích cuù phaùp Yacc
y.tab.c
Taäp tin ñaëc taû Trình bieân dòch
Yacc translate.y Yacc
Hình 4.14. Taïo boä phaân tích cuù phaùp baèng Yacc.
Thí duï 4.23. Chuùng ta seõ taïo taäp tin ñaëc taû vaên phaïm cho Yacc cuûa
vaên phaïm G.
EÆE+T|T
TÆT*F|F
F Æ (E) | digit
Moâ phoûng 4.10. Taäp tin ñaëc taû vaên phaïm cho Yacc ôû thí duï 4.23.
% { # include <ctype.h>
%}
% token DIGIT
%%
line : exp ′\n′{printf (″% d\n″, $1) ;}
;
exp : exp ′+′ term {$$ = $1 + $3;}
: term
;
term : term ′*′ factor {$$ = $1 + $3;}
: factor
;
factor : ′(′exp′)′ {$$ = $2;}
: DIGIT
;
%%
yylex ( ) {
int c ;
c = getchar ( ) ;
if (isdigit (c)) { yylval = c - ′0′ ;
return DIGIT;
}
return c;
}
Coù hai khaùi nieäm veà caùc luaät ngöõ nghóa coù lieân quan ñeán luaät sinh:
ñònh nghóa tröïc tieáp cuù phaùp vaø löôïc ñoà dòch.
- Ñònh nghóa tröïc tieáp cuù phaùp.
- Löôïc ñoà dòch.
Hình 5.0. Khaùi nieäm veà dòch tröïc tieáp cuù phaùp
Khaùi nieäm toång quan cuûa bieân dòch tröïc tieáp cuù phaùp
5.1. Ñònh nghóa tröïc tieáp cuù phaùp
Laø vaên phaïm phi ngöõ caûnh maø trong ñoù moãi kyù hieäu vaên phaïm coù taäp
thuoäc tính. Taäp thuoäc tính naøy coù hai loaïi: thuoäc tính toång hôïp vaø
thuoäc tính keá thöøa.
Caây cuù phaùp coù giaù trò thuoäc tính ôû moãi nuùt ñöôïc goïi laø caây phaân tích
chuù thích.
n
E.val = 19
E.val = 15 T.val = 4
+
T.val = 15
F.val = 4
T.val = 3 * F.val = 5
digit.lexval = 4
F.val = 3 digit.lexval = 5
digit.lexval = 3
Hình 5.1. Caây phaân tích chuù thích 3 * 5 + 4n
Thuoäc tính keá thöøa
Thuoäc tính keá thöøa laø thuoäc tính maø giaù trò cuûa noù ôû moät nuùt treân caây
phaân tích ñöôïc xaùc ñònh bôûi thuoäc tính cha meï vaø/hoaëc anh chò cuûa nuùt
ñoù.
Thí duï 5.3. Söï khai baùo ñöôïc taïo bôûi kyù hieäu khoâng keát thuùc D trong
ñònh nghóa tröïc tieáp cuù phaùp ôû (baûng 5.2).
Baûng 5.2. Ñònh nghóa tröïc tieáp cuù phaùp vôùi thuoäc tính keá thöøa L.in.
L.in = real
T.type = real
real
L.in = real
, id2
id1
Hình 5.2. Caây phaân tích vôùi thuoäc tính keá thöøa in ôû moãi nuùt coù nhaõn L.
Ñoà thò phuï thuoäc
Caùc söï phuï thuoäc trung gian: thuoäc tính keá thöøa vaø toång hôïp treân caùc
nuùt cuûa caây phaân tích coù theå ñöôïc mieâu taû baèng ñoà thò coù höôùng ñöôïc
goïi laø ñoà thò phuï thuoäc (dependency graph).
Caây phuï thuoäc cuûa moät caây phaân tích cho tröôùc, ñöôïc xaây döïng nhö
sau:
E val
E1 E2 val
val +
Hình 5.3. Ñoà thò phuï thuoäc cuûa caây phaân tích cho E Æ E1+ E2
Thí duï 5.5. (H.5.4) laø ñoà thò phuï thuoäc cho caây phaân tích cuûa (H.5.2).
Ñaùnh giaù thöù töï
Trong saép xeáp logic topo, caùc thuoäc tính phuï thuoäc c1, c2, …, ck trong
luaät ngöõ nghóa b:= f (c1, c2, …, ck) ñöôïc ñaùnh giaù tröôùc f.
D
5 L 6
4 in
T type 3 entry
7 L 8 id3
real
2 entry
9
in L 10 id2
1
id1 entry
Hình 5.4. Ñoà thò phuï thuoäc cho caây phaân tích ôû (H.5.2).
Thí duï 5.6. Moãi moät caïnh cuûa ñoà thò phuï thuoäc ôû (H.5.4.) ñi töø soá
thaáp ñeán soá cao cuûa caùc nuùt. Töø thöù töï logic topo chuùng ta seõ coù
chöông trình. Chuùng ta vieát an cho thuoäc tính lieân quan ñeán nuùt
ñöôïc ñaùnh soá n. treân ñoà thò phuï thuoäc.
a4 := real
a5 := a4
addtype (id3.entry, a5);
a7 := a5
addtype (id2.entry, a7);
a9 := a7
addtype (id1.entry, a9);
Moät soá phöông phaùp ñöôïc ñeà nghò cho vieäc ñaùnh giaù caùc luaät
ngöõ nghóa
1. Phöông phaùp caây phaân tích (parse-tree method)
2. Phöông phaùp cô sôû luaät (rule-based method)
3. Phöông phaùp roõ raøng
5.2. Caáu truùc cuûa caây phaân tích
Caây cuù phaùp: laø daïng thu goïn cuûa caây phaân tích, ñöôïc duøng ñeå bieåu
dieãn cho caáu truùc ngoân ngöõ.
Caây phaân tích ôû (H.5.1) seõ ñöôïc veõ laïi thaønh caây cuù phaùp.
+
∗
4
3 5
Xaây döïng caây cuù phaùp cho bieåu thöùc
Chuùng ta seõ duøng caùc haøm ñeå taïo caùc nuùt cho caây cuù phaùp cuûa bieåu
thöùc vôùi pheùp toaùn hai ngoâi. Moãi haøm traû veà con troû chæ ñeán nuùt môùi
ñöôïc taïo ra.
1. mknode(op, left, right).
2. mkleaf(id, entry).
3. mkleaf(num, val).
Thí duï 5.7. Moät chuoãi caùc haøm ñöôïc goïi ñeå taïo caây cuù phaùp cho bieåu
thöùc a – 4 + c ôû (H.5.5).
(1) p1 := mkleaf(id, entry a); (4) p4 := mkleaf(id, entry c);
(2) p2 := mkleaf(num, 4); (5) p5 := mknode(‘+’, p3, p4)’
(3) p3 := mknode(‘-‘, p1, p2)
+
− id
− −
id
id con troû chæ ñeán c
num 4 trong baûng danh bieåu
con troû chæ ñeán a
trong baûng danh Hình 5.6. Toå chöùc cuûa caây cuù phaùp cho bieåu thöùc
bieåu a–4+c
Ñoà thò coù höôùng khoâng laëp voøng mieâu taû bieåu thöùc
Ñoà thò coù höôùng khoâng laëp voøng (directed acyclic graph) goïi taét laø
dag.
+
+
∗
∗
a d
−
b c
Giaûi thuaät 5.1. Phöông phaùp soá trò cho vieäc taïo nuùt cuûa dag.
Giaû söû moãi nuùt laø moät phaàn töû cuûa daõy ôû (H.5.8).
Nhaäp: nhaõn op, nuùt 1 vaø nuùt r.
Xuaát: nuùt vôùi kyù hieäu < op, 1, r >
Phöông phaùp
5.3. Ñaùnh giaù töø döôùi leân cho ñònh nghóa thuoäc tính S
Thuoäc tính toång hôïp treân stack cuûa boä phaân tích.
Boä bieân dòch cho ñònh nghóa thuoäc tính S coù theå ñöôïc thöïc hieän döïa
theo boä sinh boä phaân tích cuù phaùp LR.
Baûng 5.5. Stack cuûa boä phaân tích coù vuøng löu chöùa caùc thuoäc tính
toång hôïp
state val
.
.
.
X X.x
Y Y.y
top Z Z.z
………. ………..
Baûng 5.6. Hieän thöïc baûng tính baèng boä phaân tích cuù phaùp LR
Chuùng ta trình baøy lôùp cuûa ñònh nghóa tröïc tieáp cuù phaùp, ñöôïc goïi laø
ñònh nghóa thuoäc tính L nhö sau: thuoäc tính L luoân ñöôïc ñaùnh giaù theo
thöù töï depth – first. Ñònh nghóa thuoäc tính L bao goàm taát caû caùc ñònh
nghóa tröïc tieáp cuù phaùp, ñöôïc döïa treân cô sôû vaên phaïm LL (1).
Ñònh nghóa thuoäc tính L
Ñònh nghóa tröïc tieáp cuù phaùp, ñöôïc goïi laø ñònh nghóa thuoäc tính L, neáu
moãi thuoäc tính keá thöøa cuûa xj vôùi 1 < j ≤ n maø xj naèm ôû veá phaûi luaät
sinh A → x1x2…xn, chæ phuï thuoäc vaøo:
1. Caùc thuoäc tính cuûa caùc kyù hieäu x1, x2, …, xj-1 ôû phía traùi cuûa xj trong
luaät sinh.
2. Thuoäc tính keá thöøa cuûa kyù hieäu A.
Baûng 5.8. Ñònh nghóa tröïc tieáp cuù phaùp khoâng phaûi thuoäc tính L.
E → TR
R → addop T {print (addop. Lexeme)} R⏐∈
T → num {print (num. val)}
Tröôøng hôïp ñôn giaûn nhaát neáu haønh vi chæ caàn thuoäc tính toång hôïp.
Nhö vaäy chuùng ta seõ xaây döïng löôïc ñoà dòch baèng caùch taïo ra haønh vi
laø pheùp gaùn cho moãi luaät ngöõ nghóa vaø gaén haønh vi naøy vaøo taän cuøng
cuûa veá phaûi luaät sinh.
Thí duï: ta coù luaät sinh vaø luaät ngöõ nghóa sau:
Luaät sinh Luaät ngöõ nghóa
T Æ T1 * F T.val:= T1.val x F.val
ta ñöa luaät ngöõ nghóa ‘nhuùng’ vaøo luaät sinh vaø ñöôïc:
T Æ T1 * F {T.val:= T1.val x F.val}
Neáu caùc haønh vi caàn caû thuoäc tính toång hôïp vaø keá thöøa thì chuùng ta
phaûi löu yù:
1. Thuoäc tính keá thöøa cuûa moät kyùhieäu naèm ôû veá phaûi luaät sinh phaûi
ñöôïc tính tröôùc trong haønh vi ñöùng tröôùc kyùhieäu ñoù.
2. Haønh vi khoâng ñöôïc tham khaûo ñeán thuoäc tính toång hôïp cuûa kyù hieäu
naèm ôû beân phaûi haønh vi ñoù.
3. Thuoäc tính toång hôïp cuûa kyù hieäu khoâng keát thuùc ôû veá traùi luaät sinh
chæ coù theå ñöôïc tính sau taát caû caùc thuoäc tính maø noù tham khaûo tôùi.
R.i = 9
T.val = 9
−
T.val = 5 R.i = 4
num. val = 9
num. val = 2 ∈
Hình 5.10. Ñaùnh giaù bieåu thöùc 9 – 5 + 2.
Moâ phoûng 5.4. Löôïc ñoà dòch chuyeån ñoåi vôùi vaên phaïm ñeä quy traùi.
E→T {R.i := T.val⏐}
R {E.val := R.s}
R→+
T {R1.i := R.i + T.val⏐}
R1 {R.s := R1.s}
R→-
T {R1.i := R.i - T.val⏐}
R1 {R.s := R1.s}
R→∈ {R.s := R.i}
T→(
E {T.val := E.val⏐}
)
T → num {T.val := num.val⏐}
Giaû söû chuùng ta coù löôïc ñoà dòch sau (vôùi thuoäc tính toång hôïp):
A → A1Y {A.a := g (A1.a, Y.y}
A→X {A.a := f (X.x)} (5.1)
Sau khi loaïi boû ñeä quy traùi chuùng ta coù vaên phaïm töông ñöông;
A→X {R.i := f (X.x)}
R {A.a := R.s}
R→Y {R1.i := g (R.i, Y.y)} (5.3)
R1 {R.i := R1.s}
R→∈ {R.s := R.i}
Thí duï 5.13. Ñònh nghóa tröïc tieáp cuù phaùp ôû baûng 5.3. duøng ñeå xaây
döïng caây cuù phaùp ñöôïc chuyeån thaønh löôïc ñoà dòch.
E → E1 + T {E.nptr := mknode (‘+’, E1.nptr, T.nptr)}
E → E1 – T {E.nptr := mknode (‘-’, E1.nptr, T.nptr)} (5.9)
E→T {E.nptr := T.nptr}
A.a = g(g(f(X.x), Y1, y), Y2, y) A
X R.i = f(X.x)
Y2
A.a = g(f(X.x), Y1, y)
Y1
Y1
A.a = f(X.x)
Y2
R.I = g(g(f(X.x), Y1, y), Y2,y)
X
∈
Hình 5.11. Hai caùch tính giaù trò thuoäc tính.
Moâ phoûng 5.5. Löôïc ñoà dòch chuyeån ñoåi cho caáu truùc caây cuù phaùp.
− id
c
id
num 4
a
Hình 5.12. Duøng caùc thuoäc tính keá thöøa ñeå xaây döïng caây cuù phaùp.
Giaûi thuaät 5.2: xaây döïng trình bieân dòch tröïc tieáp cuù phaùp ñoaùn nhaän
tröôùc.
Nhaäp: cho löôïc ñoà dòch tröïc tieáp cuù phaùp vôùi vaên phaïm cô sôû phuø hôïp
cho phaân tích ñoaùn nhaän tröôùc.
Xuaát: maõ cho trình bieân dòch tröïc tieáp cuù phaùp.
Phöông phaùp:
1. Vôùi moãi kyù hieäu khoâng keát thuùc A, xaây döïng haøm, thoâng soá laø
thuoäc tính keá thöøa cuûa A, traû veà giaù trò cuûa caùc thuoäc tính toång hôïp
cuûa A.
2. Maõ cho kyù hieäu khoâng keát thuùc A seõ quyeát ñònh luaät sinh naøo seõ
ñöôïc duøng treân cô sôû kyù hieäu nhaäp ñang ñöôïc ñoïc.
3. Maõ cho moãi luaät sinh seõ ñöôïc taïo ra:
i) Vôùi moãi token X vôùi thuoäc tính toång hôïp x, caát giaù trò x vaøo bieán
X.x. Taïo ra leänh goïi chöông trình con ñeå so truøng token X vôùi kyù hieäu
nhaäp ñöôïc ñoïc.
ii) Vôùi B, taïo ra phaùt bieåu gaùn C1 = B (b1, b2, …, bk), b1, b2, …, bk laø
caùc bieán chöùa caùc thuoäc tính keá thöøa cuûa B vaø C laø bieán chöùa thuoäc
tính toång hôïp cuûa B.
iii) Vôùi moãi haønh vi, haõy cheùp maõ vaøo cho boä phaän tích, thay moãi
tham chieáu ñeán caùc thuoäc tính baèng bieán chöùa caùc thuoäc tính ñoù.
Thí duï 5.14. Vaên phaïm ôû moâ phoûng 5.5 laø LL (1), noù phuø hôïp cho
vieäc phaân tích töø treân xuoáng.
function E: ↑ nuùt caây cuù phaùp
function R: (i: ↑ nuùt caây cuù phaùp): ↑ nuùt caây cuù phaùp;
function T: ↑ nuùt caây cuù phaùp;
5.6. Ñaùnh giaù thuoäc tính keá thöøa töø döôùi leân
Loaïi boû haønh vi ñöôïc nhuùng trong löôïc ñoà dòch
Ví duï: chuùng ta coù löôïc ñoà dòch
E → TR
R → + T {print (‘+’)} R ⏐ - T {print (‘−‘)} R⏐∈
T → num {print (num.val)}
Taïo ra löôïc ñoà dòch vôùi vieäc duøng caùc kyù hieäu ñaùnh daáu khoâng keát
thuùc môùi N, M.
E → TR
R → + T MR ⏐- TNR ⏐∈
T → num {print (num.val)}
M → ∈ {print (‘+’) }
N → ∈ {print (‘−’) }
Thuoäc tính keá thöøa treân stack cuûa boä phaân tích
Thí duï 5.15. Quaù trình ñaùnh giaù thuoäc tính keá thöøa baèng boä phaân tích
töø döôùi leân cho caâu nhaäp real p, q, r ôû (H.5.13).
D → T {L.in := T.type}
T → int {T.type := integer}
T → real {T.type := real}
L → {L1.in := L.in}
L1, id {add type (id.entry, L.in)}
L → id {add type (id.entry, L.in)}
D
L
T in
in
in L r
•
real
L
q
,
S S
b
b C
C A B M i
A B s
s i i
a) b) ∈
Hình 5.14. Sao cheùp thuoäc tính thoâng qua kyù hieäu M.
a) Luaät sinh chöa bieán ñoåi; b) Luaät sinh ñaõ ñöôïc bieán ñoåi.
Kyù hieäu khoâng keát thuùc N cuõng coù theå ñöôïc duøng ñeå moâ phoûng cho
luaät ngöõ nghóa maø noù khoâng phaûi laø luaät sao cheùp. Ví duï ta coù luaät
sinh vaø luaät ngöõ nghóa:
Giaûi thuaät 5.3. Phaân tích töø döôùi leân vaø söï bieân dòch vôùi caùc thuoäc tính
keá thöøa.
Nhaäp: ñònh nghóa thuoäc tính L vôùi vaên phaïm cô sôû LL (1).
Xuaát: boä phaân tích cuù phaùp tính caùc giaù trò cuûa taát caû caùc thuoäc tính
treân stack cuûa boä phaân tích.
Phöông phaùp: giaû söû moãi kyù hieäu khoâng keát thuùc A coù moät thuoäc tính
keá thöøa A.i vaø moãi kyù hieäu vaên phaïm X coù moät thuoäc tính toång hôïp
X.x.
Vôùi moãi luaät sinh A Æ X1 … Xn, seõ coù n kyù hieäu khoâng keát thuùc ñaùnh
daáu M1 …Mn, seõ thay luaät treân thaønh luaät sinh A Æ M1X1 … MnXn.
Ñeå nhaän thaáy caùc thuoäc tính coù theå ñöôïc tính trong quaù trình phaân tích
töø döôùi leân, haõy xeùt hai tröôøng hôïp.
Tröôøng hôïp thöù nhaát neáu ta thu giaûm veà kyù hieäu Mj ta phaûi bieát luaät
sinh A → Mj X1 … MnXn maø Mj coù trong ñoù. Chuùng ta phaûi bieát caùc
vò trí cuûa caùc thuoäc tính maø thuoäc tính keá thöøa Xj.i caàn ñeå tính giaù trò
cho noù. A.i ôû val[top – 2j + 2], X1.i ôû val[top – 2j + 3], X1.s ôû taïi
val[top – 2i + 4], X2.i ôû val[top – 2j + 5]…
Tröôøng hôïp thöù hai seõ xuaát hieän khi ta thu giaûm veà moät kyù hieäu khoâng
keát thuùc cuûa vaên phaïm giaû söû baèng luaät sinh A → M1X1 … MnXn, vaø
giaû söû ta chæ tính A.s, coøn A.i ñaõ ñöôïc sinh vaø naèm treân stack ôû vò trí
treân vò trí cuûa A. Caùc thuoäc tính caàn thieát ñeå tính A.s ñaõ saün saøng treân
stack, ñaõ ñöôïc bieát, ñoù chính laø caùc vò trí cuûa caùc Xj trong quaù trình
thu giaûm.
Thay theá thuoäc tính keá thöøa baèng thuoäc tính toång hôïp
Chuùng ta coù theå traùnh duøng thuoäc tính keá thöøa baèng vieäc thay ñoåi vaên
phaïm cô sôû. Trong ngoân ngöõ cuûa Pascal cho pheùp khai baùo moät chuoãi
caùc bieán vaø sau ñoù laø kieåu döõ lieäu cuûa chuùng. Thí duï: m, n: integer.
D→L:T
T → integer ⏐ char
L → L, id ⏐ id
D → id L
L → ,id Ll:T
T → integer ⏐ char
CHÖÔNG 6
XÖÛ LYÙ NGÖÕ NGHÓA
Xöû lyù ngöõ nghóa coù hai caùch: kieåm tra tónh (static check) vaø kieåm tra
ñoäng (dynamic check).
Trong chöông naøy chuùng ta chæ baøn ñeán kieåm tra ngöõ nghóa tónh.
Xöû lyù ngöõ nghóa tónh bao goàm:
1. Truyeàn thuoäc tính
2. Kieåm tra kieåu
3. Kieåm tra trình töï ñieàu khieån
4. Kieåm tra tính duy nhaát
5. Kieåm tra moái lieân heä cuûa teân
6. Xöû lyù caùc phaùt bieåu goto tham khaûo tröôùc.
chuoãi caây caây maõ
Boä phaân Boä xöû lyù Sinh maõ
token tích cuù phaùp cuù phaùp ngöõ nghóa cuù phaùp trung trung gian
gian
Hình 6.1. Vò trí cuûa boä xöû lyù ngöõ nghóa.
6.2. Xöû lyù ngöõ nghóa vôùi phaân tích cuù phaùp töø döôùi leân
1. Vaán ñeà truyeàn thuoäc tính
Thí duï 6.1. Chuùng ta coù vaên phaïm G.
<assign stmt> → id := <expr>
<expr> → <expr> + <term> | <term>
<term> → <term> * <factor> | < factor>
< factor > → id | (< expr>)
n12 <assign stmt>
n11 <expr>
n10 <term>
n9<factor>
n8<expr>
n2 <term> n5 <expr> n7 <term>
n4 <term>
n1 <factor> n6 <factor>
n3 <factor>
x pointer x pointer
Hình 6.4. Caây vaø dag, bieåu thò cho bieåu thöùc char x char Æ point
(interger)
Kieåm tra kieåu tónh vaø kieåm tra kieåu ñoäng
Phaùt hieän loãi
2. Ñaëc taû boä kieåm tra kieåu ñôn giaûn
Ngoân ngöõ ñôn giaûn
Chuùng ta coù ngoân ngöõ ñôn giaûn ñöôïc sinh ra töø vaên phaïm G
P→D;E
D → D ; D | id : T
T → char | integer | array [num] of T | ↑ T
E → literal | num | id |E mod E | [E] | E ↑
Moâ phoûng 6.1. Sô ñoà bieân dòch duøng ñeå löu giöõ kieåu cuûa caùc danh bieåu
P→D;E
D→D;D
D → id : T {addtype (id. entry, T. type)}
T → char { T. type := char}
T → integer {T. type := integer}
T → ↑ T1{T. type := pointer (T1. type)}
T → array [num] of T1{T. type = array (num. val, T1 . type)}
Kieåm tra cho bieåu thöùc
1. Kieåu token laø literal vaø num thí coù kieåu laø char vaø integer.
E → literal {E. type := char}
E → num {E. type := integer}
2. E → id {E. type := lookup (id. Entry)}
3. E → E1 mod E2 {E. type := if (E1 . type = integer) and
(E2. type := integer) then integer
else type - error}
4. E → E1 {E2} {E. type := if (E1 . type = integer) and
(E1. type E2 = array (s, t)) then t else type – error}
5. E → E1 ↑ {E. type := if E1. type = pointer (t) then t
else type – error}
Thí duï 6.3. Chuùng ta seõ giôùi thieäu caùch maõ hoaù caùc bieåu thöùc kieåu cuûa
trình bieân dòch C do D.M. Ritchie vieát.
Moâ phoûng 6.4. Caùc thí duï veà bieåu thöùc kieåu.
char
freturns (char)
pointer (freturns (char))
array (pointer (freturns (char))
Boä kieán thöùc kieåu Maõ hoùa
pointer 01
array 10
freturns 11
Caùc kieåu cô baûn cuûa ngoân ngöõ C ñöôïc John (1979) maõ hoùa baèng 4 bit
Kieåu cô baûn Maõ hoùa
boolean 0000
char 0001
integer 0010
real 0011
Moâ phoûng 6.5. Maõ hoùa bieåu thöùc kieåu ôû moâ phoûng 6.4.
Bieåu thöùc kieåu Maõ hoùa
char 000000 0001
freturns (char) 000011 0001
pointer (freturns (char)) 0111 0001
array (pointer (freturns (char)) 100111 0001
6.5. Xöû lyù ngöõ nghóa cho phaùt bieåu goto tham khaûo tröôùc
Thí duï 6.6. Giaû söû chuùng ta coù ñoaïn chöông trình
…
goto L (10) JMP (0,0,0)
…
goto L (50) JMP (10,0,0)
…
goto L (90) JMP (50,0,0)
…
L: x := x + 1 (120)
Baûng 6.2. Baûng löu giöõ teân phaùt bieåu vaø chæ soá ñaàu danh saùch lieân keát
Baûng 6.3. Ñieàn chæ soá cuûa teân L vaøo caùc leänh nhaûy
7.1. Caùc phaàn töû yeâu caàu caáp phaùt boä nhôù trong thôøi gian thöïc thi
Taát caû caùc phaàn töû caàn ñöôïc caáp phaùt boä nhôù, bao goàm:
1. Ñoaïn maõ cuûa chöông trình ñöôïc bieân dòch.
2. Caùc chöông trình heä thoáng caàn thieát trong thôøi gian thöïc thi.
3. Caáu truùc döõ lieäu vaø haèng do ngöôøi söû duïng ñònh nghóa.
4. Caùc ñieåm trôû veà cuûa chöông trình con.
5. Moâi tröôøng tham khaûo.
6. Caùc vò trí nhôù taïm cho vieäc tính trò bieåu thöùc.
7. Nhaäp, xuaát boä ñeäm.
8. Caùc baûng, traïng thaùi thoâng tin.
Ngoaøi döõ lieäu vaø caùc chöông trình ñöôïc bieân dòch, caùc taùc vuï cuõng caàn
boä nhôù:
1) Goïi chöông trình con vaø caùc taùc vuï trôû veà.
2) Khôûi taïo vaø huûy boû caáu truùc döõ lieäu.
3) Taùc vuï theâm vaøo hoaëc loaïi boû caùc phaàn töû.
7.2. Caùc vaán ñeà veà ngoân ngöõ nguoàn
Chöông trình con
Moâ phoûng 7.1. Chöông trình Pascal ñoïc vaø saép xeáp thöù töï caùc
soá nguyeân
(1) program sort (input, output);
(2) var a: array [0…10];
(3) procedure readarray;
(4) var i: integer;
(5) begin
(6) for i := 1 to 9 do read (a [1]);
(7) end;
(8) function partition (y, z: integer): integer;
(9) var i, j, x, v: integer;
(10) begin …
(11) end;
(12) procedure quicksort (m, n: integer);
(13) var i: integer;
(14) begin
(15) if (n > m) then begin
(16) i := partition (m, n);
(17) quicksort (m, i – 1);
(18) quicksort (i + 1, n);
(19) end;
(20) end;
(21) begin
(22) a[0] := -9999; a[10] := 9999;
(23) readarray;
(24) quicksort (1, 9);
(25) end
Caây hoaït ñoäng (activation tree)
Caây hoaït ñoäng duøng ñeå mieâu taû con ñöôøng maø söï ñieàu khieån ñi vaøo
vaø ñi ra khoûi caùc hoaït ñoäng cuûa chöông trình. Moät soá tính chaát cuûa
caây hoaït ñoäng:
1. Moãi nuùt cuûa caây töôïng tröng cho moät hoaït ñoäng cuûa chöông trình
con.
2. Nuùt goác (root) töôïng tröng cho hoaït ñoäng cuûa chöông trình chính.
3. Nuùt a laø cha cuûa nuùt b neáu vaø chæ neáu doøng ñieàu khieån ñi töø söï hoaït
ñoäng a sang söï hoaït ñoäng b.
4. Nuùt a ôû beân traùi nuùt b neáu vaø chæ neáu thôøi gian soáng cuûa a xuaát
hieän tröôùc thôøi gian soáng cuûa b.
Moâ phoûng 7.2. Caùc phaùt bieåu in cuûa chöông trình ôû moâ phoûng 7.1
mieâu taû söï thöïc thi cuûa noù.
Söï thöïc thi chöông trình baét ñaàu
vaøo readarray
ra khoûi readarra
vaøo quicksort (1,9)
vaøo partition (1,9)
ra khoûi partition (1,9)
vaøo quicksort (1,3)
……
ra khoûi quicksort (1,3)
vaøo quicksort (5,9)
……
ra khoûi quicksort (5,9)
ra khoûi quicksort (1,9)
Söï thöïc thi keát thuùc
Thí duï 6.1.
s: vieát taét cho sort p: vieát taét cho partition
r: vieát taét cho readarray q: vieát taét cho quicksort
r
q(1,9)
q(5, 9)
p(1,9) q(7,9)
q(1,3)
p(5,9) q(5,5)
p(1,3) p(7,9) q(7,7)
q(1,0) q(2,3)
Hình 7.1. Caây hoaït ñoäng ñöôïc xaây döïng töø chuoãi xuaát ôû moâ phoûng 7.2.
Stack ñieàu khieån (Control stack)
r q(1,9)
p(1,9)
q(1,3)
q(2.3)
p(1,3)
q(1,0)
Hình 7.2. Stack ñieàu khieån bao goàm caùc nuùt treân con ñöôøng töø s
ñeán q (2,3) vaø trôû veà
• Taàm vöïc cuûa söï khai baùo
Khai baùo coù theå töôøng minh, Var I: integer nhöng coù theå laø khai baùo
ngaàm nhö Fortran, khi ta duøng teân bieán i maø khoâng khai baùo, Fortran
maëc nhieân hieåu i laø bieán nguyeân. Taàm aûnh höôûng cuûa caùc khai baùo
ñöôïc quy taéc taàm vöïc quyeát ñònh.
Hình 7.3. Pheùp chieáu hai möùc töø teân ñeán trò
Söï raøng buoäc chính laø baûn sao ñoäng cuûa khai baùo, trong thôøi gian thöïc
thi.
Baûng 7.1. Caùc khaùi nieäm tónh vaø ñoäng cuûa chöông trình con
heap
Khoâng phaûi taát caû caùc ngoân ngöõ laäp trình ñeàu duøng stack ñieàu khieån
vaø heap, nhöng Pascal vaø C thì duøng caû hai.
Baûn ghi hoaït ñoäng (Activation record)
1. Vuøng giaù trò khöù hoài
2. Vuøng thoâng soá
3. Ñöôøng lieân keát ñoäng
4. Ñöôøng lieân keát tónh
5. Caùc traïng thaùi maùy
6. Vuøng döõ lieäu cuïc boä
7. Vuøng nhôù taïm
Moâ phoûng 7.3. Daïng toång quaùt cuûa baûn ghi hoaït ñoäng
CHARACTER * 50 BUF
Baûn ghi hoaït ñoäng CNSUME
Döõ INTEGER NEXT
lieäu CHARACTER C
tónh
CHARACTER * 80
Baûn ghi hoaït ñoäng PRDUCE
BUFFER INTEGER
NEXT
Hình 7.4. Vò trí nhôù tónh cho caùc bieán cuïc boä cho chöông trình
Fortran 77
Thí duï 7.2. Chöông trình ôû (moâ phoûng 7.4) seõ laøm vieäc vôùi caùc giaù trò
cuïc boä ñöôïc löu laïi qua caùc laàn hoaït ñoäng. Caùc kyùhieäu xuaát ra trong
chöông trình chính CNSUME, ñöôïc laáy töø baûn ghi hoaït ñoäng cuûa
PRDUCE laø hello, do CNSUME goïi PRDUCE 6 laàn, nhö ôû (H.7.5).
CNSUME
Hình 7.5. Caùc kyù hieäu ñöôïc traû veà qua caùc laàn hoaït ñoäng cuûa PRDUCE
s s
a: array
s
s
a: array
r
r
i: integer
s
s
r a: array
q(1,9)
q(1,9)
i: integer
s s
a: array
r q(1,9) q(1,9)
i: integer
p(1,9)
p(1,9)
i, j, x, v: integer
s
s
r a: array
q(1,9)
q(1,9)
p(1,9)
q(1,3) i: integer
p(1,3) q(1,3)
i: integer
q(1,0)
q(1,0)
i: integer
s s
a: array
q(1,9) q(1,9)
p(1,9) i: integer
q(1,3) q(1,3)
p(1,3) q(1,0) i: integer
Hình 7.6. Caùc baûn ghi hoaït ñoäng ñöôïc caáp phaùt vaø loaïi boû khoûi stack
ñieàu khieån.
Söï goïi chöông trình con
1. Chöông trình goïi tính toaùn caùc thoâng soá thöïc vaø caát vaøo vuøng thoâng
soá cuûa baûn ghi hoaït ñoäng cuûa chöông trình bò goïi.
2. Chöông trình bò goïi löu giöõ ñòa chæ khöù hoài vaøo vuøng trò traû veà vaø trò
top-sp vaøo vuøng lieân keát, taêng top-sp leân moät khoaûng vò trí nhôù, chính
laø kích thöôùc cuûa vuøng bieán taïm vaø bieán cuïc boä cuûa noù vôùi kích thöôùc
vuøng thoâng soá, trò trôû veà, ñöôøng lieân keát vaø caùc traïng thaùi maùy
cuûa chöông trình bò goïi.
3. Chöông trình bò goïi seõ löu boä nhôù giaù trò, caùc thanh ghi, ñöôøng lieân
keát vaø traïng thaùi khaùc.
4. Chöông trình bò goïi khôûi ñoäng caùc giaù trò cuïc boä cuûa noù vaø baét ñaàu
thöïc thò.
……………………..
Ñöôøng
Thoâng soá vaø trò trôû veà
lieân Baûn hoaït ñoäng cuûa
keát Ñöôøng lieân keát vaø traïng chöông trình goïi
thaùi cuûa maùy Nhöõng thoâng tin
chöông trình goïi coù
Bieán taïm vaø bieán cuïc boä
traùch nhieäm cung caáp
Thoâng soá vaø trò trôû veà Baûn hoaït ñoäng
cuûa chöông trình
Ñöôøng lieân keát vaø bò goïi
top-sp
traïng thaùi cuûa maùy
Caùc thoâng tin
Bieán taïm vaø bieán cuïc boä chöông trình bò
goïi coù traùch
nhieäm cung caáp
Hình 7.7. Söï phaân chia coâng vieäc giöõa chöông trình goïi vaø bò goïi
Chuoãi trôû veà coù theå laø caùc coâng vieäc sau
1. Chöông trình bò goïi göûi caùc giaù trò trôû veà vaøo baûn ghi hoaït ñoäng cuûa
chöông trình con.
2. Chöông trình bò goïi xaùc laäp laïi trò: top-sp cho chöông trình goïi, trò
caùc thanh ghi, ñòa chæ khöù hoài.
3. Chöông trình goïi seõ söû duïng caùc giaù trò trong vuøng bieán taïm, giaù trò
trôû veà ñeå tính toaùn caùc bieåu thöùc sau naøy khi noù thöïc thi tieáp tuïc.
Thí duï 7.4. Cho khai baùo daõy trong Algol nhö sau:
DIMENSION A [L1 : U1, L2: U2, …Ln: Un]
di laø kích thöôùc chieàu thöù I, ñöôïc tính: di = Ui – Li + 1
Vuøng thoâng tin cho daõy A laø:
L1 U1 d1
L2 U2 d2
Hình 7.8. Vuøng thoâng tin cuûa daõy trong baûn ghi hoaït ñoäng
Hình 7.9. Baûn ghi hoaït ñoäng cuûa chöông trình con A, coù caùc bieán daõy
p, q vôùi kích thöôùc thay ñoåi
Tham chieáu treo (Dangling reference)
Moâ phoûng 7.5. Ñoaïn chöông trình Pascal gaây ra tham chieáu treo.
var p, q: ^ integer;
begin…
new(p);
q: = p;
dispose (p)
…
end;
p ñoái töôïng ñöôïc caáp phaùt
new (p)
p
q=p
q
q dispose (p)
Caùc baûn ghi hoaït Vò trí treân caây Caùc baûn ghi hoaït Ghi chuù
ñoäng treân stack hoaït ñoäng ñoäng trong heap
s S s
lieân keát ñoäng lieân keát ñoäng
r
Theo cô cheá
q(1,9) r heap r ñaõ heát
thöïc thi nhöng
lieân keát ñoäng q(1,9) lieân keát ñoäng
baûn ghi hoaït
ñoäng cuûa noù
vaãn coøn toàn taïi
q(1,9)
lieân keát ñoäng
Caáp phaùt vò trí nhôù cho caùc khoái coù kích thöôùc coá ñònh
ñaàu danh saùch
a)
1 2 3 4 5 6
Hình 7.11. Caùc khoái bò loaïi boû seõ ñöôïc theâm vaøo danh saùch cuûa caùc
khoái chöa söû duïng.
Caáp phaùt vò trí nhôù cho caùc khoái coù kích thöôùc thay ñoåi
2 3 4 5 6
Hình 7.12. Caùc khoái ñang ñöôïc söû duïng vaø ñang troáng
Loaïi boû ngaàm vò trí nhôù
Moâ phoûng 7.6. Daïng cuûa moät khoái
1 1
Hình 7.13. Hai khoái naøy laø raùc maëc duø vaãn coù soá ñeám tham khaûo laø 1
program MAIN
var x: integer;
procedure sub1;
var x: real;
…
begin
read (x)
sub2;
end;
procedure sub2;
(Khoâng coù khai baùo x)
…
begin
…
write (x);
…
end
begin {main}
…
sub1;
end.
2 M goïi P 0 M M
1 P P
3 P goïi R 0 M M
1 P P
2 R R
4 R goïi Q 0 M M
1 P P
2 Q R
Q
5 Q goïi P 0 M M
1 P’ P
SL R
Q
P’
6 P’ hoaøn taát thöïc 0 M M
thi traû söï ñieàu 1 P P
khieån cho Q
Q R
Q
Hình 7.20. Caùc böôùc goïi chöông trình con cuøng vôùi söï thay ñoåi noäi
dung cuûa display vaø stack ñieàu khieån
Taàm vöïc ñoäng
7.6. Truyeàn thoâng soá
1. Thoâng soá nhaäp – xuaát
- Truyeàn baèng tham khaûo
- Truyeàn baèng trò
2. Thoâng soá chæ nhaäp
- Truyeàn baèng trò
- Truyeàn baèng trò haèng
3. Thoâng soá chæ xuaát
- Truyeàn thoâng soá baèng teân
Thí duï 7.6. Cho chöông trình
type VECT = array [1 .. 3] of integer;
procedure SUB2 (var I, J: integer);
begin
I := I + 1;
J := J + 1; write (I, J);
end;
procedure SUB1;
var A: VECT;
K :integer;
begin A[1] := 7; A[2] := 8; A[3] := 9;
K :=2: SUB2 (K, A[K]);
for K := 1 to 3 do write (A [K]);
end;
Stack trung stack trung
taâm taâm
sub 1 sub 1
lieân keát lieân keát
A[1] A[1]
A[2] A[2]
A[3] A[3]
K K
sub 2 Thunk tính sub 2
lieân keát toaùn K lieân keát
I I
J Thunk tính J
toaùn A[k]
a) b)
Hình 7.23. Phöông phaùp truyeàn thoâng soá baèng teân vaø baèng tham khaûo
Chöông trình con ñoùng vai troø thoâng soá
Thí duï 7.7. Cho chöông trình
program MAIN;
var X : real;
procedure SUB2 (X, Y: real; function F (u: real): real);
var z: real;
begin
z := abs (Y - X);
z := (F (X) + F (Y)) * Z/2;
write (Z);
end;
procedure SUB1;
var Y :real;
function FUNC: (V: real): real;
begin
FUNC := X + V + Y
end;
begin
Y := 1
SUB2 (0, 1, FUNC)
end;
begin
X := 3;
SUB1;
end.
Nhìn vaøo chöông trình treân chuùng ta thaáy trình töï thöïc thi cuûa chöông
trình nhö sau: MAIN goïi SUB1 goïi SUB2 (0, 1, FUNC) goïi FUNC
Baûng 7.3. Stack trung taâm khi moät chöông trình con goïi chöông trình
con khaùc thoâng qua thoâng soá hình thöùc
Böôùc 1 Söï thöïc thi Stack trung taâm
1 2 3
1 MAIN
lieân keát tónh MAIN
X=3
SUB2
SUB1
Z
FUNC
lieân keát tónh
V
CHÖÔNG 8
TOÅ CHÖÙC BAÛNG DANH BIEÅU
Hình 8.1. Baûng danh bieåu tuyeán tính cuûa thí duï 8.1
Caùc taùc vuï treân baûng danh bieåu tuyeán tính ñöôïc trình baøy nhö sau:
Giaûi thuaät:
const tab lim = …..;
btablim = …..;
type tabinden = 1 .. tablim;
item = record
key: alfa; /* alfa laø kieåu chuoãi caùc kyù töï */
end;
var btab: array [1 .. btablim] of integer;
tab: array [1 .. Tablim] of item;
b: 1 • • tablim;
t: tabindex;
procedure enter (id: alfa)
var sb: tabindex;
begin sb := btab [b –1];
Tìm kieám treân baûng TAB töø vò trí sb ñeán vò trí t – 1, xem coù phaàn töû
naøo mang key baèng id khoâng? Neáu coù, thuû tuïc error seõ thoâng baùo loãi 1
laø loãi coù hai danh bieåu cuøng teân trong cuøng taàm vöïc. Ngöôïc laïi, if t =
tablim then error (12)
else begin tab [t] key := id;
t := t + 1
end;
end;
function loc (id: alfa): tabindex;
begin
Tìm kieám töø vò trí ñaàu TAB ñeán vò trí t –1, xem coù phaàn töû naøo coù key
laø id? Neáu khoâng coù thì error seõ thoâng baùo loãi 13. Ngöôïc laïi neáu tìm
thaáy danh bieåu coù khoùa id taïi vò trí index thì thöïc thi leänh loc := index;
end;
Procedure scopeentry;
begin if b = btablim then error (14)
else begin btab [b] := t; b := b + 1
end;
end;
Procedure Scope exit;
begin b := b – 1; t := btab [b]
end;
end;
procedure enter (id: alfa);
var sb: tabindex; k: hashindex; ind: tabindex;
begin
k := H(id);
ind := HASH [k];
sb := btab [b – 1];
if HASH [k] < > 0 then
while ind > = sb do
if id = tab [ind]. key then error (11) …
/* truøng teân danh bieåu trong cuøng taàm vöïc */
else ind := tab [ind]. Ptr; {khoâng truøng teân}
if t = tabsize then error (12)
else begin
tab [t]. Key := id;
tab [t]. Ptr := HASH [k];
HASH [k] := t;
t := t + 1;
end;
end;
function loc (id: alfa): tabindex;
var q: boolean; ind: tabindex;
begin ind := HASH [H(id)];
q := false;
while (ind < > 0) and (not (q)) do
begin q := id = tab [ind]. Key;
if not (q) then ind := tab [ind]. Ptr
end;
if q then loc := ind else error (13);
/* chöa coù danh bieåu trong baûng danh bieåu */
end;
procedure Scopeentry;
begin if b = tabsize then error (14)
else begin btab [b] := t;
b := b + 1;
end;
procedure Scopeexit;
var ind: tabindex;
k: hashindex;
begin
ind := t; t := btab [b – 1];
b := b – 1;
while ind > t do
begin ind := ind – 1;
k := H (tab [ind]. Key);
HASH [k] := tab [HASH [k]]. Ptr;
end;
end;
8.5. Haøm baêm (hashing function)
8.6. Löu giöõ thoâng tin cuûa taàm vöïc yù nghóa
Chöông Bieân dòch Maõ Boä toái öu Maõ Boä sinh maõ
Chöông
trình nguoàn phía tröôùc trung maõ trung ñoái töôïng trình dòch
gian gian
t1 := 4 * I
t2 := a [t1]
t3 := 4 * i
t4 := b [t3] B2
t5 := t2 * t4
t6 := prod + t5
prod := t6
Hình 9.4. Löu ñoà cuûa
t7 := i + 1 chöông trình
I := t7
if I < = 20 goto B2
Voøng laëp
9.4. Boä sinh maõ ñôn giaûn
Boä sinh maõ naøy seõ sinh maõ ñoái töôïng cho caùc maõ trung gian ba ñòa
chæ.
Ñaëc taû thanh ghi vaø ñòa chæ
1. Boä ñaëc taû thanh ghi seõ löu giöõ nhöõng gì toàn taïi trong töøng thanh ghi.
2. Boä ñaëc taû ñòa chæ seõ löu giöõ caùc vò trí nhôù chöùa trò cuûa caùc danh
bieåu.
Maõ trung Maõ ñoái Giaù Boä ñaëc taû Boä ñaëc taû
gian töôïng thanh ghi ñòa chæ
t := a – b MOV a, R0 2 Thanh ghi roãng, R0 t ôû trong R0
chöùa t
SUB b, R0 2
u := a – c MOV a, R1 2 R0 chöùa t t trong R0
SUB c, R1 2 R1 chöùa u u trong R1
v := t + u ADD R1, R0 1 R0 chöùa v u trong R1
R1 chöùa u v trong R0
d := v + u ADD R1, R0 1 R0 chöùa d d trong R0
MOV R0, d 2 d ôû trong boä nhôù
Sinh maõ cho loaïi phaùt bieåu khaùc
Baûng 9.2. Chuoãi maõ ñoái töôïng cho phaùt bieåu xaùc ñònh chæ soá vaø gaùn.
(1) t1 := 4 * i
(2) t2 := a [t1]
(3) t3 := 4 * 1
(4) t4 := b [3]
(5) t5 := t2 * t4
(6) t6 := prod + t5
(7) prod := t6
(8) t7 := i + 1
(9) i := t7
(10) if i < = 20 goto (1)
t6 , prod (1)
+ t5
⇐
∗ t4
prod0 []
[] + 20
t1, t3 t7 ,
∗
i
a 1
b i0
4
Thí duï 9.5. Khoái B2 ôû moâ phoûng 9.5 cuûa thí duï 9.4.
t5
t2 *
t4 a)
[] []
t1, t3
a ∗
b
i0
4
t6
+ t5
∗ t4
prod0 t2
[] [] b)
t1, t3
∗
a
b i0
4
t6, prod
+ t5
∗ t4 c)
prod0 t2
[] []
t1, t3
∗
a
b i0
4
t6, prod
+
t5
∗
prod0 t2 t4 d)
[]
[]
t1, t3
a ∗ + t7
b
4 i0 1
t6, prod
+
t5
∗
prod0 t2 t4 (1)
[] ⇐
[] t7, i
t1, t3
a ∗ + 20
b
4 i0 1
e)
Hình 9.7. Caùc böôùc xaây döïng dag cuûa khoái B2 ôû thí duï 9.5.
ÖÙng duïng cuûa dag
ÔÛ thí duï 9.5 chuùng ta ñaõ xaây döïng dag, noù giuùp cho vieäc töï ñoäng loaïi
boû caùc bieåu thöùc con gioáng nhau. Noù xaùc ñònh nhöõng bieán maø trò cuûa
chuùng ñöôïc söû duïng trong khoái cô baûn. Dag coøn giuùp ta xaùc ñònh
nhöõng phaùt bieåu maø trò cuûa chuùng ñöôïc söû duïng ôû ngoaøi phaïm vi cuûa
khoái cô baûn.
Thí duï 9.6. Chuùng ta seõ xaây döïng laïi khoái cô baûn töø dag cuûa (H.9.7e).
Daõy, con troû vaø leänh goïi chöông trình con
Chuùng ta khaûo saùt khoái cô baûn sau ñaây:
x := a[i]
a[j] := y
z := a[i]
Giaûi thuaät 9.2 thì a[i] seõ trôû thaønh bieåu thöùc chung. Töø dag chuùng ta
taïo laïi khoái cô baûn cuûa noù seõ toái öu vaø coù daïng:
x := a[i]
z := x
a[j] := y
Nhöng khoái (9.1) vaø (9.2) seõ tính trò z khaùc nhau neáu j = I vaø y ≠ a[i].
Ñoái vôùi con troû cuõng xaûy ra vaán ñeà khi ta coù phaùt bieåu gaùn * p := w.
Neáu ta khoâng bieát p seõ chæ ñeán ñoái töôïng naøo, thì phaûi loaïi taát caû caùc
nuùt coù daïng treân.
Vieäc goïi chöông trình con seõ gieát taát caû caùc nuùt bôûi vì ta chöa bieát gì
veà chöông trình bò goïi, neân ta buoäc phaûi giaû söû raèng baát cöù bieán naøo
cuõng coù theå bò thay ñoåi trò do hieäu öùng leà.
MOV a, R0 MOV c, R0
ADD b, R0 ADD d, R0
MOV c, R1 MOV e, R1
ADD d, R1 SUB R0 , R1
MOV R0 , t1 MOV a, R0
MOV e, R0 ADD b, R0
SUB R1, R0 SUB R1 , R0
MOV t1, R1 MOV R0 , t4
SUB R0 , R1
MOV R1 , t4
Heuristics duøng ñeå saép xeáp dag
Moâ phoûng 9.8. Giaûi thuaät saép xeáp caùc nuùt cuûa dag
(1) While neáu coøn caùc nuùt trung gian chöa ñöôïc lieät keâ ra
do begin
(2) Choïn nuùt chöa lieät keâ n; taát caû caùc nuùt cha meï cuûa noù ñaõ lieät keâ
(3) lieät keâ n;
(4) While con m ôû taän cuøng beân traùi cuûa n, coù caùc cha meï ñaõ lieät keâ
vaø noù khoâng phaûi laø nuùt laù do begin
(5) lieät keâ m;
(6) n := m;
end;
end
Thí duï 9.7. Giaûi thuaät ôû moâ phoûng 9.8 ñeå taïo söï saép xeáp cuûa caùc maõ
trung gian ôû (H.9.9).
1
∗
3
+ 2 −
∗ 4
+ 8
− 5
+ 6
c d e 12
a 7 11
9 b
10
t4 2
2
t1 1 t3
a b e t2 1
1
0 1
c d
1 0
l 0
1
T1
T1 b)
a) +
+
+
+ ti4
T1 + +
+ ti3
T4
d)
Ti1 Ti3
T2 T3
Hình 9.11. Chuyeån ñoåi caây baèng pheùp hoaùn vò,
c) keát hôïp
Caùc bieåu thöùc chung
1 4
3 5 8
2
6 4 4 12 6 7 11 12
6 12
9 8
10
BB1
BB2
BB3 BB4
Entry
BB1
BB2
BB3 BB4
Exit
BB3 BB3
BB4 BB4
BB5 BB5
BB6 BB7 BB6 BB7
BB8 BB8
BB9 BB9
BB10 BB10
join node Hình 10.4. Caùc nuùt reõ nhaùnh vaø hợp
10.2.4. Chi phoái (dominater)
Ñònh nghóa dominater: nuùt n cuûa G chi phoái nuùt n’ , kyù hieäu n dom n’
(hay n Æ n’ ), neáu moïi con ñöôøng töø nuùt Entry cuûa G ñeán n’ ñeàu phaûi
ñi qua n. Vôùi ñònh nghóa naøy thì moïi nuùt n chi phoái chính noù. Nuùt laø
ñieåm vaøo voøng laëp seõ chi phoái caùc nuùt trong voøng laëp.
direct dominate
Nuùt n ñöôïc goïi laø direct dominate n’ , kyù hieäu n Æ d n’ , neáu n Æ p n’
vaø khoâng toàn taïi n” ∈ N maø n Æ p n”.
BB1 Æ d BB2 ; BB2 Æ d BB3 ; BB2 Æ d BB4
caây dominate (dominate tree); kyù hieäu vieát taét DT, laø caây maø nuùt goác
laø Entry; nuùt thuoäc G vaø caïnh laø quan heä direct dominator.
ÔÛ thí duï treân DT coù daïng:
Entry
BB1
BB2
BB3 BB4
G1 G-1
Entry Entry
BB1 BB1
BB2 BB2
Exit Exit
10.2.7. Voøng laëp
Caùc yeáu toá xaùc ñònh voøng laëp töï nhieân:
- Moät voøng laëp phaûi coù 1 ñieåm vaøo ñôn, goïi laø header.
- Ñieåm vaøo header dominate taát caû caùc nuùt coøn laïi trong voøng laëp.
- Phaûi coù ít nhaát moät caùch laëp, nghóa laø phaûi coù ít nhaát moät caïnh quay
veà header.
Giaûi thuaät 10.3. Tìm voøng laëp
Nhaäp: ñoà thò doøng G vaø moät caïnh veà t Æ h.
Xuaát: voøng laëp bao goàm taát caû caùc nuùt trong voøng laëp töï nhieân t Æ h.
Phöông phaùp:
- Tìm dominator cuûa moãi nuùt trong CFG.
- Xaùc ñònh caïnh veõ.
- Tìm taát caû nhöõng nuùt lieân quan ñeán caïnh veõ.
- Ñeå tìm caïnh veõ: thöïc hieän duyeät caây CFG theo chieàu saâu tröôùc. Moät
caïnh luøi e = (t, h) ∈ E laø caïnh luøi neáu h Æ t. Moät caïnh luøi luoân laø caïnh
veõ trong voøng laëp baèng caùch söû duïng ñieàu khieån coù caáu truùc.
Giaûi thuaät:
stack s = empty
set loop = {h}
insert – on – stack (t); /* stack s*
while S is not empty do beg
m = pop (s);
for each pred (m) do
insert – on – stack (p); end
insert – on – stack (a) begin
if (a ∈ loop) then begin loop = loop ∪ {a} push – on – stack (a);
end
Thí duï veà tìm voøng laëp Entry
Cho grap nhö sau:
BB1
BB2 BB3
BB4
BB5 BB6
BB7
BB8
BB9 BB10
Exit
Ñaàu tieân xaùc ñònh caïnh veà h Æ t.
Loop = {BB3 , BB8}, stack = {BB8}
Loop = {BB3 , BB8}, stack = {}
Loop = {BB3 , BB8 , BB7}, stack = {BB7}
Loop = {BB3 , BB8 , BB7}, stack = {}
Loop = {BB3 , BB8 , BB7 , BB5}, stack = {BB5}
Loop = {BB3 , BB8 , BB7 , BB5 , BB6}, stack = {BB5 , BB6}
Loop = {BB3 , BB8 , BB7 , BB5 , BB6}, stack = {BB5}
Loop = {BB3 , BB8 , BB7 , BB5 , BB6 , BB4}, stack = {BB5 , BB4}
Loop = {BB3 , BB8 , BB7 , BB5 , BB6 , BB4}, stack = {BB5}
Loop = {BB3 , BB8 , BB7 , BB5 , BB6 , BB4}, stack = {}
Voøng laëp tìm ñöôïc laø {BB3 , BB4 , BB5 , BB6 , BB7 , BB8}, BB3 laø
header, BB8 laø node keát thuùc.
10.3. Phaân tích doøng döõ lieäu (Data Flow Analyst) – DFA
10.3.1. Muïc ñích cuûa phaân tích doøng döõ lieäu
- Xaùc ñònh döõ lieäu ñöôïc duøng trong chöông trình.
- Söû duïng döõ lieäu ñeå trình bieân dòch quyeát ñònh toái öu maõ.
- Trong moät khoái cô baûn: xaùc ñònh tính hieäu quaû trong caâu leänh, töø ñaàu
ñeán cuoái khoái cô baûn.
10.3.2. Ñieåm vaø ñöôøng
Ñieåm laø vò trí giöõa hai phaùt bieåu lieàn nhau.
Toàn taïi ñieåm tröôùc vaø sau phaùt bieåu.
Thí duï ñoaïn chöông trình:
p0 •
d1 i := m - 1
p1 •
d2 j := n
p2 •
d3 a := u1
p3 •
ÔÛ ñaây coù 4 ñieåm p0 tröôùc d1 , p1 tröôùc d2 , tröôùc d3 , p3 sau d3
Ñöôøng: töø p1 ñeán pn laø con ñöôøng ñi töø p1 ñeán ñieåm pn trong chöông
trình.
10.3.3. Ñaït ñeán söï ñònh nghóa (Reaching definition)
Ñònh nghóa cuûa moät bieán x laø taùc vuï gaùn trò cho bieán x.
Ñònh nghóa d cho moät bieán x ñöôïc goïi laø ñaït ñeán moät ñieåm p trong
chöông trình neáu toàn taïi moät con ñöôøng töø ñieåm ngay sau d ñeán p maø
x khoâng bò thay ñoåi trò bôûi moät ñònh nghóa cuûa x doïc theo con ñöôøng
naøy.
10.3.3.1. Taäp Gen
Gen (b) laø taäp caùc ñònh nghóa ôû trong b vaø ñaït ñeán ñieåm keát thuùc cuûa
b.
10.3.3.2. Taäp Kill
Kill (b) laø taäp ñònh nghóa ôû moät khoái cô baûn khaùc b nhöng bò thay ñoåi
trong b (bôûi moät taùc vuï trong b), ν laø bieán ñöôïc ñònh nghóa trong b, taäp
kill chöùa taát caû caùc ñònh nghóa cuûa v trong caùc khoái cô baûn khaùc.
10.3.3.3. Söï caân baèng doøng döõ lieäu
RDin (b): taäp caùc ñònh nghóa maø ñaït ñeán söï baét ñaàu cuûa b
RDout (b): taäp caùc ñònh nghóa maø ñaït ñeán söï keát thuùc cuûa b.
Coâng thöùc xaùc ñònh:
RDin (b) = ∪ RDout (i)
i ∈ pred (b)
c := a+b
d := a*c
BB1
e := d*d
i := 1
{a+b, d*d}
f := a+b
c := c*2 BB2
c>d?
{a+b, d*d} {a+b, d*d}
i := i+1 BB5
i > 10 ?
Exit
Entry
t1 := a+b
c := t1
d := a*c BB1
e := d*d
i := 1
f := t1
c := c*2 BB2
c>d?
d := c
g := a*c BB3 BB4
g := d*d
i := i+1
BB5
i > 10 ?
Exit
10.4.2. Lan truyeàn baûn copy
10.4.2.1. Ñònh nghóa söû duïng (use definition)
Taäp caùc ñònh nghóa ñaït ñeán vieäc söû duïng cuûa a nhö laø moät bieán ñöôïc
goïi laø daây xích söû duïng ñònh nghóa (ud - chain) cho bieán ñoù.
Thí duï veà ud – chain
Entry
z=1
x=1 x=2
z>y
y = x+1 z = x-3
Exit
10.4.2.2. Daây xích ñònh nghóa söû duïng
Taäp taát caû caùc laàn söû duïng maø ñaït ñeán bôûi moät ñònh nghóa ñöôïc goïi laø
daây xích ñònh nghóa söû duïng (du – chain).
Thí duï veà du – chain vaø ud – chain
Entry
z=1
x=1 x=2
z>y
y = x+1 z = x-3
Exit
10.4.2.3. Bieåu thöùc copy coù saün (Available Copy Expression)
Taäp copy
Taäp nhöõng caâu leänh copy u := v trong b maø u vaø v khoâng ñöôïc gaùn sau
ñoù trong b, nghóa laø caâu leänh coù saün taïi ñieåm keát thuùc cuûa b.
Taäp kill
Taäp caùc caâu leänh copy bò thay ñoåi trong b, nghóa laø taäp caâu leänh copy
trong khoái cô baûn khaùc maø coù toaùn haïng cuûa noù ñöôïc gaùn cho b.
Söï caân baèng doøng döõ lieäu
copyin: laø taäp leänh copy coù saün taïi ñieåm vaøo b
copyout: laø taäp leänh copy coù saün taïi ñieåm keát thuùc b
coâng thöùc: copyin (b) = ∩ copyout (i)
i ∈ pred (b)
copyout (b) = copy (b) ∪ [copyin (b) – kill (b)]
Giaûi thuaät: tìm baûn copy coù saün
Nhaäp: ñoà thò doøng ñieàu khieån G vôùi kill (b) vaø copy (b) ñöôïc tính saün
cho moãi khoái cô baûn b.
Xuaát: copyin (b) cho moãi khoái cô baûn.
Giaûi thuaät:
U : Taäp taát caû caùc copy trong ñoà thò doøng ñieàu khieån
copyout (Entry) = Φ
copyout (b) = copy (b) ∪ [U - kill (b)] ∀ b ∈ N - {Entry, Exit}
changed = true
while (changed) {
changed = false
for each b ∈ N - {Entry, Exit} {
oldout = copyout (b)
copyin (b) = ∩ copyout (i)
i ∈ pred (b)
c := a+b c := a+b
d := c BB1 d := c BB1
e := d*d e := c*c
{d := c}
f := a+c f := a+c
g := e BB2 g := e BB2
a := g+d a := e+c
a<c? a<c?
{d:= c,g:= e} {d:= c,g:= e}
h := g+1 h := e+1
BB3 BB4 f := d-g BB3 BB4 f := c-e
e := f+2 f>a? e := f+2 f>a?
{d := c}
{d:= c,g:= e}
b := g+a b := g+a
BB5 BB6 c := 2 BB 5 BB6 c := 2
h<f? h<f?
Exit Exit
10.4.3. Di chuyeån maõ khoâng ñoåi cuûa voøng laëp (loop – invariant code
motion)
• Moät söï tính toaùn trong voøng laëp ñöôïc goïi laø loop – invariant neáu söï
tính toaùn cuûa noù luoân luoân taïo ra cuøng moät giaù trò.
• Di chuyeån code khoâng ñoåi laø di chuyeån caùc loop – invariant ra beân
ngoaøi voøng laëp.
10.4.3.1. Loop – Invariant
Moät taùc vuï trong voøng laëp laø loop – invariant neáu moãi toaùn haïng trong
taùc vuï laø:
- haèng soá hoaëc
- taát caû caùc ñònh nghóa cuûa toaùn haïng ñeàu ôû beân ngoaøi voøng laëp hoaëc
- chæ duy nhaát coù moät ñònh nghóa trong voøng laëp cho toaùn haïng maø söï
ñònh nghóa laø loop – invariant.
10.4.3.2. Thöïc hieän di chuyeån code
Söï di chuyeån code phaûi thoûa maõn 3 ñieàu kieän ví duï cho phaùt bieåu
s : x = y + z.
1. Khoái cô baûn chöùa s phaûi dominate taát caû caùc loái ra cuûa voøng laëp.
2. Khoâng coù phaùt bieåu naøo khaùc gaùn cho x.
3. Taát caû caùc laàn söû duïng x chæ ñaït ñeán söï ñònh nghóa x trong s.
Thí duï (ñieàu kieän 1) i :=1 BB1
j := i BB5
Thí duï (ñieàu kieän 2) Thí duï (ñieàu kieän 3)