You are on page 1of 359

MOÂN HOÏC

TRÌNH BIEÂN DÒCH


MUÏC LUÏC
„ CHƯƠNG I „ CHƯƠNG 6
Giới thiệu về trình bieân dòch Xử lí ngữ nghĩa
„ CHƯƠNG 2 „ CHƯƠNG 7
Trình bieân dòch ñơn giản Quản lí bộ nhớ trong thời
„ CHƯƠNG 3 gian thực thi
Phaân tích từ vựng „ CHƯƠNG 8
„ CHƯƠNG 4 Tổ chức bảng danh biểu
Phaân tích cuù phaùp „ CHƯƠNG 9
„ CHƯƠNG 5 Sinh maõ ñoái töôïng
Trình bieân dịch trực tiếp cuù „ CHƯƠNG 10
phaùp Toái öu maõ
TAØI LIEÄU THAM KHAÛO
1) Alfred V.Aho, Jeffrey D.Ullman (1986). Compilers, Principles techniques, and
tools. Addison – Wesley Publishing Company.
2) Alfred V.Aho, Jeffrey D.Ullman (1972). The theory of parsing, translation and
compiling. Prentice – Hall, inc.
3) Terrence W. Pratt. Programming Languages: design and implementation second
edition. Prebtice – Hall International editions.
4)Allen I. Holub. Compiler design in C. Prentice – Hall International editions.
5) D. Gries (1976). Compiler construction. Springger – Verlag.
6) Jeffrey D. Ullman (1977). Fundamental concepts of programming system. Addion -
Wesley Publsihing Company.
7) Döông Tuaán Anh (1986) Giaùo trình Trình bieân dòch. Ñaïi hoïc Baùch Khoa TP. Hoà
Chí Minh.
8) Nicklaus Wirth (1976), Algorithms + Data Structure = program. Prentice – Hall
International editions.
9) Alfred V.Aho, Jeffrey D. Ullman (1977). Principles of compiler design. Addison –
Wesley, Reading, Mass.
10) Leâ Hoàng Sôn, Luaän vaên toát nghieäp “Xaây döïng giaûi thuaät toái öu maõ trung gian cuûa
trình bieân dòch” – Khoa CNTT Tröôøng ÑH Baùch khoa 2002.
11) Phan Thò Töôi (2001). Trình Bieân Dòch. Ñaïi hoïc Baùch Khoa TP. Hoà Chí Minh
YEÂU CAÀU
„ Phaàn Lyù thuyeát:
SV hoïc 42 tieát lyù thuyeát

„ Phaàn Thöïc haønh:


SV tham döï thöïc haønh – thöïc hieän Baøi taäp Moân hoïc 14t
(1 Baøi taäp Moân hoïc / 1 SV)

„ Hình thöùc ñaùnh giaù:


„ Kieåm tra Baøi taäp Moân hoïc Æ Ñieåm TH
„ Thi vieát Lyù thuyeát cuoái kyø Æ Ñieåm LT

„ Caùch tính ñieåm:


Ñieåm toång keát moân = LT * 60% + BTTH * 40%
CHÖÔNG 1
GIÔÙI THIEÄU VEÀ TRÌNH BIEÂN DÒCH
1.1. Ngoân ngöõ laäp trình
1. Giôùi thieäu
Phaân loaïi
Chöông trình dòch
- Trình bieân dòch
Döõ lieäu

Chöông Trình Chöông Maùy tính


Keát quaû
trình nguoàn bieân dòch trình ñích thöïc thi

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>

<noun phrase> <verb phrase>

<adjective> <noun> <verb> <phrase>

the pig is <preposition> <noun phrase>

<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>

<factor> <factor> <indentifier>

<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 tröïc tieáp

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

Chæ soá token lexeme Caùc thoâng tin khaùc


1 id COST bieán thöïc
2 id PRICE bieán thöïc
3 id TAX bieán thöïc
4 num 65 haèng soá nguyeân

3. Phaùt hieän vaø thoâng baùo loãi


4. Phaân tích cuù phaùp
Ví duï: COST := (PRICE + TAX) * 65
Keát quaû phaân tích töø vöïng:
id1 := ( id2 + id3 )* num4
Keát quaû phaân tích cuù phaùp:
n3

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)
*

id2 + id3 65.0

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

7. Toái öu maõ trung gian


temp1 := id2 + id3
id1 := temp1 + 65.0

8. Sinh maõ ñoái töôïng


movF id2, R1
movF id3, R2
addF R2, R1
multF # 65.0, R1
movF R1, id1
COST := (PRICE + TAX) * 65

Boä phaân tích töø vöïng

id := (id2 + id3) * num4

Boä phaân tích cuù phaùp

n1
id1 n2
:=
n3
* num4
id2 + id3

Boä phaân tích ngöõ nghóa

n1
n2
id1 :=
n3
* intoreal (65)
id2 + id3
Boä sinh maõ trung gian

temp1 := intoreal (65)


temp2 := id3 + id3
temp3 := temp2 * temp1
id1 := temp3

Boä toái öu trung gian

temp1 := id2 + id3


id1 := temp1 * 65.0

Boä sinh maõ ñoái töôïng

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)

Thí duï veà xöû lyù macro:


- Heä thoáng maùy ñaùnh chöõ typesetting:
\define <macro name><template> {<body>}
Thí duï macro ñònh nghóa veà söï trích daãn cuûa taïp chí ACM:
\define\JACM # 1; #2; #3
{{\S1J.ACM}{\bf #1}: #2, pp.#3}
Khi duøng macro:
\JACM 17; 4; 715-728
Seõ ñöôïc hieåu nhö sau:
J.ACM 17 : 4 , pp. 715-728
2. Trình bieân dòch hôïp ngöõ
Phaùt bieåu gaùn b := a + 2 ñöôïc dòch ra maõ hôïp ngöõ
MOV a, R1
ADD #2 , R1
MOV R1, b
3. Trình bieân dòch hôïp ngöõ hai chuyeán
- Chuyeán thöù nhaát: ñoïc maõ hôïp ngöõ vaø taïo baûng danh bieåu
Danh bieåu Ñiaï chæ töông ñoái
a 0
b 4
- Chuyeán thöù hai: ñoïc maõ hôïp ngöõ vaø dòch sang maõ maùy khaû ñònh
vò ñòa chæ:
MOV a, R1 0001 010000000000*
ADD #2, R1 0010 0110 00000010 (1.6)
MOV R1, b 0100 010000000100*
4. Boä caát lieân keát soaïn thaûo
Loader laø chöông trình thöïc hienä hai nhieäm vuï: caát vaø soaïn thaûo
lieân keát. Quaù trình caát bao goàm laáy maõ maùy khaû ñònh vò tính laïi
thaønh ñòa chæ tuyeät ñoái.
Nhö ôû ví duï phaàn 3: Giaû söû maõ maùy ñöôïc caát trong boä nhôù trong taïi
ñòa chæ L = 00001111; ñòa chæ tuyeät ñoái cuûa a, b laø 00001111 vaø
00010011. Ba chæ thò (1.6) ñöôïc vieát laïi döôùi daïng maõ maùy tuyeät
ñoái:
0001010000001111
0011011000000010 (1.7)
0010010000010011
Link-editor cho pheùp taïo moät chöông trình duy nhaát töø nhieàu taäp
tin ôû daïng maõ maùy khaû ñònh vò cuûa nhöõng laàn bieân dòch rieâng bieät
vaø töø caùc taäp tin thö vieän do heä thoáng cung caáp.
Chöông trình nguoàn vieát taét

Boä tieàn xöû lyù

Chöông trình nguoàn

Trình bieân dòch

Chöông trình ñoái töôïng trong maõ hôïp ngöõ

Trình bieân dòch hôïp ngöõ

Chöông trình trong maõ maùy khaû ñònh vò


Thö vieän heä thoáng,
caùc taäp tin ñoái töôïng Boä caát/ lieân keát – soaïn thaûo
khaû ñònh vò ñòa chæ
Chöông trình maõ maùy ñòa chæ tuyeät ñoái

Hình 1.19. Heä thoáng xöû lyù ngoân ngöõ


1.4. Nhoùm caùc giai ñoaïn cuûa trình bieân dòch
- Giai ñoaïn tröôùc vaø giai ñoaïn sau (front end and back end)
- Caùc chuyeán
- Thu giaûm soá löôïng caùc chuyeán
Thí duïï: goto L
:
goto L
:
L: a=b+c

„
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

Hình 2.1. Caáu truùc trình bieân dòch “front end”


2.2. Ñònh nghóa cuù phaùp
Vaên phaïm phi ngöõ caûnh (PNC) ñöôïc ñònh nghóa:
G2 = (Vt, Vn, S, P)
P : A → α1 | α2 |………|αn

Thí duï 2.1. Cho vaên phaïm G:


P: list → list + digit
| list – digit
| digit
digit → 0 |1| 2 | …|9
Thí duï 2.2. Vaên phaïm mieâu taû phaùt bieåu hoãn hôïp begin end cuûa Pascal
P : block → begin opt_stmts end
opt_stmts → stmt_list |€
stmt_list → stmt_list ; stmt | stmt
- Caây phaân tích
Söï khoâng töôøng minh
Thí duï 2.3. Vaên phaïm G sau ñaây laø khoâng töôøng minh:
P : string → string + string | string – string | 0 | 1 | ... |9
Caâu 9 – 5 + 2 cho hai caây phaân tích:
string string

string + string string - string

string - string 2 9 string + string

9 5 5 2
a) b)

Hình 2.2 Hai caây phaân tích cuûa caâu 9 – 5 + 2


Söï keát hôïp cuûa caùc toaùn töû
Möùc öu tieân cuûa caùc toaùn töû: * vaø / coù möùc öu tieân hôn + , - . Döïa vaøo
nguyeân taéc treân chuùng ta xaây döïng cuù phaùp cho bieåu thöùc soá hoïc:
exp → exp + term | exp – term | term
term → term * factor | term / factor | factor
factor → digit | ( exp )
Löu yù: pheùp toaùn luõy thöøa vaø pheùp gaùn trong C laø pheùp toaùn keát hôïp
phaûi. Vaên phaïm cho pheùp gaùn nhö sau:
right → letter = right | letter
letter → a | b | … | z

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 +

exp.t ::= 95 – termt ::= 2

exp.t ::= 9 termt.t ::= 5

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 (‘-‘)}

term {print (‘2‘)}


2
5 {print (‘5‘)}

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;

2.4. Phaân tích cuù phaùp


1. Phaân tích cuù phaùp töø treân xuoáng
Thí duï 2.6. Cho vaên phaïm G:
type → simple ⏐↑ id ⏐ array [ simple] of type
simple → integer ⏐char ⏐num dotdot num

Haõy xaây döïng caây phaân tích cho caâu:


array [num dotdot num] of integer
a) type
b) type
array [simple] of type
c) type
array [simple] of type
Hình 2.6.Caùc num dotdot num
böôùc xaây döïng d) type
caây phaân tích
array [simple] of type
theo phöông
phaùp töø treân num dotdot num simple
xuoáng cho caâu:
array e) type
[numdotdot array [simple] of type
num] of integer
num dotdot num simple

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

Luaät aùp duïng Chuoãi nhaäp


S xxxz
A xxxz
xA xxxz
A xxz
xA xxz
A xz
xA xz
A z
- Ñieàu kieän 1 : A Æ ξ1 | ξ2 | ... |ξn
- Ñònh nghóa:
first (ξi) = {s | s laø kyù hieäu keát thuùc vaø ξ ⇒ s…}
Ñieàu kieän 1 ñöôïc phaùt bieåu nhö sau :
A → ξ1 | ξ2 | ... | ξn
first (ξi) ∩ first (ξj) = ∅ vôùi i ≠ j
Löu yù: 1. first (aξ ) = {a}
2. Neáu A →α1 | α2 | … | αn; thì
first (Aξ) = first (α1) ∪ first (α2) ... ∪ first (αn)
Thí duï 2.11. Cho vaên phaïm G coù taäp luaät sinh:
S → Ax A → x | ∈ vôùi ∈ laø chuoãi roãng
Baûng 2.3. Phaân tích caâu nhaäp : x

Luaät Chuoãi nhaäp


A x
xx x
x -
Söï phaân tích thaát baïi
- Ñieàu kieän 2: first (A) ∩ follow (A) = ∅
Vôùi A →ξ1 | ξ2 | … | ξn | ∈
Follow (A) ñöôïc tính nhö sau: Vôùi moãi luaät sinh Pi coù daïng
X → ξAη thì follow (A) laø first (η ).
ÔÛ thí duï 2.11 first (A) ∩ follow (A) = {x}
Löu yù vaên phaïm coù ñeä quy traùi seõ vi phaïm ñieàu kieän 1. Thí duï:
A → B | AB (2.1)
Vaäy first (A) = first (B) ; first (AB) = first (A) = first (B).
first (B) ∩ first (AB) ≠ ∅ vi phaïm ñieàu kieän 1.
Neáu söûa luaät (2.1) thaønh A → ∈ | AB thì seõ vi phaïm ñieàu kieän 2.

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;

Toái ưu trình bieân dịch:


Đeå taêng toác doä bieân dòch ta thöïc hieân gôõ ñeä quy cuûa thuû tuïc rest:
procedure exp;
procedure term;
begin
:
end;
begin
term;
repeat
if lookahead = ‘+’ then
begin
match (‘+’); term; write(‘+’);
end
else if lookahead = ‘-’ then
begin
match(‘-’); term; write(‘-’)
end;
until (lookahead < > ‘+’) and (lookahead < > ‘-’);
end;
Hoaøn chænh chöông trình:
Chöông trình naøy bao goàm caû chöông trình ñoïc chuoãi nhaäp.
procedure exp;
procedure match (t : char);
begin
if lookahead = t then lookahead := readln (c);
else error
end;
procedure term;
begin
val (i,lookahead,e);
if e = 0 then begin
write (i);
match (lookahead );
end
else error;
end;{term}
begin
term;
repeat
if lookahead = ‘+’ then
begin
match (‘+’); term; write(‘+’);
end
else if lookahead = ‘-’ then
begin
match (‘-’); term; write(‘-’);
end;
until (lookahead < > ‘+’ ) and (lookahead < > ‘-’);
end; {exp }
begin
readln( c);
lookahead := c;
exp;
end;
2.6. Söï phaân tích töø vöïng
1. Loaïi boû khoaûng traéng vaø chuù thích
2. Nhaän bieát caùc haèng
3. Nhaän bieát danh bieåu vaø töø khoùa

Giao tieáp vôùi boä phaân tích töø vöïng

i f a b > = 0 .. t > = 0 t .. > = 0 t h ..

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

lexptr token caùc thuoäc tính khaùc


0
1 1 div
2 5 mod
3 9 id
4 15 id
Daõy lexemes
d i v EOS m o d EOS c o u n t EOS i EOS
Hình 2.11. Baûng danh bieåu
Moâ phoûng 2.2. Giaûi thuaät phaân tích töø vöïng
Procedure lexan;
var lexbuf array [0..100] of char;
c : char; ngöng : boolean;
begin
repeat
read (c ); ngöng := true;
if (c = blank ) or (c = tab) then ngöng := false
else if c = newline then begin line := lineno + 1
ngöng := false;
end
else if c laø chöõ soá then
begin
val (i, c, e);
tokenval := 0;
while e = 0 do begin
tokenval := tokenval * 10 + i;
read (c);
val (i, c, e);
end;
typetoken := num;
end {laø soá}
else if c laø chöõ then begin
p := 0; b := 0;
while c laø chöõ hoaëc soá do
begin lexbuf [b] := c;
read (c);
b := b + 1;
if b => b_size then error
end; /* b size laø kích thöôùc toái ña cuûa lexbuf*/
lexbuf [b] := eos;
p := lookup (lexbuf);
if p = 0 then
p = insert (lexbuf, ID);
tokenval := p;
typetoken := symtable [p]. token; end
else if c = eof then begin
tokenval := none;
typetoken := done; {heát chöông trình nguoàn}
end
else begin
tokenval := none; typetoken := c;
end
until ngöng;
end;
2.8. Maùy tröøu töôïng kieåu choàng
Vuøng chæ thò Choàng Vuøng döõ lieäu
1 push 5 5 + 0 1
2 rvalue 2 11 t 11 2
3 + a) 7 3
4 rvalue 3 4
5 ∗ pc 16 ∗
6 ………….. 7 t
b)
112 t
c)
Hình 2.12. Maùy tröøu töôïng kieåu choàng vôùi vieäc thöïc thi bieåu thöùc
(5 + 11) * 7
1. Chæ thò soá hoïc
2. Lvalue vaø Rvalue
Thí duï: i := i + 1
3. Thao taùc vôùi choàng
Caùc chæ thò: Lvalue, Rvalue, push v, pop, copy, :=
4. Bieân dòch cho bieåu thöùc
Thí duï: Bieân dòch phaùt bieåu gaùn:
day := (53*y) div 4 + (273 * m + 2) div 5 + d
chuyeån sang kyù hieäu haäu toá
day 53y * 4 div 273 m * 2 + 5 div + d + :=
dòch sang maõ maùy tröøu töôïng
5. Chæ thò ñieàu khieån trình töï
Caùc chæ thò bao goàm: label l, goto l, gotofalse l, gototrue l, halt.
6. Söï bieân dòch caùc phaùt bieåu
Thí duï: Phaùt bieåu if: ngöõ nghóa
stmt→ if exp then stmt
out := newlabel
stmt.t ::= exp.t || ‘gotofalse’ out || stmt.t || ‘label’ out
vuøng chæ thò
Ñoaïn maõ cho exp
gotofalse out
Ñoaïn maõ cho stmt
label out
Ñoaïn maõ cuûa phaùt bieåu sau phaùt bieåu if

Hình 2.13. Maõ maùy tröøu töôïng cuûa phaùt bieåu if


7. Giaûi thuaät cuûa trình bieân dòch caùc phaùt bieåu
procedure stmt;
var out : integer;
begin
if lookahead = id then
begin emit (‘lvalue’, tokenval);
match (id); match (‘ := ‘); exp; emit (‘:=‘, tokenval)
end
else if lookahead = ‘if’ then
begin match (‘if’); exp;
out := newlabel;
emit (‘gotofalse’, out);
match (‘then’); stmt;
emit (‘label’,out)
end
else error
end;

2.9. Thieát keá trình bieân dòch ñôn giaûn


1. Ñaëc taû trình bieân dòch
start→ list eof
list→ exp ; list | ∈
exp → exp + term {print (‘+’)}
lexp – term {print (‘-’)}
| term
term → term * factor {print (‘*’)}
| term / factor {print(‘/’)}
| term div factor {print (‘div’)}
| term mod factor {print (‘mod’)}
| factor
factor → (exp) | id | num
Bieåu thöùc ôû daïng trung toá

init scanner

symbol parser error

emit

Bieåu thöùc ôû daïng haäu toá


Hình 2.14. Sô ñoà cuûa trình bieân dòch cho bieåu thöùc töø daïng trung toá
sang daïng haäu toá
2. Nhieäm vuï cuûa caùc chöông trình con cuûa trình bieân dòch
scanner: phaân tích töø vuïng; parser: phaân tích cuù phaùp; emit: taïo daïng
xuaát cuûa token; symbol: xaây döïng baûng danh bieåu vaø thao taùc vôùi
baûng danh bieåu baèng insert vaø lookup; init: caát caùc töø khoùa vaøo baûng
danh bieåu; error: thoâng baùo loãi.
Moâ phoûng 2.3. Löôïc ñoà dòch tröïc tieáp cuù phaùp cuaû G sau khi ñöôïc boû
ñeä quy traùi: start → list eof
list → exp ; list | ∈
exp → term Rest1
Rest1 → + term {print (‘+’)} Rest1 | ∈
| - term {print (‘-’-)} | ∈
term → factor Rest2
Rest2 →* factor {print (‘*’)} Rest2
l/ factor {print (‘/’)} Rest2
| div factor {print (div’)} Rest2 | ∈
| mod factor {print (mod’)} Rest2 | ∈
factor → (exp)
| id {print (id.lexeme)}
| num {print(num.value)}
3. Giaûi thuaät cuûa trình bieân dòch
const bsize = 128; |para = 40;
none = ‘#’; plus = 43;
num = 256; minus = 45;
div = 257; star = 42;
mod = 258; slash = 47;
id = 259;
done = 260;
strmax = 999;
symax = 100;
type entry = record
lexptr : integer;
token : integer;
end;
str = string;
var tokenval : integer;
lineno : integer;
lookahead : char;
symtable : array [1..100] of entry;
lexbuf : string [bsize];
typetoken : integer;
lexemes: array[1..strmax] of char;
lastentry : integer;
lastchar : integer;
procedure scanner;
var t: char;
p, b, i: integer;
begin
read (t);
if (t = ‘ ‘ ) or (t = \t’) then
repeat read (t);
until (t < > ‘ ‘) and (t < > ‘\t’);
else if t = ‘\t’ then begin
lineno := lineno + 1;
read ( t );
end
else if t in [‘0’..’9’] then begin
val ( i,t,e);
tokenval := 0;
while e = 0 do begin
tokenval := tokenval *10 + I;
read (t);
val (i,t,e);
end;
typetoken := num;
end
else if t in [ ‘A’..’Z’,’a’..’z’] then
begin
p:= 0; b := 0;
while t in [‘0’..’9’,’A’..’Z’,’a’..’z’] do
begin lexbuf [b] := t;
read (t);
b := b + 1;
if (b > = bsize) then
error
end;
lexbuf [b] := eos;
p := lookup (lexbuf);
if p = 0 then p := insert ( lexbuf, id);
tokenval := p;
typetoken := symtable[p].token;
end
else if t = eof then typetoken := done
else begin
typetoken := ord (t);
read (t)
end;
tokenval := none;
end;
end; {scanner}
/*-----------------------*/
procedure parser;
procedure exp;
var t : integer;
procedure term;
var t : integer;
procedure factor;
begin
case lookahead of
|para : begin match ( lpara); exp;
match(rpara); end;
num : begin emit (num, tokenval); match (num)
end;
id : begin emit (id, tokenval );
match (id) end;
else error (‘ loãi cuù phaùp’, lineno);
end; {case}
end; {factor}
/*-----------------------------*/
begin {term}
factor;
while lookahead in [star, slash, div, mod] do
begin
t := lookahead;
match (lookahead);
factor; emit (t, none);
end;
end; {term}
begin {exp}
term;
while (lookahead = plus) or (lookahead = minus) do
begin
t := lookahead ; match (lookahead);
term; emit (t, none);
end; end;
begin {parser}
scanner; lookahead := typetoken;
while lookahead < > done do
begin exp; match (semicolon); end;
end; {parser}
/*-----------------------*/
procedure match (t : integer);
begin
if lookahead = t then begin
scanner;
lookahead := typetoken ; end
else error (‘ loãi cuù phaùp’, lineno);
end;
procedure emit (t : integer; tval : integer);
begin
case t of
plus, minus, star, slash : writeln (chr (t ));
div : writeln (‘div’);
mod : writeln (‘mod’);
num : writeln (tval);
id : wrteln (symtable[tval].lexptr^);
else writeln (chr (t). tval);
end;
end; {emit}
fuction strcmp (cp : integer; s: str) : integer;
var i, l : integer;
begin i := t; l := length (s);
while ( I < = l ) and (s[i] = lexemes [cp] do
begin
i := i + 1;
cp := cp + 1;
end;
if i > l then strcmp := 1
else strcmp := 0
end; {strcmp}
procedure strcopy (cp : integer; t : str);
var i : integer;
begin
for i := 1 to length (t) do
begin
lexemes [cp] := t [i]
cp := cp + 1;
end;
lexemes [cp] := eos;
end; {Strcopy}
function lookup (s : string) : integer;
var I, p: integer;
begin p := lastentry;
while (p > 0) and (Strcmp (symtable [p].lexptr ^ , s) = 0) do
p := p – 1;
lookup := p;
end; {lookup}
/*------------------- */
function insert (s : str; typetoken : integer) : integer;
var len: integer;
begin
len := length (s );
if (lastentry + 1 > = symax ) then error (‘baûng danh
bieåu ñaày’, lineno);
if (lastchar + len + 1 > = strmax ) then
error (‘daõy lexemes ñaày, lineno);
lastentry := lastentry + 1;
symtable [ lastentry].token := typyetoken;
symtable [latsentry].lexptr := @lexemes[lastchar + 1];
lastchar := lastchar + len + 1;
strcopy (symtable [latsentry].lexptr ^, s)
insert := lastentry;
end; {insert}
/*------------------*/
procedure init;
var keyword : array[1.3] of
record
lexeme : string [10]
token : integer;
end;
r, i : integer;
begin keyword [i].lexeme := ‘div’;
keyword [1].token := div;
keyword [2].lexeme:= ‘mod’;
keyword [2].token := mod;
keyword [3].lexeme := ‘0’;
keyword [3].token := 0;
r := 3;
for i := 1 to r do
p := insert (keyword [i].lexem, keyword [i].token);
end;
/*----------------*/
procedure error (m : str; lineno : integer);
begin writeln (m, lineno);
stop;
end;
/*----------------*/
begin {main}
lastentry := 0; lineno := 0; tokenval := -1;
lastchar := 0;
init;
parser;
end; {main}
CHÖÔNG 3
PHAÂN TÍCH TÖØ VÖÏNG

3.1. Vai troø cuaû boä phaân tích töø vöïng


1. Token, maãu, trò töø vöïng
Baûng 3.1 Baûng danh bieåu cuûa token
Token Trò töø vöïng YÙ nghóa cuûa maãu
const const const
if if if
then then then
ralation < , < =, < >, = , > = caùc toaùn töû quan heä
num 3.14, 2.5, 7.6 haèng soá baát kyø
id abc, ou, bc1… chuoãi goàm kyù töï chöõ vaø soá,
baét ñaàu laø kyù töï chöõ
literal ‘abcef’ laø chuoãi kyù töï baát kyø naèm
giöõa 2 daáu ‘
Chöông trình
nguoàn token
Boä phaân tích Boä phaân
töø vöïng tích CP
yeâu caàu token

Baûng danh bieåu

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

3.2. CAÙC TÍNH CHAÁT CUÛA TOKEN


3.3. CHÖÙA TAÏM CHÖÔNG TRÌNH NGUOÀN
1. Caëp boä ñeäm
Caáu taïo
A : = B * . - 2 eof

p1 p2

Hình 3.2. Caëp boä ñeäm


Quy trình hoaït ñoäng
Giaûi thuaät:
if p2 ôû ranh giôùi moät nöûa boä ñeäm then
begin laáp ñaày N kyù hieäu nhaäp môùi vaøo nöûa beân phaûi
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 nhaäp vaøo nöûa beân traùi boä ñeäm
chuyeån
p2 veà kyù töï taän cuøng beân traùi cuûa boä ñeäm end
else p2 := p2 + 1;
2. Phöông phaùp caàm canh

A : = B * X EOF - 2 EOF EOF

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 */

3.4. Ñaëc taû token


Caùc quy taéc ñònh nghiaõ bieåu thöùc chính quy
1. ∈ laø bieåu thöùc chính quy, bieåu thò cho taäp {∈}
2. a laø kyù hieäu thuoäc Σ, bieåu thò cho taäp {a}
3. r vaø s laø hai bieåu thöùc chính quy, bieåu thò cho L (r) vaø L (s) thì:
ø a) (r) | (s) laø bieåu thöùc chính quy, bieåu thò cho L(r) ∪ L(s).
b) (r) (s) laø bieåu thöùc chính quy, bieåu thò cho L(r) L(s).
c) (r)* laø bieåu thöùc chính quy, bieåu thò cho (L(r))*.
d) r laø bieåu thöùc chính quy, bieåu thò cho L(r).
Thí duï 3.1. Cho Σ = {a, b}
1. a|b
2. (a| b) | (b| a)
3. a*
Hai bieåu thöùc chính quy töông ñöông r vaø s, kyù hieäu r = s.
2. Ñònh nghóa chính quy
Neáu Σ laø taäp kyù hieäu caên baûn, thì ñònh nghiaõ chính quy laø chuoãi ñònh
nghiaõ coù daïng: d1 → r 1
……
dn → r n
Thí duï 3.2. letter → A | B | …|Z | a| b |…| z
digit → 0 |1| …| 9
id → letter ( letter | digit)*

Thí duï 3.3. digit → 0 | 1 |… | 9


digits → digit digit*
optional_fraction → .digits | ∈
optional_exponent → (E (+| - |∈) digits) | ∈
3.5. Nhaän daïng token
Thí duï 3.4. Cho vaên phaïm G:
stmt → if exp then stmt
| if exp then stmt else stmt
|∈
exp → term relop term | term
term → id | num

Ñònh nghóa chính quy


if → if then → then else → else
relop → < | <= | > | >= | <> | =
id → letter (letter | digit)*
num → digit+ (.digit+ | ∈) ( E ( + | - | ∈) digit+ | ∈ )
delim → blank | tab | newline
ws → delim+

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}

3.8. Automat höõu haïn


1. Automat höõu haïn khoâng taát ñònh (NFA)
Thí duï: Cho NFA:
Taäp traïng thaùi S = {0, 1,2, 3}; Σ = {a, b}; Traïng thaùi baét ñaàu so = 0;
Taäp traïng thaùi keát thuùc F = {3}.
Baûng 3.4. Baûng truyeàn cho NFA ôû hình 3.10

Kyù hieäu nhaäp


Traïng thaùi
a b
0 {0, 1} {0}
1 - {2}
2 - {3}
NFA chaáp nhaän moät chuoãi nhaäp x neáu vaø chæ neáu toàn taïi moät ñöôøng
naøo ñoù trong sô ñoà töø traïng thaùi baét ñaàu ñeán traïng thaùi keát thuùc sao
cho taát caû teân cuûa caùc caïnh con ñöôøng cho chuoãi x. NFA chaáp nhaän
chuoãi aabb.

2. Automat höõu haïn taát ñònh (DFA)


DFA laø tröôøng hôïp ñaëc bieät cuûa NFA, noù khoâng coù:
i) Söï truyeàn roãng.
ii) Vôùi moãi traïng thaùi s vaø kyù hieäu nhaäp a chæ toàn taïi nhieàu nhaát moät
caïnh coù teân a xuaát phaùt tö øs.
Giaûi thuaät 3.1. Moâ phoûng hoaït ñoäng cuûa DFA treân chuoãi nhaäp x.
Thí duï 3.5

start a a b b
0 0 1 1 3

Hình 3.12. DFA nhaän daïng ngoân ngöõ (a | b)*abb

3. Chuyeån NFA sang DFA


Giaûi thuaät 3.2. Xaây döïng taäp con (Taïo DFA töø NFA).
Nhaäp: Cho NFA goïi laø N.
Xuaát: DFA goïi laø D, nhaän daïng cuøng ngoân ngöõ nhö NFA.
Phöông phaùp: Xaây döïng baûng truyeàn cho D. Moãi traïng thaùi cuûa D laø
taäp traïng thaùi cuûa N. D moâ phoûng ñoàng thôøi moïi chuyeån ñoäng cuûa N
treân chuoãi nhaäp cho tröôùc baèng caùc taùc vuï:
∈-closure (s); ∈-closure (T); move (T, a)
Moâ phoûng 3.2. Xaây döïng taäp con
Giaûi thuaät: Tính ∈-closure
Ñaåy taát caû caùc traïng thaùi trong T leân stack; Khôûi taïo ∈-closure (T)
cho T.
Moâ phoûng 3.3. Tính ∈-closure
Thí duï 3.6. (H.3.13 ) laø NFA nhaän daïng ngoân ngöõ (a | b )* abb. Chuùng
ta duøng giaûi thuaät 3.2 ñeå xaây döïng DFA töông ñöông.

a
∈ 2 3 ∈
start ∈ a b b
0 1 6 7 8 9 10
∈ b
4 5 ∈

Hình 3.13. NFA nhaän daïng (a | b)* abb


3.9. Töø bieåu thöùc chính quy ñeán NFA
Xaây döïng NFA töø bieåu thöùc chính quy
Giaûi thuaät 3.3. Xaây döïng NFA töø bieåu thöùc chính quy (Caáu truùc
Thompson’)
Nhaäp: Bieåu thöùc chính quy r treân Σ.
Xuaát: NFA nhaän daïng ngoân ngöõ L (r).
Phöông phaùp:
Quy taéc:
1. Vôùi ∈ , xaây döïng NFA
start ∈
i f

2. Vôùi a thuoäc Σ, xaây döïng NFA

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 N(s) N(t)


i f
- Vôùi bieåu thöùc s* , xaây döïng NFA N (s*)

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}

{1}a {1} {2}a {2}


Hình 3.19. Tính caùc haøm nullable, firstpos, lastpos cho caùc nuùt treân caây
phaân tích cuûa bieåu thöùc ( a| b )* abb
Sau ñoù ta tính haøm followpos.
Baûng 3.7. caùc trò followpos cuûa caùc nuùt treân caây ôû (H.3.19)
Nuùt followpos
1 {1,2,3}
2 {1,2,3}
3 {4}
4 {5}
5 {6}
6 _

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)

3. Toái thieåu soá traïng thaùi cuûa DFA


- Khaùi nieäm DFA ñaày ñuû, traïng taùi cheát d.
- Chuoãi w phaân bieät traïng thaùi s vôùi traïng thaùi t.
Thí duï: DFA ôû (H.3.14, tr. 90), neáu xuaát phaùt töø C ñeå nhaän daïng w=bb
thì khoâng ñi ñöôïc ñeán traïng thaùi chaáp nhaän, ngöôïc laïi töø B thì ñi ñeán E
laø traïng thaùi chaáp nhaän.
Giaûi thuaät 3.6. Toái thieåu soá traïng thaùi cuûa DFA.
Nhaäp: DFA, goïi laø M coù S, Σ, s0, F. M laø DFA ñaày ñuû.
Xuaát: DFA, goïi laø M’ chaáp nhaän ngoân ngöõ nhö M, vôùi soá traïng thaùi
nhoû nhaát.
Phöông phaùp:
1.Taïo Π khôûi ñaàu coù 2 nhoùm: caùc traïng thaùi keát thuùc F, vaø caùc traïng
thaùi khoâng keát thuùc S – F.
2. AÙp duïng thuû tuïc (moâ phoûng 3.6) ñeå taïo Πnew .
3. Neáu Πnew = Π thì Πfinal = Π, tieáp tuïc böôùc 4, ngöôïc laïi laëp laïi böôùc
2, vôùi Π = Πnew
4. Chuùng ta choïn moãi nhoùm 1 traïng thaùi ñaïi dieän vaø ñoù laø traïng thaùi
cuûa M’ .
5. Neáu M’ coù traïng thaùi cheát d thì loaïi noù ra khoûi M’. Taát caû caùc söï
truyeàn ñeán traïng thaùi d ñeàu khoâng xaùc ñònh.

Moâ phoûng 3.6. Giaûi thuaät taïo Πnew


for vôùi moãi nhoùm G cuûa Π do begin
- chia G thaønh caùc nhoùm nhoû hôn sao cho hai traïng thaùi s vaø t
cuûa G seõ ôû cuøng moät nhoùm nhoû hôn neáu vaø chæ neáu caùc söï truyeàn treân
taát caû caùc kyù hieäu nhaäp a töø s vaø t ñeàu ñi ñeán caùc traïng thaùi keá tieáp ôû
trong cuøng moät nhoùm cuûa Π;
- ta thay G baèng caùc nhoùm nhoû hôn vöøa ñöôïc taïo neân, cho
chuùng vaøo Πnew ;
end;

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

1 • 0 -1-1…12-1…..1111111111-1…-1 5-1… ynext 1

2 • 6 ‘0’,2 ‘1’,2 ‘2’,3 ‘3’,4 ‘4’,1 ‘5’,1 ynext 2

3 • 7 ‘0’,1 ‘1’,1 ‘2’,2 ‘3’,2 ‘4’,2 ‘5’,2 ‘6’,2 ynext 3

4 • 7 ‘0’,4 ‘1’,4 ‘2’,4 ‘3’,2 ‘4’,2 ‘5’,2 ‘6’,2 ynext 4

5 • 6 ‘0’,2 ‘1’,2 ‘2’,2 ‘3’,2 ‘4’,1 ‘5’,1 ynext 5

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)

Boä ñeäm nhaäp


Chöông trình
moâ phoûng FA

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

4.1. Vai troø cuûa boä phaân tích cuù phaùp


- Phöông phaùp toång quaùt: Cocke-Younger-Kasami vaø Earley.
- Phaân tích töø treân xuoáng.
- Phaân tích töø döôùi leân.
4.2. Xaây döïng vaên phaïm cho ngoân ngöõ laäp trình
Loaïi boû söï khoâng töôøng minh
stmt → if exp then stmt
if exp then stmt else stmt
| other
Thí duï: phaùt bieåu: if E1 then if E2 then S1 else S2 laø phaùt bieåu
khoâng töôøng minh
- Loaïi boû söï khoâng töôøng minh.
Quy öùôc hoaëc söûa vaên phaïm.
stmt → matched-stmt
lunmatched-stmt
matched-stmt→ if exp then matched-stmt else matched-stmt1
| other
unmatched-stmt → if exp then stmt
| if exp then matched-stmt else unmatched-stmt
Loaïi boû ñeä quay traùi
Vaên phaïm goïi laø ñeä quy traùi neáu toàn taïi daãn xuaát.
A ⇒ Aα, vôùi α ⊂ ( Vt ∪ Vn)
Ñeä quy traùi laø bao goàm ñeä quy traùi ñôn giaûn (tröïc tieáp) vaø ñeä quy traùi
toång quaùt.
Ñeå loaïi boû ñeä quy ñôn giaûn, ta seõ thay theáõ taäp luaät sinh:
A → Aα1⏐Aα2⏐ …… ⏐Aαm⏐β1⏐β2⏐…..⏐βn
baèng caëp luaät sinh
A→ β1A’⏐β2A’⏐…⏐βnA.’
A’→α1A’⏐α2A’⏐ …..⏐αmA’⏐∈
Thí duï 4.1. Loaïi boû ñeä quy traùi cho vaên phaïm:
E→ E+T⏐ T
T→ T*F⏐F
F → (E) ⏐ id
Giaûi thuaät 4.1. Loaïi boû ñeä qy traùi
Nhaäp: Vaên phaïm G khoâng coù voøng laëp hoäi luaät sinh roãng.
Xuaát : Vaên phaïm töông ñöông G’ khoâng coù ñeä quy traùi.
Phöông phaùp: AÙp duïng giaûi thuaät ôû moâ phoûng 4.1 cho G. G’ khoâng
coøn ñeä quy traùi nhöng coù theå coù luaät sinh roãng.
Saép xeáp caucus kyù hieäu khoâng keát thuùc theo moät thöù töï naøo ñoù: A1,
A2, …. An .

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
$

Baûng phaân tích M

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.

Baûng 4.2. Caùc böôùc phaân tích cuù phaùp caâu id + id ∗ id

Stack Chuoãi nhaäp Xuaát Stack Chuoãi nhaäp Xuaát


$E id + id ∗ id $ $E’T’F id ∗ id $ T Æ FT’
$E’T id + id ∗ id $ E Æ TE’ $E’T’id id ∗ id $ F Æ id
$E’T’F id + id ∗ id $ T Æ FT’ $E’T’ ∗ id $
$E’T’id id + id ∗ id $ F Æ id $E’T’F∗ ∗ id $ T’ Æ ∗FT’
$E’T’ + id ∗ id $ $E’T’F id $
$E’ + id ∗ id $ T’ Æ ∈ $E’T’id id $ F Æ id
$E’T+ + id ∗ id $ E’ Æ +TE’ $E’T’ $
$E’T id ∗ id $ $E’ $ T’ Æ ∈
$ $ E’ Æ ∈
Xaây döïng baûng phaân tích M
a. first vaø follow
first(α) laø taäp c kyù hieäu keát thuùc a, daãn ñaàu caùc chuoãi ñöôïc daãn xuaát
töø α, α ⇒ aγ. Neáu α ⇒ ∈ thì ∈ thuoäc first(α).
follow(A) laø taäp caùc kyù hieäu keát thuùc a, xuaát hieän ngay beân phaûi A
trong daïng caâu. Nhö vaäy toàn taïi daãn xuaát S ⇒ αAaβ. Neáu giöõa A vaø a
toàn taïi chuoãi kyù hieäu, thì noù seõ daãn xuaát ra chuoãi roãng. Neáu A ôû taän
cuøng beân phaûi cuûa daïng caâu thì $ thuoäc follow(A).
- Caùc quy taéc tính first(X) vôùi X laø kyù hieäu vaên phaïm.
- Caùc quy taéc tính follow(A) cho taát caû caùc kyù hieäu khoâng keát thuùc
A.

Thí duï 4.5. Cho vaên phaïm G.


E Æ TE’
E’Æ + TE’⏐∈
T Æ FT’
T’Æ ∗ FT’⏐∈
F’Æ (E)⏐id
Toaøn boä caùc haøm first vaø follow cuûa caùc kyù hieäu vaên phaïm cuûa G :
first(E) = first(T) = first(F) = {(, id}
first(E’) = {+, ∈} ; first(T’) = {*, ∈}
follow(E) = follow(E’) = {$, )}
follow(T) = follow(T’) = {+, $, )}
follow(F) = {*, +, $, )}
b. Xaây döïng baûng phaân tích M
Giaûi thuaät 4.3. Xaây döïng baûng phaân tích M.
Nhaäp: vaên phaïm G.
Xuaát: baûng phaân tích M.
Phöông phaùp:
1. Vôùi moãi luaät sinh A Æ α haõy thöïc thi böôùc 2 vaø 3.
2. Vôùi moãi kyù hieäu keát thuùc a thuoäc first(α), theâm A Æ α vaøo M[A, a].
3. Neáu kyù hieäu ∈ thuoäc first(α), theâm A Æ α vaøo M[A, b] sao cho b
thuoäc follow(A). Neáu $ thuoäc follow(A) thì theâm A Æ α vaøo M [A, $].
4. Nhöõng phaàn töû cuûa baûng M troáng, haõy ñaùnh daáu loãi.
Vaên phaïm LL (1)
Thí duï 4.7. Cho vaên phaïm G.
S Æ iEtSS’⏐a ; S’ Æ eS⏐∈ ; E Æ b

Baûng 4.3. Baûng phaân tích M cho thí duï 4.7.

Caùc Kyù hieäu nhaäp


kyù hieäu
khoâng a b e i t $
KT
S SÆa S Æ iEtSS’

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.

Thí duï 4.8. Cho vaên phaïm


E Æ TE’ ; E’ Æ + TE’⏐∈ ; T Æ FT’ ; T’ Æ * FT’⏐∈; F Æ (E)⏐id
first(E) = first(T) = first(F) = {(, id)}
first(E’) = {+, }∈; first (T’) = {*, }∈
follow(E) = follow(E’) = {$, )}
follow(T) = follow(T’) = {+, $, )}
follow(F) = {*, +, $, )}
Baûng 4.4. Phaân tích M coù kyù hieäu khaéc phuïc loãi.

Kyù hieäu Kyù hieäu nhaäp


khoâng
KT id + * ( ) $
E E Æ TE’ E Æ TE’ synch synch
E’ E’ Æ +TE’ E’ Æ ∈ E’ Æ ∈
T T Æ FT’ synch T Æ FT’ synch synch

T’ T’ Æ ∈ T’ Æ * FT’ T’ Æ ∈ T’ Æ ∈

F F Æ id synch synch F Æ (E) synch synch


4.4. Phaân tích cuù phaùp töø döôùi leân
Phaân tích cuù phaùp töø döôùi leân ñöôïc hieåu laø phaân tích ñaåy vaø thu giaûm
(Shift-Reduce parsing) laø phöông phaùp phaân tích LR.

Thí duï 4.9. Cho vaên phaïm G.


S Æ aABe ; A Æ Abc⏐b ; BÆ d
Phaân tích caâu w = abbcde.
Toùm taét caùc böôùc thu giaûm nhö sau:
Quaù trình thu giaûm neáu theo chieàu ngöôïc laïi thì ñoù chính laø quaù trình
daãn xuaát phaûi. Quaù trình naøy ñaõ sinh caây cuù phaùp cuûa caâu phaân tích töø
döôùi leân.
Hình 4.8. Caây cuù phaùp ñöôïc xaây döïng töø döôùi leân cuûa caâu w = abbcde.
Handle
Tìm kieám handle
Baét ñaàu töø chuoãi caàn phaân tích w, ta ñaët w = γn . γn laø daïng caâu ñöôïc
daãn xuaát ôû laàn thöù n.
1 2 r -1 n
S = γ0 ⇒ γ1 ⇒ γ2 ⇒ …⇒ γn-1 ⇒ γn = w
rm rm rm rm rm

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.

1. Phaân tích cuù phaùp thöù töï yeáu


Vaên phaïm coù tính chaát: khoâng coù luaät sinh naøo coù veá phaûi laø chuoãi
roãng (A Æ ∈) hoaëc ôû veá phaûi khoâng coù hai kyù hieäu khoâng keát thuùc
ñöùng keà nhau goïi laø vaên phaïm thöù töï yeáu.
Boä phaân tích cuù phaùp thöù töï yeáu
1. Caáu taïo

$ X1 X2 … Xn-1 Xn Y1 Y2 … Yn-1 Yn $

Chöông trình Xuaát


phaân tích

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;

3. Xaây döïng baûng phaân tích S-R



Ñònh nghóa caùc quan heä <• , = , • >:
- Chuùng ta noùi X <• Y neáu vaø chæ neáu toàn taïi moät luaät sinh maø veá
phaûi coù daïng … XA vôùi A laø kyù hieäu khoâng keát thuùc vaø sinh ra moät
chuoãi baét ñaàu baèng Y (A ⇒ Y…).
- X •> Y neáu vaø chæ neáu toàn taïi moät luaät sinh maø veá phaûi coù daïng
…AB. A sinh ra moät chuoãi kyù hieäu ñöôïc keát thuùc baèng X (A ⇒ …X). B
sinh ra moät chuoãi ñöôïc baét ñaàu baèng Y (B ⇒ Y…), hoaëc B = Y.
ÔÛ ñaây coù hai tröôøng hôïp xaûy ra trong quaù trình tìm caùc moái quan heä
cho caëp (X, Y):
Tröôøng hôïp 1: Y laø kyù hieäu keát thuùc
Tröôøng hôïp 2: Y laø kyù hieäu khoâng keát thuùc.
a. Toàn taïi $ ≤• A vôùi A laø kyù hieäu muïc tieâu cuûa vaên phaïm cho tröôùc.
b. Neáu veá phaûi luaät sinh coù X naèm keà ngay Y veà phía traùi (…XY…)
thì X ≤• Y
c. Neáu X ≤• Y maø toàn taïi moät luaät sinh Y Æ Z1 … Zn thì X ≤• • Z1
d. Toàn taïi A •> $ vôùi A laø kyù hieäu muïc tieâu
e. Neáu X ≤• •Y vaø toàn taïi moät luaät sinh X Æ Z1 … Zn thì Zn • > Y
g. Neáu X •> Y vaø toàn taïi moät luaät sinh Y Æ Z1 … Zn thì X • > Z1

4. Vaên phaïm thöù töï yeáu


Moät vaên phaïm ñöôïc goïi laø thöù töï yeáu neáu thoûa caùc ñieàu kieän sau:
1. Khoâng coù hai luaät sinh coù cuøng moät veá phaûi.
2. Khoâng coù phaàn töû S-R [X, Y] naøo cuûa baûng S-R vöøa coù trò S
vöøa coù trò R.
3. Neáu toàn taïi luaät sinh AÆX1 X2 … Xn vaø luaät sinh BÆXiXi+1… Xn
thì khoâng toàn taïi quan heä Xi – 1 ≤• • B.
2. Boä phaân tích cuù phaùp LR
- Caùc tính chaát cuûa phöông phaùp phaân tích LR
- Giaûi thuaät phaân tích cuù phaùp LR

1. Boä phaân tích cuù phaùp coù caáu taïo nhö sau:

a1 a2 … ai an $ boä ñeäm nhaäp

Stack Sm
Xm
Chöông trình xuaát
Sm –1
ñieàu khieån
Xm – 1

$ action goto baûng phaân tích

Hình 4.11. Moâ hình boä phaân tích cuù phaùp LR


2. Hoaït ñoäng
Stack ñöôïc duøng ñeå chöùa chuoãi kyù hieäu coù daïng s0 X1 s1 X2 … Xm sm.
Caëp (sm, ai ) seõ xaùc ñònh moät trò ñöôïc löu chöùa trong baûng phaân tích.
Baûng phaân tích goàm hai phaàn bieåu thò bôûi haøm action vaø goto. Caáu
hình (configuration) cuûa boä phaân tích LR:
s0 X1 s1 … Xi si … Xm sm, ai ai+1 … an $). Caáu hình naøy cho chuùng ta daïng
caâu X1 X2 … Xm ai ai+1 … an.

Giaûi thuaät 4.5. Phaân tích cuù phaùp LR


Nhaäp: chuoãi nhaäp w, baûng phaân tích action goto cuûa vaên phaïm G.
Xuaát: neáu w thuoäc L (G), noù taïo ra söï phaân tích töø döôùi leân. Ngöôïc laïi,
boä phaân tích seõ baùo loãi.
Phöông phaùp:
- Thôøi ñieåm ban ñaàu stack coù traïng thaùi s0.
- Chuoãi w$ naèm treân boä ñeäm nhaäp.
- Boä phaân tích ñaët ñaàu ñoïc (con troû ip) vaøo kyù hieäu nhaäp ñaàu tieân cuûa
w.
c:=false; /*c laø bieán luaän lyù, baùo cho bieát quaù trình phaân tích keát
thuùc*/
repeat
- Ñaët s laø traïng thaùi treân ñænh stack a laø kyù hieäu nhaäp ñöôïc ip
chæ ñeán
if action [s, a] = shift(s’) then begin
(a)ñaåy a leân stack (b)sau ñoù ñaåy s’ leân ñænh stack
(c)chuyeån ip sang kyù hieäu nhaäp keá tieáp; end
else if action [s, a] = reduce(A Æ β) then
begin
(a)ñaåy (2*⏐β⏐) kyù hieäu ra khoûi stack, s’ laø traïng thaùi
treân ñænh stack
(b)Tìm j = goto [s’, A]; (c)ñaåy A vaø sau ñoù laø j leân ñænh
stack; (d)xuaát luaät A Æ β
end
else if action [s, a] = accept then c := true
else error ();
until c;
Thí duï 4.12. Cho vaên phaïm G
(1) E Æ E + T (2) E Æ T (3) T Æ T * F
(4) T Æ F (5) F Æ (E) (6) F Æ id
Baûng 4.8. Baûng phaân tích cho vaên phaïm G ôû thí duï 4.12.
action goto
Traïng thaùi
id + * ( ) $ E T F
0 s5 s4 1 2 3
1 s6 acc
2 r2 s7 r2 r2
3 r4 r4 r4 r4
4 s5 s4 8 2 3
5 r6 r6 r6 r6
6 s5 s4 9 3
7 s5 s4 10
8 s6 s11 s11
9 r1 s7 r1 r1
10 r3 r3 r3 r3
11 r5 r5 r5 r5
Thí duï: Phaân tích caâu w = id ∗ id + id
Vaên phaïm LR
Xaây döïng baûng phaân tích SLR
Ñònh nghóa thöïc theå LR (0)
Thí duï: G coù luaät sinh A Æ XYZ, seõ cho boán thöïc theå:
AÆ•XYZ; AÆX•YZ; AÆXY•Z; AÆXYZ•
Neáu A Æ ∈ seõ cho ta thöïc theå A Æ • •
YÙ töôûng cô baûn cuûa giaûi thuaät xaây döïng baûng phaân tích SLR laø töø vaên
phaïm, chuùng ta ñi tìm DFA, nhaän daïng chuoãi daãn ñaàu beân traùi cuûa
daïng caâu (viable prefixe).
Ñònh nghóa vaên phaïm gia toá: neáu G laø vaên phaïm, thì G’ laø vaên phaïm
gia toá, laø G coù S’ laø kyù hieäu muïc tieâu vaø coù theâm luaät sinh
S’ Æ S.
Pheùp bao ñoùng – Closure.
Giaûi thuaät tính closure.
Moâ phoûng 4.4. Giaûi thuaät tính haøm closure
function closure (| : item) : item;
begin J := |;
repeat
for vôùi moãi thöïc theå A Æ α.Bβ trong J vaø vôùi moãi
luaät sinh
B Æ γ trong G sao cho
thöïc theå B Æ • γ chöa coù trong J do
theâm B Æ • γ vaøo J;
until khoâng theå theâm thöïc theå môùi vaøo J;
closure := J;
end;

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.13. Cho vaên phaïm gia toá G’


E’ Æ E ; E Æ E + T ; E Æ T
T Æ T* F ; T Æ F ; F Æ (E) ; F Æ id
Haõy tìm taäp C vaø sô ñoà DFA.
Xaây döïng baûng phaân tích SLR
Giaûi thuaät 4.6. Xaây döïng baûng phaân tích
Nhaäp: vaên phaïm gia toá G’
Xuaát: baûng phaân tích SLR vôùi haøm action vaø goto cho vaên phaïm G’
Phöông phaùp:
1. Xaây döïng C = {Io, I1, … In}.
2. i laø traïng thaùi ñaïi dieän cho taäp thöïc theå Ii.
a. Neáu A Æ α•aβ laø thöïc theå ôû trong Ii vaø goto (Ii, a) = Ij thì phaàn töû
action [i, a] = shift(j), vôùi a phaûi laø kyù hieäu keát thuùc.
b. Neáu A Æ α• ôû trong Ii thì action [i, a] = reduce(A Æα) vôùi a laø
taát caû caùc kyù hieäu naèm trong follow (A). A khoâng phaûi laø S’ (kyù hieäu
muïc tieâu môùi).
c. Neáu S’ Æ S• ôû trong Ii thì action [i, $] = accept.
3. Cho taát caû caùc kyù hieäu khoâng keát thuùc A. Neáu goto [Ii, A]=Ij thì
haøm goto [i, A]=j.
4. Taát caû caùc phaàn töû cuûa baûng phaân tích khoâng ñöôïc xaùc ñònh baèng
quy taéc 2 vaø 3, chuùng ta coi laø loãi.
5. Traïng thaùi baét ñaàu cuûa boä phaân tích laø taäp thöïc theå coù chöùa thöïc theå
S’ Æ•S.
Thí duï 4.14. Xaây döïng baûng phaân tích SLR cho vaên phaïm G ôû thí duï
4.13.
Thí duï 4.15. Cho vaên phaïm G.
(1) S Æ L = R
(2) S Æ R
(3) L Æ * R
(4) L Æ id
(5) R Æ L
Ta nhaän thaáy ñuïng ñoä khi action [2, =] = s6 ñoàng thôøi action [2, =] = r5
vaø action [2, $] = r5. Do ñoù taïi phaàn töû action [2, =] coù hai trò s6 vaø r5.
Nhö vaäy G khoâng phaûi laø vaên phaïm SLR.

Xaây döïng baûng phaân tích Canonical LR


Daïng toång quaùt cuûa thöïc theå laø [A Æ α.β, a] vôùi A Æ αβ laø luaät sinh
vaø a laø kyù hieäu keát thuùc hoaëc daáu $. Thöïc theå coù daïng nhö theá ñöôïc
goïi laø thöïc theå LR (1). Neáu β = ∈ thì thöïc theå seõ coù daïng [A Æ α• , a].
Luùc naøy chuùng ta thöïc hieän thu giaûm baèng luaät sinh A Æ α chæ vôùi
ñieàu kieän kyù hieäu nhaäp keá tieáp laø a.
Chuùng ta noùi thöïc theå LR (1) [A Æ α.β, a] laø hôïp leä vôùi chuoãi kyù hieäu
daãn ñaàu daïng caâu γ neáu toàn taïi daãn xuaát phaûi:
S ⇒ δAw ⇒ δαβw vôùi
rm rm
1. γ = δα vaø
2. hoaëc a laø kyù hieäu daãn ñaàu cuûa w, hoaëc w = ∈ thì a laø $.

Thí duï 4.16. Cho vaên phaïm G


S Æ BB
B Æ aB | b

Tính taäp tuyeån caùc thöïc theå LR (1)


Pheùp tính closure
Giaûi thuaät 4.7. Xaây döïng caùc taäp thöïc theå LR (1).
Moâ phoûng 4.7. Giaûi thuaät tính caùc taäp thöïc theå LR (1) cho vaên phaïm
gia toá G’
function closure (I: items): items;
begin
repeat
for vôùi moãi thöïc theå [A Æ α • Bβ, a] trong , vôùi moãi
luaät sinh B Æ η trong G’ vaø vôùi moãi kyù hieäu keát
thuùc b thuoäc first sao cho thöïc theå [B Æ • η, b]
khoâng coù trong | do
theâm thöïc theå [B Æ η, b] vaøo |
until khoâng theå theâm thöïc theå môùi vaøo |;
closure := |;
end;
function goto (| :items; X: symbol): items;
begin
j laø taäp caùc thöïc theå coù daïng [A Æ αX• β, a] sao cho
thöïc theå [A Æ α• Xβ, a] ôû trong | ; goto := closure (J);
end;
procedure items (G’);
begin
d := {closure ({S’ Æ• S, $}}};
repeat
for vôùi moãi taäp thöïc theå | ôû trong C vaø vôùi moãi kyù
hieäu vaên phaïm X sao cho goto (|, X) khoâng roãng vaø
chöa coù trong C do theâm goto (|, 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

y.tab.c Trình bieân dòch C a.out

chuoãi token a.out daãn xuaát

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;
}

Phaàn ñaëc taû


Phaàn caùc luaät bieân dòch:
<veá traùi luaät sinh> Æ <veá phaûi thöù nhaát> |… | <veá phaûi thöù n>
Luaät bieân dòch trong Yacc:
<veá traùi LS> : <veá phaûi 1> {haønh vi ngöõ nghóa 1}
: <veá phaûi 2> {haønh vi ngöõ nghóa 2}

: <veá phaûi n> {haønh vi ngöõ nghóa n}
Phaàn caùc chöông trình con C phuï trôï
CHÖÔNG 5
BIEÂN DÒCH TRÖÏC TIEÁP CUÙ PHAÙP

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.

Chuoãi nhaäp → caây phaân tích → ñoà thò phuï thuoäc →


→ ñaùnh giaù thöù töï caùc luaät ngöõ nghóa.

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.

Daïng cuûa ñònh nghóa tröïc tieáp cuù phaùp


Moãi luaät sinh coù daïng A → α ñeàu coù moät taäp luaät ngöõ nghóa coù daïng
b:= f (c1, c2, …, ck) vôùi f laø haøm soá vaø:
1. b laø thuoäc tính toång hôïp cuûa A vaø c1, c2, …, ck laø caùc thuoäc tính
cuûa kyù hieäu vaên phaïm cuûa luaät sinh, hoaëc
2. b laø thuoäc tính keá thöøa cuûa moät trong caùc kyù hieäu vaên phaïm beân veá
phaûi cuûa luaät sinh vaø c1, c2, …, ck laø caùc thuoäc tính cuûa caùc kyù hieäu vaên
phaïm cuûa luaät sinh.
Thí duï 5.1. Ñònh nghóa tröïc tieáp cuù phaùp ôû baûng 5.1.
Baûng 5.1. Ñònh nghóa tröïc tieáp cuù phaùp cho baûng tính ñôn giaûn

Luaät sinh Luaät ngöõ nghóa


L → En Print (E.val)
E → E1 + T E.val: = E1.val + T.val
E → TE.val: = T.val E.val: = T.val
T → T1* F T.val: = T.val x F.val
T → FT.val: = F.val T.val: = F.val
F → (E) F.val: = E.val
F → digit F.val: = digit . lexval

Thuoäc tính toång hôïp


Ñònh nghóa tröïc tieáp cuù phaùp duøng caùc thuoäc tính toång hôïp goïi laø ñònh
nghóa thuoäc tính S. Thuoäc tính S cuûa moät nuùt coù theå ñöôïc töø caùc thuoäc
tính ôû moãi nuùt töø döôùi leân.
Thí duï 5.2. Ñònh nghóa thuoäc tính S ôû thí duï 5.1
L

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.

Luaät sinh Luaät ngöõ nghóa


D → TL L.in: = T.type
T → int T.type: = integer
T → real T.type: = real
L → L1, id L1.in: = L.in
L → id Addtype (id.entry, L.in)
Hình 5.2 laø caây phaân tích chuù thích cho caâu real id1, id2, id3.

L.in = real
T.type = real

L.in = real , id3

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:

for vôùi moãi nuùt n treân caây phaân tích do


for vôùi moãi thuoäc tính a cuûa kyù hieäu vaên phaïm taïi nuùt n do
- xaây döïng nuùt treân ñoà thò phuï thuoäc cho a;
for vôùi moãi nuùt n treân caây phaân tích do
for vôùi moãi luaät ngöõ nghóa b:= f (c1, c2, …, ck) töông öùng vôùi
luaät sinh ñöôïc duøng taïi nuùt n
for i := 1 to k do
xaây döïng caïnh ñi töø nuùt cuûa c1 ñeán nuùt b.
Thí duï 5.4. Khi ta duøng luaät sinh E → E1 + E2 treân caây phaân tích,
chuùng ta theâm caùc caïnh sau vaøo (H.5.3) chuùng ta seõ ñöôïc ñoà thò phuï
thuoäc.

Luaät sinh Luaät ngöõ nghóa


E → E1 + E2 E.val := E1.val + E2.val

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

chæ ñeán vò trí cuûa c


id Num 4

chæ ñeán vò trí cuûa a


Hình 5.5. Caây cuù phaùp cho bieåu thöùc a – 4 + c
Ñònh nghóa tröïc tieáp cuù phaùp vaø caáu truùc caây cuù phaùp
Thí duï ôû baûng 5.3 laø ñònh nghóa thuoäc tính S duøng ñeå xaây döïng caây cuù
phaùp cho bieåu thöùc soá hoïc coäng (+) vaø tröø (-).
Baûng 5.3. Ñònh nghóa tröïc tieáp cuù phaùp cho caáu truùc caây cuù phaùp cuûa
bieåu thöùc

Luaät sinh Caùc luaät ngöõ nghóa


E → E1 + T E. nptr: = mknode(‘+’, E1 .nptr, T. nptr)

E → E1 – T E. nptr: = mknode(‘-‘, E1 .nptr, T.nptr)

E→T E. nptr: = T. nptr

T → (E) T. nptr: = E. nptr

T → id T. nptr: = mkleaf(id, id, entry)

T → num T. nptr: = mkleaf(num, num, val)


Thí duï 5.8. Caây phaân tích chuù thích duøng ñeå mieâu taû caây cuù phaùp cho
bieåu thöùc a - 4 + c ñöôïc trình baøy ôû (H.5.6).
E
E nptr nptr
E T nntr
T+
− nptr
nptr
T num +
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

Hình 5.7. Dag cho bieåu thöùc a + a * (b – c) + (b – c) * d.


Baûng 5.4. Caùc leänh ñeå taïo DAG ôû (H.5.7)

Haøng Leänh Haøng Leänh


1 p1 := mkleaf(id, a) 8 p8 := mkleaf(id, b)
2 p2 := mkleaf(id, a) 9 p9 := mkleaf(id, c)
3 p3 := mkleaf(id, b) 10 p10 := mknode(’ −‘, p8, p5)
4 p4 := mkleaf(id, c) 11 p11 := mkleaf(id, d)
5 p5 := mknode(‘−‘, p3, p4) 12 p12 := mknode(‘*’, p10, p11)
6 p6 := mknode(‘*’, p2, p5) 13 p13 := mknode(‘+’, p7, p12)
7 p7 := mknode(‘+’, p1, p6)
Maãu tin töôïng tröng cho nuùt ñöôïc löu chöùa trong daõy nhö ôû (H.5.8).
Pheùp gaùn Dag
i := i + 10
Bieåu dieãn caáu truùc döõ lieäu
:=
1 id Chæ ñeán danh bieåu i
2 num 10
+ 3 + 1 2
4 := 1 3
i
10 5 ……………………………………....

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

Luaät sinh Ñoaïn maõ


L → En Print (val [top])
E → E1 + T val [ntop]: = val [top - 2] + val [top]
E→T
T → T1 * F val [ntop]: = val [top - 2] x val [top]
T→F
F → (E) val [ntop]: = val [top - 1]
F → digit
Baûng 5.7. Quaù trình bieân dòch cho chuoãi nhaäp 3 * 5 + 4n.
Chuoãi nhaäp Traïng thaùi Trò val Luaät aùp duïng
3 * 5 + 4n − −
* 5 + 4n 3 3
* 5 + 4n F 3 F Æ digit
* 5 + 4n T 3 TÆF
5 + 4n T* 3−
+ 4n T*5 3−5
+ 4n T*F 3–5 F Æ digit
+ 4n T 15 TÆT*F
+ 4n E 15 EÆT
4n E+ 15 −
n E+4 15 – 4
n E+F 15 – 4 F Æ digit
n E+T 15 – 4 TÆF
n E 19 EÆE+T
En 19
L 19 L Æ En
5.4. Ñònh nghóa thuoäc tính L
Moâ phoûng 5.1. Thöù töï ñaùnh giaù depth – first cho caùc thuoäc tính treân
caây phaân tích
procedure dfvisit (n: node);
begin
for vôùi moãi nuùt m laø con cuûa nuùt n, töø traùi sang phaûi do
begin
ñaùnh giaù thuoäc tính keá thöøa cuûa m
dfvisit (m)
end
ñaùnh giaù thuoäc tính toång hôïp cuûa n
end;

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.

Luaät sinh Luaät ngöõ nghóa


A → LM L.i : = l (A.i)
M.i := m (L.s)
A.s : = f (M.s)
A → QR R.i : = r (A.i)
Q.i : = q (R.s)
A.s : = f (Q.s)
Löôïc ñoà dòch
Moâ phoûng 5.2. Löôïc ñoà dòch ñôn giaûn cho bieåu thöùc soá hoïc

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.

5.5. Bieân dòch töø treân xuoáng


Loaïi boû ñeä quy traùi cho löôïc ñoà dòch
Moâ phoûng 5.3. Löôïc ñoà dòch vôùi vaên phaïm coù ñeä quy traùi.

E → E1 + T {E.val := E1.val + T. val⏐}


E → E1 – T {E.val := E1.val - T. val⏐}
E→T {E.val := T. val⏐}
T→E {T.val := E. val⏐}
T → num {T.val := num. val⏐}
E

R.i = 9
T.val = 9


T.val = 5 R.i = 4

num. val = 9

num. val = + T.val = 5


5

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.

E→T {Rj := T.nptr}


R {E.nptr := R.s}
R→+
T {R1j := mknode (‘+’, Rj.T.nptr)}
R1 {R.s := R1.s}
R→−
T {R1j := mknode (‘-’, Rj.T.nptr)}
R1 {R.s := R1.s}
R→∈ {R.s := Rj}
T→(
E
) {T.nptr := E.nptr}
T → id {T.nptr := mkleaf (id.id.entry)}
T → num {T.nptr := mkleaf (num.num.val)}
Hình 5.12. bieåu dieãn toaøn boä caùc haønh vi trong moâ phoûng 5.5. cho caáu
truùc caây cuù phaùp cuûa caâu a – 4 + c.
Thieát keá boä dòch ñoaùn nhaän tröôùc
E
R R
T•nptr i R s
− nptr i
T•nptr = •
+

id num id +

− 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;

Keát hôïp hai luaät sinh R ôû moâ phoûng 5.5.


R → addop
T {R1.i :=mknode (addop.lexeme, R.i, T.nptr)}
R1 {R.s := R1.s}
R → ∈ {R.s := R.i}
Moâ phoûng 5.6. Thuû tuïc phaân tích cuù phaùp cho caùc luaät sinh
R: R → addop TR |∈
Procedur R:
begin
if lookahead = addop then begin
match (addop): T; R;
end
else begin /*khoâng laøm gì caû*/
end

Moâ phoûng 5.7. Caây cuù phaùp ñeä quy ñi xuoáng


function R (i: ↑ nuùt caây cuù phaùp): ↑ nuùt caây cuù phaùp;
var nptr. ll, sl, s: ↑ nuùt caây cuù phaùp;
addoplexeme: char;
begin if lookahead = addop then begin
/* luaät sinh R → addop TR*/
addoplexeme := lexval;
match (addop);
il := mknode (addoplexeme, i, nptr);
sl := R (il);
s := sl;
end
else s := i; /* luaät sinh R → ∈ */
return s
end;

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
,

Hình 5.13. Taïi moãi nuùt L coù L.in := T.type.


Baûng 5.9. Baát cöù luùc naøo veá phaûi cuûa L ñöôïc thu giaûm thì T luoân ôû
treân veá phaûi ñoù.

Nhaäp Traïng thaùi Luaät ñöôïc aùp duïng


Real p, q, r -
p, q, r real
p, q, r T T → real
, q, r Tp
, q, r TL L → id
, q, r TL,
,r TL, q
,r TL L → L, id
r TL,
TL, r
TL L → L, id
D D → TL
Baûng 5.10. Giaù trò cuûa T.type ñöôïc duøng ôû vò trí L.in.

Luaät sinh Ñoaïn maõ


D Æ TL
T Æ int val [ntop] := integer
T Æ real val [ntop] := real
L Æ L, id addtype (val[top], val[top – 3])
L Æ id addtype (val[top], val[top – 1])

Ñaùnh giaù caùc thuoäc tính keá thöøa


Thí duï 5.16. Ñaây laø ví duï veà tröôøng hôïp khoâng theå ñoaùn nhaän tröôùc
vò trí cuûa thuoäc tính trong löôïc ñoà dòch.
Luaät sinh Luaät ngöõ nghóa
S Æ aAC C.i:= A.s (5.4)
S Æ aABC C.i := A.s
CÆc C.i := g (C.i)
Luaät sinh Luaät ngöõ nghóa
S Æ aAC C.i := A.s
S Æ bABMC M.i := A.s ; C.i := M.s
CÆc C.i := g(C.i)
MÆ∈ M.S := M.i

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:

Luaät sinh Luaät ngöõ nghóa


S Æ aAC C.i := f(A.s) (5.5)

Luaät sinh Luaät ngöõ nghóa


S Æ aANC N.i := A.s ; C.i := N.s
NÆ∈ N.s := f(N.i) (5.6)

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.1. Truyeàn thuoäc tính


1. Maõ trung gian
Maõ trung gian coù nhieàu loaïi: maõ cambridge, maõ Balan ngöôïc, maõ boä
tam (triple code), maõ boä töù (quadruple code).
Boä töù cho bieåu thöùc soá hoïc
Daïng toång quaùt: <toaùn töû> (<taùc toá 1>, <taùc toá 2>, <keát quaû>)
Moät caùch bieåu thò bieán taïm ôû baûng danh bieåu:
Teân:roãng
Loaïi: 4
Kieåu döõ lieäu: tuøy theo kieåu cuûa caùc toaùn haïng tham gia pheùp
toaùn.
Ñòa chæ : ñòa chæ töông ñoái. Ñòa chæ naøy ñöôïc gaùn khi sinh maõ.
Moät soá maõ boä töù cho caùc pheùp toaùn hoïc
JMP (i, 0, 0) nhaûy ñeán boä töù coù chæ soá i
JPG (i, p1, p2) nhaûy ñeán boä töù i neáu toaùn haïng thöù nhaát
lôùn hôn toaùn haïng hai
as1 (p1, p2, 0) gaùn trò p1 cho p2. p2 laø bieán ñôn
FLT (p1, p2, 0) Ñoåi trò cuûa p1 thaønh soá thöïc, gaùn sang p2
FIX (p1, p2, 0) Ñoåi trò cuûa p1 thaønh soá nguyeân, gaùn sang p2

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>

id1 := id2 * ( id3 + id4 )

Hình 6.2. Caây cuù phaùp A := X * (R + Q).


Baûng danh bieåu
Token Trò töø vöïng Kieåu döõ lieäu
1 id A thöïc
2 id X thöïc
3 id R thöïc
4 id Q thöïc

- Truyeàn thuoäc tính


- Sinh ra bieán taïm khi thu giaûm

2. Phöông phaùp thöïc hieän söï truyeàn thuoäc tính


Ñeå thöïc hieän xöû lyù ngöõ nghóa trong quaù trình phaân tích cuù phaùp, chuùng
ta seõ duøng moät stack ñaëc bieät goàm caùc phaàn:
A: kyù hieäu vaên phaïm (töôïng tröng cho moät danh hieäu)
B: coù trò 0 hoaëc 1 (kyù hieäu 1 laø bieán taïm)
C: con troû chæ ñeán baûng danh bieåu (thöïc chaát laø vò trí cuûa danh
bieåu ôû trong baûng danh bieåu
Thí duï 6.2. Cho vaên phaïm G nhö ôû thí duï 6.1.
<asign stmt> → id := <expr>
<expr> → <expr> + <term> | <term>
<term> → <expr> * <factor> | <factor>
<factor> → id | (<expr>)

3. Nguyeân taéc xöû lyù ngöõ nghóa


Khi coù moät chuoãi con x = x1x2…xn saép ñöôïc thu giaûm veà KHKKT U
(vôùi luaät sinh U Æ x1, x2 …xn) thì haønh vi xöû lyù ngöõ nghóa taïi nuùt V laø
haøm cuûa:
1) Luaät sinh U Æ x1x2…xn
2) Caùc xöû lyù ngöõ nghóa cuûa caùc nuùt xi, töùc laø caùc nuùt con cuûa V coù theå
laø:
i) Tra cöùu baûng danh bieåu
ii) Taïo ra bieán taïm
iii) Sinh maõ trung gian
iv) Truyeàn thuoäc tính töø x veà V
6.3. Kieåm tra kieåu döõ lieäu
1. Heä thoáng kieåu
Ñònh nghóa bieåu thöùc kieåu
1. Kieåu döõ lieäu cô baûn
2. Khi bieåu thöùc kieåu ñöôïc ñaët teân
3. Boä kieán thieát kieåu bao goàm:
1) Daõy (array): array (I, T).
2) Tích soá (product): tích soá cartesian T1 x T2.
3) Baûn ghi (record): kieåu cuûa baûn ghi laø tích soá cuûa bieåu thöùc
kieåu caùc thaønh phaàn cuûa noù.
Thí duï:
type row = record
address : integer;
lexeme : array [1..15] of char;
end;
var table : array [1..10] of row;
Kieåu row ñöôïc bieåu dieãn baèng bieåu thöùc kieåu:
record ((address x integer) x (lexeme x array (1...15, char))).
4) Con troû (pointer): pointer (T).
5) Haøm (function): D Æ R.
Thí duï: trong Pascal coù khai baùo:
function f (a, b : char) : ↑ integer;
Bieåu thöùc kieåu cuûa f laø:
char x char Æ pointer (integer)
4. Bieåu thöùc kieåu chöùa caùc bieán maø trò cuûa chuùng laø bieåu thöùc kieåu.
Ñeå bieåu dieãn bieåu thöùc kieåu ta duøng ñoà thò. (H.6.4) laø caây vaø dag,
bieåu thò cho bieåu thöùc kieåu char x char Æ pointer (integer).
Heä thoáng kieåu

x pointer x pointer

char char interger char


interger

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}

Kieåm tra kieåu döõ lieäu cho caùc phaùt bieåu


Moät chöông trình bao goàm caùc khai baùo, sau ñoù laø caùc phaùt bieåu, ñieàu
naøy ñöôïc bieåu thò baèng luaät sinh P Æ D; S.
Moâ phoûng 6.2. Sô ñoà bieân dòch cho kieåu döõ lieäu cuûa caùc phaùt bieåu
P → D; S
S → id := E {S.type := if id. type = E. type then void
else type - error}
S → if E then S1 {S.type := if E. type = boolean then
S1. type else type - error}
S → while E do S1 {S.type := if E. type = boolean then
S1. type else type - error}
S → S1; S2 {S.type := if (S1. type = void) and
(S2. Type = void) then void
else type - error}

Kieåm tra kieåu cuûa haøm


E Æ E (E)
Ñeå dieãn taû kieåu cho bieåu thöùc kieåu ta duøng kyù hieäu T vaø theâm luaät
sinh
T Æ T1’ Æ ‘ T2 {T. type := T1. type Æ T2. type}
Quy taéc kieåm tra kieåu cuûa haøm laø
E Æ E1 (E2) {E. type := if (E2. type = s) and
(E1. type = s Æ t) then t else
{type - error}
T1 x T2 x .. x Tn
Thí duï: root Æ (real Æ real) x real Æ real
Chuùng ta seõ hieåu laø coù khai baùo:
function root (functionf (real) : real; x : real) : real

3. Söï töông ñöông cuûa bieåu thöùc kieåu


• Söï töông ñöông caáu truùc cuûa bieåu thöùc kieåu
• Giaûi thuaät kieåm tra töông ñöông caáu truùc cuûa caùc bieåu thöùc kieåu
Moâ phoûng 6.3. Kieåm tra töông ñöông caáu truùc cuûa hai bieåu thöùc
kieåu s vaø t.
function sequiv (s, t): boolean;
begin
if s vaø t cuøng moät kieåu cô baûn then true
else if s = array (s1, s2) and t = array (t1, t2) then
return sequiv (s1, s2) and sequiv (s2, t2)
else if s = s1 x s2 and t = t1 x t2 then
return sequiv (s1, t1) and sequiv (s2, t2)
else if s = pointer (s1) and t = pointer (t1) then
return sequiv (s1, t1)
else if s = s1→ s2 and t = t1→ t2 then
return sequiv (s1, t1) and sequiv (s2, t2)
else return false;
end;

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

- Teân cho bieåu thöùc kieåu


Sau ñaây laø moät ñoaïn khai baùo kieåu trong Pascal:
type link = ↑ cell;
var next : link;
last : link;
p : ↑ cell;
q, r : ↑ cell;
Thí duï 6.4.

Bieán Bieåu thöùc kieåu


next link
last link
p pointer (cell)
q pointer (cell)
r pointer (cell)
Hình 6.11. Bieán vaø caùc bieåu thöùc kieåu töông öùng

6.4. Chuyeån ñoåi kieåu


Thí duï kyù hieäu haäu toá cuûa bieåu thöùc a + i sau khi thöïc hieän haønh vi
chuyeån ñoåi kieåu:
a i intereal real +

- AÙp ñaët toaùn töû (Coercion)


Thí duï 6.5.
Moâ phoûng 6.6. Quy taéc kieåm tra kieåu cho vieäc aùp ñaët toaùn töû ñeå ñoåi trò
toaùn haïng töø soá nguyeân sang soá thöïc.
Luaät sinh Luaät ngöõ nghóa
E → num E. type := integer
E → num. num E. type := real
E → id E. type := lookup (id. entry)
E → E1 op E2 E. type := if (E1. type = integer) and
(E2. type = integer) then integer
else if (E1. type = integer) and (E2. type = real)
then real
else if (E1. type = real) and (E2. type = integer)
then real
else if (E1. type = real) and (E2. type = real)
then real
else type - error
Löu yù:
for | := 1 to N do x [i] := 1 (1)
for | := 1 to N do x [i] := 1.0 (2)

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

Teân p/b Ñòa chæ Ñònh nghóa


L 90 0

Baûng 6.3. Ñieàn chæ soá cuûa teân L vaøo caùc leänh nhaûy

Teân p/b Ñòa chæ Ñònh nghóa


L 120 1

(10) JMP (120,0,0)


(50) JMP (120,0,0)
(90) JMP (120,0,0)
CHÖÔNG 7
QUAÛN LYÙ BOÄ NHÔÙ TRONG THÔØI GIAN THÖÏC THI

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)

p(2,3) q(2,1) q(3,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.

• Söï raøng buoäc cuûa teân


Moâi tröôøng laø teân cuûa haøm, aùnh xaï teân ñeán vò trí nhôù vaø traïng thaùi laø
haøm aùnh xaï töø vò trí nhôù ñeán trò maø noù löu giöõ.

teân vò trí nhôù trò

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

Khaùi nieäm tónh Baûn sao ñoäng


Ñònh nghóa chöông trình con Söï hoaït ñoäng cuûa chöông trình con
Khai baùo teân Söï raøng buoäc teân vôùi vò trí nhôù
Taàm vöïc yù nghóa cuûa khai baùo Thôøi gian soáng cuûa söï raøng buoäc teân

7.3. Toå chöùc kyù öùc


Söï phaân chia boä nhôù trong thôøi gian thöïc thi
Trong thôøi gian dòch, trình bieân dòch ñaõ tính toaùn kích thöôùc boä nhôù
daønh cho chöông trình ñoái töôïng, noù bao goàm:
1. Maõ cuûa chöông trình ñoái töôïng.
2. Caùc ñoái töôïng döõ lieäu.
3. Moät phaàn trong stack ñieàu khieån (stack trung taâm) löu giöõ baûn ghi
hoaït ñoäng cuûa chöông trình con.
Moâ phoûng 7.2. Söï phaân chia boä nhôù trong thôøi gian thöïc thi cho vuøng
maõ cuûa chöông trình vaø vuøng döõ lieäu.
Maõ cuûa chöông trình ñoái töôïng
Döõ lieäu tónh
Stack ñieàu khieån

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

Giaù trò khöù hoài


Thoâng soá thöïc
Ñöôøng lieân keát ñoäng
Ñöôøng lieân keát tónh
Caùc traïng thaùi maùy
Döõ lieäu cuïc boä
Vuøng nhôù taïm

7.4. Chieán thuaät caáp phaùt boä nhôù


1. Caáp phaùt tónh
2. Quaûn trò boä nhôù theo cô cheá stack
3. Cô cheá heap
1. Caáp phaùt tónh (Static allocation)
Cô cheá naøy seõ daãn ñeán moät soá haïn cheá sau ñaây:
1) Kích thöôùc vaø vò trí cuûa ñoái töôïng döõ lieäu phaûi ñöôïc xaùc
ñònh ngay trong thôøi gian bieân dòch.
2) Khoâng cho pheùp goïi ñeä quy.
3) Khoâng cho pheùp caáp phaùt ñoäng caùc ñoái töôïng döõ lieäu.
Moâ phoûng 7.4. Chöông trình trong ngoân ngöõ Fortran.
(1) PROGRAM CNSUME
(2) CHARACTER * 50 BUF
(3) INTEGER NEXT
(4) CHARACTER C, PRDUCE
(5) DATA NEXT /1/, BUF /’’/
(6) C = PRDUCE ()
(7) BUF (NEXT: NEXT) = C
(8) NEXT = NEXT + 1
(9) IF (C. NE. ‘’) GOTO 6
(10) WRITE (*, ‘(A)’) BUF
(11) END
(12) CHARACTER FUNCTION PRDUCE ()
(13) CHARACTER * 80 BUFFER
(14) INTEGER NEXT
(15) SAVE BUFFER, NEXT
(16) DATA NEXT /81/
(17) IF (NEXT. GT. 80) THEN
(18) READ (*, ‘’(A)’’) BUFFER
(19) NEXT = 1
(20) END IF
(21) PRDUCE = BUFFER (NEXT: NEXT)
(22) NEXT = NEXT + 1
(23) END
Maõ cho CNSUME maõ cuûa chöông trình
Maõ cho PRDUCE

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

PRDUCE PRDUCE PRDUCE PRDUCE PRDUCE PRDUCE


h e l l o

Hình 7.5. Caùc kyù hieäu ñöôïc traû veà qua caùc laàn hoaït ñoäng cuûa PRDUCE

2. Caáp phaùt theo cô cheá stack


caây hoaït ñoäng stack ñieàu khieån

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.

Döõ lieäu coù kích thöôùc thay ñoåi


ÔÛ moät soá ngoân ngöõ nhö C, Algol, daõy ñöôïc pheùp coù kích thöôùc thay
ñoåi trong thôøi gian thöïc thi.

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

Ln Un dn Vuøng p seõ chöùc ñòa chæ baét


ñaàu cuûa vò trí nhôù daõy A
n

Hình 7.8. Vuøng thoâng tin cuûa daõy trong baûn ghi hoaït ñoäng

Thí duï 7.5. DIMENSION p[1: n, x: y], q[1: m];


Thoâng soá vaø trò trôû veà Baûn ghi hoaït ñoäng cuûa
Lieân keát vaø caùc traïng thaùi maùy chöông trình goïi chöông
Bieán taïm vaø bieán cuïc boä trình con A
Thoâng soá vaø trò trôû veà
Lieân keát vaø caùc traïng thaùi maùy
Bieán taïm vaø bieán cuïc boä Phaàn tónh
cuûa baûn
Vuøng bieán 1 n d1
ghi hoaït
taïm vaø caùc x y d2 Baûn ghi hoaït
ñoäng cuûa
bieán cuïc boä ñoäng cuûa
2 chöông
cuûa baûn ghi chöông trình
1 m d1 trình con A
hoaït ñoäng con A
cuûa A 1
p Phaàn bieán
q thieân cuûa A

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)

ñoái töôïng döõ lieäu bò loaïi boû


Hình 7.10. Tham chieáu treo q xuaát hieän do leänh dispose (p).
3. Caáp phaùt theo cô cheá heap
1. Trò cuûa caùc bieán cuïc boä ñöôïc löu giöõ ngay caû khi söï hoaït ñoäng cuûa
chöông trình con töông öùng khoâng coøn nöõa.
2. Söï hoaït ñoäng cuûa chöông trình bò goïi soáng sau caû chöông trình goïi.
Baûng 7.2. Caùc baûn ghi hoaït ñoäng cuûa heap vaø stack cuøng söï so saùnh
vôùi caây hoaït ñoäng.

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

ñaàu danh saùch


b)

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

kích thöôùc khoái


soá löôïng con troû tham khaûo tôùi
ñaùnh daáu
caùc con troû chæ ñeán caùc khoái
thoâng tin cuûa ngöôøi söû duïng

1. Ñeám caùc tham khaûo

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

2. Kyõ thuaät ñaùnh daáu


7.5. Truy xuaát bieán khoâng cuïc boä
Moâ phoûng 7.7. Chöông trình duøng ñeå minh hoïa vieäc truy xuaát bieán
khoâng cuïc boä.

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.

Caáu truùc khoái


Quaûn trò boä nhôù vaø vieäc caáp phaùt vò trí nhôù cho caùc khoái cuûa Algol
Moãi baûn ghi hoaït ñoäng goàm caùc thaønh phaàn chính sau ñaây:
1. Daõy display cuûa chöông trình con. Neáu chöông trình ôû caáp i thì
display chieám i + 1 oâ nhôù.
2. Vò trí nhôù chöùa trò stack top cuûa chöông trình con.
3. Caùc thoâng tin veà ñòa chæ khöù hoài, lieân keát tónh vaø lieân keát ñoäng,
stack_top cuûa chöông trình con goïi.
4. Caùc vò trí nhôù daønh cho caùc thoâng soá cuûa chöông trình con. Caùc
phaàn 1, 2, 3, 4 taïo thaønh phaàn cô baûn cuûa chöông trình con.
5. Moãi chöông trình con coù theå coù nhieàu khoái, moãi khoái ñöôïc caáp phaùt
moät khoaûng kyù öùc ñeå chöùa caùc thaønh phaàn sau:
1) Vò trí nhôù chöùa trò stack top cuûa khoái.
2) Vò trí nhôù daønh cho caùc bieán cuïc boä laø bieán ñôn.
3) Caùc thoâng tin veà daõy (neáu khoái coù khai baùo daõy).
4) Vò trí nhôù chöùa caùc bieán taïm.
Thí duï 7.9. Cho chöông trình con trong Algol.

procedure A (x, y);


integer x, y;
L1: begin real z; array B [x: y]; B1
L2: begin real: D, E;
….. B2
…..
end;
L3: begin array a[a: x];
L4: begin real E; B3
…….. B4
….
end;
end;
end;
………………… B
Phaàn cô baûn cuûa A Display cuûa A
Stack-top cuûa A
Phaàn coá
Caùc thoâng soá RA, SL, DL ñònh cuûa
Thoâng soá X, Y chöông
Trò stack-top cuûa B1 trình con
Vò trí nhôù cuûa khoái B1 A
Z
Vuøng thoâng tin cuûa daõy B
Stack-top cuûa B3
Stack-top cuûa B2
Vuøng thoâng tin cuûa
daõy a d, E
Stack-top cuûa B4
E
B
a
Hình 7.16. Baûn ghi hoaït ñoäng cuûa chöông trình con A coù chöùa caùc khoái
Caùc haønh vi thaâm nhaäp vaøo moät khoái vaø ra khoûi khoái
- Haønh vi thaâm nhaäp vaøo moät khoái
- Haønh vi ra khoûi khoái
Taàm vöïc tónh vôùi caùc chöông trình con khoâng loàng nhau
Taàm vöïc tónh vôùi caùc chöông trình con loàng nhau
Baûng taàm vöïc (display)
Ñeå truy xuaát bieán khoâng cuïc boä, ngöôøi ta söû duïng baûng taàm vöïc. Tuy
nhieân, lieân keát tónh vaãn toàn taïi trong caùc baûn ghi hoaït ñoäng, duøng ñeå
phuïc hoài hình aûnh baûng taàm vöïc khi chöông trình con caáp i goïi chöông
trình con caáp j, vôùi i > j vaø sau khi chöông trình con caáp j hoaøn taát söï
thöïc thi.
Thí duï 7.12. Cho chöông trình sau:
Moâ phoûng 7.10. Chöông trình Pascal coù caáu truùc khoái
program M;
:
procedure P;
:
procedure Q;
begin
:P;
end;
procedure R;
begin
Q;
end;
begin;
R;
end;
begin
P;
end;
Möùc taàm vöïc cuûa caùc chöông trình con laø:
M
P
Q
R
vaø M goïi P goïi R goïi Q goïi P
Caùc böôùc thöïc thi Display Stack ñieàu khieån
1 M 0 M M

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

2 MAIN goïi SUB1

lieân keát tónh MAIN


X=3
SUB2
SUB1
lieân keát tónh
Y=1 SUB1
FUNC

3 SUB1 goïi SUB2 lieân keát tónh MAIN


X=1
SUB2
SUB1
SUB1
lieân keát tónh
Y=1
FUNC

lieân keát tónh SUB2


X
Y
F ñòa chæ phaàn maõ cuûa FUNC
z

4 SUB2 goïi FUNC lieân keát tónh MAIN


X=1
SUB2
SUB1
SUB1
lieân keát tónh
Y
FUNC
SUB2
lieân keát tónh
X
Y
F ñòa chæ phaàn maõ cuûa FUNC

Z
FUNC
lieân keát tónh
V
CHÖÔNG 8
TOÅ CHÖÙC BAÛNG DANH BIEÅU

8.1. Giôùi thieäu


Coù boán phöông phaùp truy xuaát treân baûng danh bieåu:
1. Tìm kieám tuyeán tính (linear search)
2. Tìm kieám nhò phaân (binary search)
3. Tìm kieám treân caây (tree search)
4. Maõ hoùa baêm (hash coding)

8.2. Caùc taùc vuï treân baûng danh bieåu


Baûng 8.1. Caùc taùc vuï treân baûng danh bieåu
Teân chöông trình
Caùch goïi Haønh vi thöïc thi
con
Enter Enter (id) Khi gaëp moät danh bieåu môùi ñöôïc khai
baùo, thuû tuïc naøy seõ kieåm tra xem danh
bieåu môùi ñoù coù truøng vôùi teân naøo trong
cuøng moät taàm vöïc? Neáu khoâng, thuû tuïc
enter seõ ñöa danh bieåu môùi vaøo baûng
danh bieåu. Ngöôïc laïi enter seõ thoâng baùo
loãi veà vieäc khai baùo moät danh bieåu nhieàu
laàn trong cuøng moät taàm vöïc.
loc (haøm) n := loc (id) Khi caàn truy xuaát moät danh bieåu, loc seõ
tìm treân baûng danh bieåu töø phaân töû môùi
nhaát cuûa taàm vöïc môùi nhaát ñeán phaân töû
cuõ nhaát cuûa taàm vöïc cuõ nhaát ñeå tìm vò trí
cuûa id vaø traû veà thoâng qua teân loc cuûa
haøm.
Scopeentry Scopeentry Khi trình bieân dòch ñi vaøo moät taàm vöïc
môùi, scopeentry seõ ñaùnh daáu treân Stack
(baûng danh bieåu) moät taàm vöïc môùi.
Scopeexit Scopeexit Khi trình bieân dòch ñi heát moät taàm vöïc
scopeenxit seõ thaûi hoài nhöõng teân bieán
khoâng coøn coù yù nghóa vaø taùi laäp moät taàm
vöïc ngoaøi cuøng gaàn nhaát.

8.3. Baûng danh bieåu tuyeán tính (linear symbol table)


Thí duï 8.1. Cho ñoaïn chöông trình trong ngoân ngöõ Algol.
begin real A, B;
begin real C, A;
.......
end;
end;
5 I=5
4 A B=3
3 C 3
2 B 2 3
1 A 1 1
TAB BTAB

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;

8.4. Baûng danh bieåu baêm (hash symbol table)


H
Moät danh bieåu chæ soá k
Chuùng ta laáy laïi thí duï 8.1 ñeå minh hoïa vieäc xaây döïng baûng danh bieåu
theo phöông phaùp baêm ôû (H.8.2). Giaû söû A bieán ñoåi H coù k = 3, B coù k
= 6 vaø C coù k = 5.
8 0
7 0
T= 5
6 2 5
5 3 4 A 1
B= 3
4 0 3 C 0 3
3 4 2 B 0 2 3
2 0 1 A 0 1 1
1 0 TAB BTAB
HASH
H
A k=3
H
A k=6
A H k=5 Hình 8.2. Baûng danh bieåu baêm
Caùc taùc vuï laøm vieäc treân baûng danh bieåu baêm ñöôïc trình baøy baèng caùc
chöông trình con sau:
const hashsize = …;
tabsize = …;
btabsize = …;
type tabindex = 1 .. tabsize;
hashindex = 1 .. hashsize;
iterm = record
key: id;
ptr: tabindex;
end;
var tab: array [1 .. tablim] of item
hash: array [hashindex] of tabindex;
btab: array [i .. btabsize] of tabindex;
t: tabindex; b: 1 .. Btabsize;
function H (id: alfa): hashindex;
begin

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

nil header sort


a
x
readarray baûng readarray
exchange baûng exchange
quicksort
exchange header
header k
v
header readarray partition
i
partition header
i
Muoán thöïc hieän vieäc taïo baûng danh bieåu cho chöông trình con bò goïi,
ta phaûi taïo caùc haøm nhö sau:
1. mktable (x)
2. enter (table, name, type, offset)
3. addwidth (table, width)
4. enterproc (table, name, newtable)
CHÖÔNG 9
SINH MAÕ ÑOÁI TÖÔÏNG

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

Baûng danh bieåu

Hình 9.1. Vò trí cuûa boä sinh maõ ñoái töôïng

9.1. Caùc vaán ñeà thieát keá boä sinh maõ


Ñaàu vaøo cuûa boä sinh maõ
Chöông trình ñích
Söï löïa choïn chæ thò
Giaû söû ñoái vôùi phaùt bieåu ba ñòa chæ coù daïng x := y + z vôùi x, y, z töôïng
tröng cho caùc vò trí nhôù. Chuùng ta coù theå dòch sang chuoãi maõ ñoái
töôïng:
MOV y, Ro /* caát y vaøo thanh ghi Ro */
ADD z, Ro /* coäng z vaøo noäi dung Ro, keát quaû chöùa trong Ro */
MOV Ro, x /* caát noäi dung Ro vaøo x */
Tuy nhieân vieäc sinh maõ cho chuoãi caùc phaùt bieåu seõ daãn ñeán söï dö thöøa
maõ. Nhö thí duï sau:
a := b + c; d := a + e
Chuùng ta chuyeån sang maõ ñoái töôïng:
(1) MOV b, R0
(2) ADD c. R0
(3) MOV R0, a
(4) MOV a, R0
(5) ADD e, R0
(6) MOV R0, d
Chæ thò thöù tö laø thöøa.
Chaát löôïng maõ ñöôïc taïo ra, ñöôïc xaùc ñònh baèng toác ñoä cuûa maõ vaø kích
thöôùc taäp maõ. Thí duï:
MOV a, R0
ADD # 1, R0
MOV R0, a
Caáp phaùt thanh ghi
Söï löïa choïn cho vieäc ñaùnh giaù thöù töï
9.2. Maùy ñích
Chuùng ta seõ duøng maùy ñích nhö laø maùy thanh ghi (register machine).
Maùy ñích coù moãi töø goàm boán byte vaø coù n thanh ghi: R0, R1 … Rn-1, coù
chæ thò hai ñòa chæ, vôùi daïng toång quaùt: op source, destination
Thí duï moät soá chæ thò:
MOV: chuyeån trò cuûa source ñeán destination
ADD: coäng noäi dung source vaø destination
SUB: tröø noäi dung source cho destination
Mode ñòa chæ
Thí duï:
Mode Daïng Ñòa chæ Giaù
1 Absolute M M 1
2 Register R R 0
3 indexed c (R) c + contents (R) 1
4 indirect *R contents (R) 0
register
5 inderect *c (R) contents (c + contents (R)) 1
indexed
6 literal #C haèng C 1
Giaù chæ thò (instruction cost)
Giaù chæ thò ñöôïc tính baèng moät coâng giaù keát hôïp trong baûng mode ñòa
chæ nguoàn vaø ñích ôû treân.
Qua caùc thí duï treân chuùng ta thaáy muoán sinh maõ toát thì laøm sao phaûi
haï giaù cuûa caùc chæ thò.
Sinh maõ ñeå quaûn lyù caùc baûn ghi hoaït ñoäng trong thôøi gian thöïc thi.
Caùc maõ quaûn lyù naøy phaûi ñaùp öùng ñöôïc hai kyõ thuaät quaûn lyù boä nhôù
tónh vaø caáp phaùt boä nhôù theo cô cheá stack.
Vieäc caáp phaùt vaø giaûi toûa vò trí nhôù cho baûn ghi hoaït ñoäng laø moät phaàn
trong chuoãi haønh vi goïi vaø trôû veà cuûa chöông trình con.
1. call 2. return
3. halt 4. action /* töôïng tröng cho caùc phaùt bieåu khaùc
*/
Thí duï:
/*maõ cho c*/
action 1
call p
action 2
halt 0: ñòa chæ khöù hoài 0: ñòa chæ khöù hoài
/*maõ cho p*/ 8: arr 4: buf
action 3 56 i
return 60 j 84: n
Baûng maõ Baûng ghi hoaït Baûng ghi hoaït
ñoäng cho c ñoäng cho p
Caáp phaùt tónh
Phaùt bieåu call ñöôïc hieän thöïc baèng hai maõ ñoái töôïng MOV vaø GOTO.
MOV # here + 20, callee.static - area
GOTO callee. code – rea
Thí duï 9.1.
Moâ phoûng 9.1. Maõ ñoái töôïng cho chöông trình con c vaø p
/* maõ cho c */
100: action
120: MOV 140, 364 /* caát ñòa chæ khöù hoài 140 */
132: GOTO 200 /* goïi p */
140: action2
160: halt

/* maõ cho p */
200: action3
220: GOTO * 364 /* trôû veà ñòa chæ ñöôïc caát taïi vò trí 364 */
/* 300 - 364 caát baûn ghi hoaït ñoäng cuûa c */
300: /* chöùa ñòa chæ khöù hoài */
304: /* döõ lieäu cuïc boä cuûa c */
/* 364 - 451 chöùa baûn ghi hoaït ñoäng cuûa p*/
364: /* chöùa ñòa chæ khöù hoài */
368: /* döõ lieäu cuïc boä cuûa p */

Caáp phaùt theo cô cheá stack


Maõ cho chöông trình ñaàu tieân laø maõ khôûi ñoäng stack, caát ñòa chæ baét ñaàu
stack vaøo sp baèng chæ thò MOV # stackstart, SP. Nhö vaäy maõ ñoái töôïng
cho chöông trình con ñaàu tieân bao goàm:
MOV # stackstart, SP /* khôûi ñoäng stack */
ñoaïn maõ cho chöông trình con
HALT /* keát thöùc söï thöïc thi */
ADD # caller.recordsize, SP
MOV # here + 16, * SP /* löu ñòa chæ khöù hoài */
GOTO callee.code-area
Chuoãi trôû veà goàm hai chæ thò:
GOTO *0 (SP) /* trôû veà chöông trình goïi */
SUB # callee.recordsize, SP
Chæ thò GOTO *0 (SP)
Thí duï 9.2
/* maõ cho s */ /* maõ cho q */
action1 action4
callq callp
action2 action5
halt callq
/* maõ cho p */ action6
action3 callq
return return
Hình 9.3. Maõ trung gian cuûa chöông trình ôû moâ phoûng 9.1
Moâ phoûng 9.2. Maõ ñoái töôïng cho maõ trung gian ôû (H.9.3)
/* maõ cho s */
100: MOV # 600, SP /* khôûi ñoäng stack */
108: action1
128: ADD # ssize, SP /* chuoãi goïi baét ñaàu */
136: MOV 152, * SP /* caát ñòa chæ khöù hoài */
144: GOTO 300 /* goïi q */
152: SUB # ssize, SP /* giaûm trò cuûa SP moät khoaûng ssize */
160: action2
180: HALT
/* maõ cho p */
200: action3
220: GOTO * 0(SP) /* trôû veà chöông trình goïi */
/* maõ cho q */
300: action4 /* nhaûy coù ñieàu kieän veà 456 */
320: ADD # qsize, SP
328: MOV 344, * SP /* caát ñòa chæ khöù hoài */
336: GOTO 200 /* goïi P */
344: SUB # qsize, SP
352: action5
372: ADD # qsize, SP
380: MOV 396, * SP /* caát ñòa chæ khöù hoài */
388: GOTO 300 /* goïi q */
396: SUB # qsize, SP
304: action6
424: ADD # qsize, SP
432: MOV 440, * SP /* caát ñòa chæ khöù hoài */
440: GOTO 300 /* goïi q */
448: SUB # qsize, SP
456: GOTO *0 (SP) /* trôû veà chöông trình goïi */

600: /* ñòa chæ baét ñaàu cuûa stack trung taâm */
Xaùc ñònh ñòa chæ cho teân danh bieåu trong thôøi gian thöïc thi
Neáu chuùng ta duøng cô cheá caáp phaùt tónh, vuøng döõ lieäu ñöôïc caáp phaùt
taïi ñòa chæ static, coù phaùt bieåu x := 0. Ñòa chæ töông ñoái cuûa x laø 12.
Vaäy ñòa chæ cuûa x trong boä nhôù laø static + 12. Neáu static laø 100. Ñòa
chæ cuûa x trong boä nhôù laø 112. Phaùt bieåu x := 0 ñöôïc dòch sang maõ ñoái
töôïng vôùi ñòa chæ tuyeät ñoái laø: MOV # 0, 112.
Giaû söû x laø bieán cuïc boä cuûa chöông trình con hieän haønh, thanh ghi R3
löu giöõ ñòa chæ baét ñaàu cuûa baûn ghi hoaït ñoäng thì chuùng ta seõ dòch phaùt
bieåu x := 0 sang maõ trung gian.
t1 := 12 + R3
* t1 := 0
Chuyeån sang maõ ñoái töôïng:
MOV # 0, 12 (R3)
Giaù trò trong R3 chæ coù theå ñöôïc xaùc ñònh trong thôøi gian thöïc thi.
9.3. Khoái cô baûn vaø löu ñoà
Khoái cô baûn (basic block)
t1 := a * a;
t2 := a * b;
t3 := 2 * t2
t4 := t1 + t2
t5 := b * b;
t6 := t4 + t5
Giaûi thuaät 9.1. Phaân chia caùc khoái cô baûn
Nhaäp: caùc phaùt bieåu ba ñòa chæ
Xuaát: danh saùch caùc khoái cô baûn vôùi töøng chuoãi caùc phaùt bieåu ba ñòa
chæ cho töøng khoái.
Phöông phaùp:
1. Xaùc ñònh taäp caùc phaùt bieåu daãn ñaàu cuûa caùc khoái chuùng ta duøng caùc
quy taéc sau ñaây:
i) Phaùt bieåu ñaàu tieân laø phaùt bieåu daãn ñaàu (leader) (töø ñaây ta seõ
duøng töø leader thay cho cuïm töø tieáng Vieät phaùt bieåu daãn ñaàu).
ii) Baát kyø phaùt bieåu naøo laø ñích nhaûy ñeán cuûa phaùt bieåu GOTO
coù ñieàu kieän hoaëc khoâng ñieàu kieän ñeàu laø leader.
iii) Baát kyø phaùt bieåu naøo ñi ngay sau phaùt bieåu goto hoaëc khoâng
ñieàu kieän coù ñieàu kieän ñeàu laø leader.
2. Vôùi moãi leader thì khoái cô baûn goàm coù noù vaø taát caû caùc phaùt bieåu
nhöng khoâng bao goàm moät leader naøo khaùc hay laø leänh keát thuùc
chöông trình.
Thí duï 9.3.
Moâ phoûng 9.3. Chöông trình tích tích vectô voâ höôùng
begin
prod := 0
i := 1
repeat
prod := prod + a[1] * b[1];
i := i + 1
until i > 20
end
Moâ phoûng 9.4. Maõ trung gian ñeå tính tích vectô voâ höôùng

(1) prod :=0


(2) i := 1
(3) t1 := 4 * i
(4) t2 := a[t1] /* tính a[i]
(5) t3 := 4 * I
(6) t4 := b[t3]
(7) t5 := t2 * t4
(8) t6 := prod + t5
(9) prod := t6
(10) t7 := i + 1
(11) i := t7
(12) if i <= 20 goto (3)

Söï luaân chuyeån treân caùc khoái


Löu chuyeån baûo toàn caáu truùc
1. Loaïi boû caùc bieåu thöùc con chung.
Thí duï: a := b + c; b := a – d; c := b + c; d := a – d
Nhö vaäy ta chuyeån boán phaùt bieåu treân thaønh:
a := b + c; b := a – d; c := b + c; d := b
2. Loaïi boû maõ cheát
Giaû söû x laø cheát, neáu xuaát hieän phaùt bieåu x := y + z trong khoái cô baûn
thì seõ bò loaïi maø khoâng laøm thay ñoåi giaù trò cuûa khoái.
3. Ñaët teân laïi bieán taïm
t := b + c vôùi t laø bieán taïm.
u := b + c maø u laø bieán taïm môùi ta cuõng phaûi thay t baèng u ôû baát
cöù choã naøo xuaát hieän t.
4. Hoaùn ñoåi phaùt bieåu
t1 := b + c
t2 := x + y
Coù theå hoaùn ñoåi thöù töï hai phaùt bieåu neáu x vaø y ñeàu khoâng phaûi t1
ñoàng thôøi b vaø c ñeàu khoâng phaûi laø t2.
Chuyeån ñoåi ñaïi soá
x := x + 0 hoaëc x := x * 1, x := y ** 2, x := y * y
Löu ñoà (flow graph)
Ñoà thò tröïc tieáp ñöôïc goïi laø löu ñoà. Caùc nuùt cuûa löu ñoà laø khoái cô baûn.
Moät nuùt ñöôïc goïi laø khoái ñieåm, neáu noù coù chöùa phaùt bieåu ñaàu tieân cuûa
chöông trình.
prod := 0
i := 1 B1

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.

Giaûi thuaät sinh maõ ñoái töôïng


Nhaän vaøo chuoãi maõ trung gian ba ñòa chæ cuûa moät khoái cô baûn. Vôùi
moãi phaùt bieåu ba ñòa chæ coù daïng x := y op z chuùng ta thöïc thi caùc
böôùc sau:
1. Goïi haøm getreg ñeå xaùc ñònh L.
2. Xaùc ñònh ñòa chæ ñaëc taû cho y.
3. Taïo chæ thò OP z’,.
4. Neáu trò hieän taïi cuûa y vaø hoaëc z seõ khoâng coøn ñöôïc duøng nöõa.
Haøm getreg
1. Neáu y ñang ôû trong thanh ghi vaø y seõ khoâng ñöôïc duøng nöõa sau phaùt
bieåu x := y op z.
2. Ngöôïc laïi.
3. Neáu khoâng coù thanh ghi roãng.
4. Neáu X seõ khoâng ñöôïc duøng tieáp vaø cuõng khoâng theå tìm ñöôïc moät
thanh ghi nhö ñaõ noùi ôû böôùc 3.

Thí duï 9.3. Ta coù phaùt bieåu gaùn d := (a – b) + (a – c) + (a – c)


Chuyeån thaønh maõ trung gian
t := a – b; u := a – c; v := t + u; d := v + u
Baûng 9.1. Chuoãi maõ ñoái töôïng sinh ra cho thí duï 9.3

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) (2) (3)


Phaùt i trong thanh ghi R1 i trong boä nhôù M1 i treân stack
bieåu
maõ giaù maõ giaù maõ giaù
a := b[1] MOV b (Ri), R 2 MOV Mi , R 4 MOV Si (A), R 4
MOV b(R), R MOV b(R), R
a[1] := b MOV b, a (R1) 3 MOV Mi , R 5 MOV Si (A), R 5
MOV b, a(R) MOV b, a(R)
Baûng 9.3. Maõ ñoái töôïng cho pheùp gaùn con troû

p trong thanh ghi +


Phaùt Rp p trong boä nhôù Mp p trong stack
bieåu
maõ giaù maõ giaù maõ giaù
a := * p MOV * Rp , 2 MOV Mp , R 3 MOV Sp(A), R 4
a MOV * R, R MOV * R , R
* p := a 2 MOV Mp , R 4 MOV a , R 5
MOV a * Rp MOV a , * R MOV R , *
Sp(A)
Sinh maõ cho phaùt bieåu ñieàu kieän
if x < y goto z. Chæ thò so saùnh CMP. Thí duï CMP x, y neáu x > y thì maõ
ñieàu kieän seõ ñöôïc xaùc laäp döông. Chæ thò nhaûy coù ñieàu kieän ñöôïc
thöïc thi neáu ñieàu kieän ñöôïc xaùc laäp <, =, >, > =, < >, < = chuùng ta
duøng chæ thò nhaûy coù ñieàu kieän CJ < = z. Nhö vaäy phaùt bieåu ñieàu
kieän if x < y goto z ñöôïc dòch sang maõ maùy nhö sau:
CMP x, y; CJ < z

9.5. Dag bieåu dieãn khoái cô baûn


Dag laø caáu truùc döõ lieäu raát thích hôïp ñeå hieän thöïc vieäc chuyeån ñoåi caùc
khoái cô baûn.
1. Caùc laù ñöôïc ñaët teân baèng caùc danh bieåu duy nhaát, hoaëc laø teân bieán
hoaëc haèng soá. Haàu heát caùc laù laø r-value.
2. Caùc nuùt trung gian ñöôïc ñaët teân baèng kyù hieäu pheùp toaùn.
3. Caùc nuùt cuõng coù theå laø chuoãi caùc danh bieåu cho tröôùc. Löu yù phaûi
phaân bieät söï khaùc nhau giöõa löu ñoà vaø dag.
Thí duï 9.4.
Moâ phoûng 9.5. Maõ trung gian cuûa khoái B2

(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

Hình 9.5. Dag cho khoái B2 ôû moâ phoûng 9.5

Xaây döïng dag


Giaûi thuaät 9.2. Xaây döïng dag.
Nhaäp: khoái cô baûn
Xuaát: dag cho khoái cô baûn, chöùa caùc thoâng tin sau:
1. Teân cho töøng nuùt.
2. Moãi nuùt ñeàu coù danh saùch caùc danh bieåu gaén vaøo noù.
Phöông phaùp: Giaû söû toàn taïi haøm node indentifier, haøm naøy khi ta xaây
döïng dag, seõ traû veà nuùt môùi nhaát coù lieân quan vôùi identifier.
Caùc daïng phaùt bieåu ba ñòa chæ nhö sau (i) x := y op z, (ii) x := op y, (iii)
x := y coù tröôøng hôïp phaùt bieåu ñieàu kieän, thí duï if i < = 20 goto ta
coi laø tröôøng hôïp (i) maø x khoâng ñöôïc ñònh nghóa.
1. Neáu node (y) khoâng ñöôïc ñònh nghóa, ta taïo laù coù teân y vaø node (y)
chính laø nuùt ñoù. Trong tröôøng hôïp (i) neáu node (z) khoâng ñöôïc ñònh
nghóa, ta taïo laù teân z vaø laù chính laø node (z).
2. Trong tröôøng hôïp (i), xaùc ñònh xem treân dag coù nuùt naøo coù teân op
maø con traùi laø node (y) vaø con phaûi laø node (z). Trong tröôøng hôïp
(ii) ta xaùc ñònh xem coù nuùt naøo coù teân op, maø noù chæ coù moät con duy
nhaát laø node (y). Tröôøng hôïp thöù (iii) thì ñaët n laø node (y).
3. Loaïi x ra khoûi danh saùch bieåu gaén vaøo nuùt node (x). Theâm x vaøo
danh saùch caùc danh bieåu gaén vaøo nuùt ñöôïc tìm ôû böôùc (2) vaø ñaët
node (x) vaøo n.

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à.

9.6. Taïo maõ ñoái töôïng töø dag


Saép xeáp laïi thöù töï
t1 := a + c
t2 := c + d
t3 := e – t2
t4 := t1 – t3
Ta coù theå saép xeáp laïi chuoãi maõ trung gian sao cho vieäc tính toaùn t1 chæ
xaûy ra ngay tröôùc t4.
t2 := c + d t1 := a + b
t3 := e – t2 t4 := t1 – t3
Moâ phoûng 9.6. Maõ ñoái töôïng Moâ phoûng 9.7. Chuoãi maõ sau
cho chuoãi phaùt bieåu ôû (H.9.8) khi ñaõ saép xeáp laïi maõ trung gian

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

Hình 9.9. Dag cho thí duï


t8 := d + e
t6 := a + b
t5 := t6 - c
t4 := t5 * t8
t3 := t4 - e
t2 := t6 + t4
t1:= t2 * t3

Saép xeáp toái öu cho caây


Giaûi thuaät coù hai phaàn: phaàn ñaàu ñaùnh teân cho caùc nuùt cuûa caây, phaàn
thöù hai cuûa giaûi thuaät mieâu taû loä trình treân caây. Maõ ñoái töôïng seõ sinh
ra trong quaù trình thöïc hieän loä trình treân caây.
ƒ Giaûi thuaät xaùc ñònh nhaõn cuûa nuùt treân caây
Moâ phoûng 9.9. Giaûi thuaät tính teân cuûa nuùt
label (n) = max (l1 , l2) neáu l1 ≠ l2
l1 + 1 neáu l1 = l2

(1) if n laø laù then


(2) if n laø con taän cuøng beân traùi cuûa nuùt cha cuûa noù
then
(3) label (n) := 1
(4) else label (n) := 0
else begin /* n laø nuùt trung gian */
(5) giaû söû n1 , n2 , …, nk laø con cuûa nuùt n, ñöôïc saép theo thöù töï
cuûa teân, sao cho
label (n1) > label (n2) ≥ … ≥ label (nk )
(6) label (n) := max (label (ni ) + i – 1)
1<i<k
end
Thí duï 9.8. Chuùng ta xeùt caây ôû (H.9.8)

t4 2
2
t1 1 t3

a b e t2 1
1
0 1

c d
1 0

Hình 9.10. Caây ñöôïc xaùc ñònh teân

• Sinh maõ ñoái töôïng töø caây coù teân


Moâ phoûng 9.10. Giaûi thuaät cuûa thuû tuïc gencode

procedure gencode (n);


begin
/* tröôøng hôïp 0 */
if n laø laù beân traùi bieåu thò cho toaùn haïng name
and n laø con taän cuøng beân traùi cuûa nuùt cha cuûa noù
then print ‘MOV’ || name || ‘,’ || top (rstack)
else if n laø nuùt trung gian vôùi toaùn töû laø op, con beân traùi laø n1 vaø
con beân phaûi laø n2 then
/* tröôøng hôïp thöù nhaát */
if label (n2) = 0 then begin
ñaët name laø toaùn haïng ñöôïc bieåu thò baèng n2. gencode (n1);
print op || name || ‘,’ || top (rstack)
end
/* tröôøng hôïp thöù hai */
else if 1 ≤ label (n1) < label (n2) and
label (n1) < r then begin
swap (rstack);
gencode (n2);
R := pop (rstack); /* n2 ñaõ ñöôïc tính, naèm trong R */
gencode (n1);
print op || R || ‘,’ || top (rstack);
push (rstack, R);
swap (rstack)
end
/* tröôøng hôïp thöù ba */
else if 1 ≤ label (n2) ≤ label (n1) and label (n2) < r then begin
gencode (n1);
R := pop (rstack); /* n1 ñaõ ñöôïc tính, naèm trong thanh ghi
R*/
gencode (n2);
print op || top (rstack) || ‘,’ || R;
push (rstack, R);
end
/* tröôøng hôïp thöù tö, caû hai teân ≥ r, r laø soá löôïng toái ña cuûa thanh
ghi */
else begin
gencode (n2);
T := pop (rstack);
print ‘MOV’ || top (rstack) || ‘,’ || T;
gencode (n1)
push (tstack, T);
print op || T || ‘,’ || top (rstack)
end
end;
Moâ phoûng 9.11. Chuoãi caùc leänh goïi thuû tuïc gencode vaø caùc leänh print
cuûa caùc tröôøng hôïp
gencode (t4) [R1R0] /* tröôøng hôïp 2 */
gencode (t3) [R0R1] /* tröôøng hôïp 3 */
gencode (e) [R0R1] /* tröôøng hôïp 0 */
print MOV e, R1
gencode (t2) [R0) /* tröôøng hôïp 1 */
gencode (c) [R0] /* tröôøng hôïp 0 */
print MOV c, R0
print ADD d, R0
print SUB R0 , R1
gencode (t1) [R0] /* tröôøng hôïp 1 */
gencode (a) [R0] /* tröôøng hôïp 0 */
print MOV a, R0
print ADD b, R0
print SUB R1 , R0
1. Taùc vuï (toaùn töû pheùp toaùn) cho moãi nuùt trung gian.
2. Caát moãi nuùt laù laø nuùt con taän cuøng beân traùi vaøo thanh ghi.
3. Löu giöõ cho töøng nuùt caû hai con maø chuùng coù teân baèng hoaëc nhieàu
hôn r.
Caùc taùc vuï vôùi nhieàu thanh ghi
Caùc tính chaát ñaïi soá
+ l
+ max (2, l)

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

Hình 9.12. Phaân chia thaønh caùc caây con


CHÖÔNG 10
TOÁI ÖU MAÕ
10.1. Giôùi thieäu
- Tieâu chuaån chuyeån maõ toát
- Toå chöùc cuûa trình bieân dòch toái öu

front end Boä toái öu maõ Boä sinh maõ

Phaân tích doøng Phaân tích Chuyeån ñoåi


ñieàu khieån doøng döõ lieäu

Hình 10.1. Toå chöùc cuûa boä toái öu maõ


Maõ trung gian
Thí duï 10.1. Chuyeån ñoåi sang maõ trung gian ba ñòa chæ cho ñoaïn
chöông trình trong ngoân ngöõ Pascal
for i := n – 1 down to 1 do
for j:= 1 to i do
if A [j] > A [j + 1] then
begin
temp := A [j];
A [j] := A [j + 1];
A [j + 1] := temp;
end;
Giaû söû moãi oâ nhôù laø 4 byte. Ñòa chæ neàn cuûa daõy A vaäy ñòa chæ phaàn töû
thöù j cuûa daõy A laø: addr(A[j]) = addr(A) + (j – 1) * 4.
(1) i=n-1 (16) t10 = j + 1
(2) ij i < 1 goto (31) (17) t11 = t10 - 1
(3) j=1 (18) t12 = 4 * t11
(4) if j > i goto (29) (19) t13 = A [t12]
(5) t1 = j - 1 (20) t4 = j - 1
(6) t 2 = 4 * t1 (21) t15 = 4 * t14
(7) t3 = A [t2] (22) A [t5] = t13
(8) t4 = j + 1 (23) t16 = j + 1
(9) t5 = t4 - 1 (24) t17 = t16 - 1
(10) t 6 = 4 * t5 (25) t18 = 4 * t17
(11) t7 = A [t6] (26) A [t18] = temp
(12) ij t3 < t7 goto (27) (27) j=j+1
(13) t8 = j - 1 (28) goto (4)
(14) t 9 = 4 * t8 (29) i=i-1
(15) temp = A [t9] (30) goto 2
* Khoái cô baûn
Thí duï 10.2. Ñoaïn maõ trung gian sau ñöôïc xaùc ñònh 4 khoái cô baûn
(1) read L
(2) n := 0
BB1
(3) k := 0
(4) m := 1
(5) k := k + m
(6) c := k > L BB2
(7) if (c) goto (11)
(8) n := n + 1
(9) m := m + 2 BB3
(10) goto (5)
(11) write n BB4
10.2. Phaân tích doøng döõ lieäu
Caùc caáu truùc ñieàu khieån nhö if, while, for gaây ra söï reõ nhaùnh cuûa
chöông trình. Xaùc ñònh ñöôïc söï reõ nhaùnh seõ xaùc ñònh ñöôïc söï thay ñoåi
trò cuûa bieán trong chöông trình, töø ñoù söû duïng caùc bieán naøy trong quaù
trình toái öu hoùa.
10.2.1. Muïc ñích
Xaùc ñònh caáu truùc ñieàu khieån cuûa chöông trình laø:
- moâ taû caùc con ñöôøng thöïc hieän chöông trình
- xaùc ñònh caùc voøng laëp
10.2.2. Ñoà thò doøng ñieàu khieån (Control Flow Graphs)
Ñònh nghóa:
Ñoà thò doøng ñieàu khieån (CFG) cuûa moät chöông trình laø moät ñoà thò coù
höôùng, ñöôïc kyù hieäu G = (N, E) maø trong ñoù N laø caùc khoái cô baûn, E
laø taäp caïnh theå hieän cho doøng ñieàu khieån giöõa caùc khoái cô baûn.
Thí duï 10.3. Ñoaïn maõ trung gian (goàm 4 khoái cô baûn) ôû thí duï 10.2
ñöôïc bieåu dieãn thaønh ñoà thò doøng döõ lieäu.

BB1

BB2

BB3 BB4

Hình 10.2. Ñoà thò doøng ñieàu khieån


10.2.3. Successor, predcessor cuûa moät khoái cô baûn
Cho moät ñoà thò doøng ñieàu khieån G = (N, E) vaø moät khoái cô baûn b ∈ N,
xaùc ñònh successor vaø predcessor cho khoái cô baûn b nhö sau:
* Successor cuûa b, kyù hieäu succ (b) laø taäp caùc khoái cô baûn n, maø coù
theå ñaït ñeán töø b treân 1 caïnh succ (b) = {n ∈ N | (b, n) ∈ E}
nhö ôû thí duï 10.3: succ (BB1) = {BB2};
succ (BB2) = {BB3, BB4}, succ (BB3) = {BB2}
* Predcessor cuûa b, kyù hieäu pred (b) laø taäp caùc khoái cô baûn m, maø coù
theå ñaït ñeán b treân 1 caïnh pred (b) = {m ∈ N | (m, b) ∈ E}
nhö ôû thí duï 10.3: pred (BB2) = {BB1 , BB3}
pred (BB3) = {BB2}, pred (BB4) = {BB2}
ƒ Entry cuûa G: laø moät nuùt khoâng coù predcessor
ƒ Exit cuûa G: laø moät nuùt khoâng coù successor
ƒ nuùt reõ (branch node) trong G laø nuùt coù nhieàu hôn moät successor
ƒ nuùt hợp (join node) trong G laø nuùt coù nhieàu hôn moät predcessor
Ñoà thò doøng ñieàu khieån ôû thí duï 10.3 ñöôïc theâm 2 nuùt Entry, Exit.

Entry

BB1

BB2

BB3 BB4

Exit

Hình 10.3. Nuùt Entry vaø Exit trong G


Thí duï minh hoïa caùc nuùt reõ nhaùnh vaø hợp. BB1
(1) i := 1
(2) if(I>n) goto (15) BB2
(3) t := 0
(4) j := 1 BB3
(5) if(j>n) goto (13)
(6) tmp := te + ts BB4
(7) if(tmp < 0) goto (10)
(8) t1 := t1 + ts BB5
(9) goto (11) BB6 BB7
(10) t1 := 4*j BB8
(11) j := j+1
(12) goto (5) BB9
(13) i := I+1
(14) goto (2) BB10
(15) t1 := 0
BB1 BB1 branch
node
BB2 BB2

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.

BB1 Æ BB1 ; Entry


BB1 Æ BB2 ;
BB1 Æ BB3 ; BB1
BB1 Æ BB4
BB2 Æ BB2 ; BB2
BB2 Æ BB3 ;
BB2 Æ BB4
BB3 BB4
BB3 Æ BB3
BB4 Æ BB4
Exit
ƒ properdominate
N laø proper dominate n’ , kyù hieäu n Æ p n’ , neáu n Æ n’ vaø n ≠ n’ nhö
thí duï ôû treân thì BB1 Æ p BB2 ; BB1 Æ p BB3 ; BB1 Æ p BB4 ; BB2 Æ
p BB3 ; BB2 Æ p BB4

ƒ 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

Hình 10.4. Caây dominate


Giaûi thuaät 2.2: tìm caùc dominator.
Nhaäp: ñoà thò doøng ñieàu khieån G.
Xuaát: taäp dominator cuûa moãi nuùt thuoäc G.
Giaûi thuaät:
DOM (Entry) = Entry
DOM (ν) = N ∀ ν ∈ N - {Entry, Exit}
change = true
while (change) {change = false
for each ν ∈ N - {Entry, Exit} {
old DOM = DOM (ν)’
DOM (ν) = {ν} ∪ ∩ OM (p)
pepred (ν)
if (DOM (ν) = old DOM) change = true
}
}

10.2.5. Direct dominator


Direct dominator cuûa moät nuùt n.
Giaûi thuaät tìm direct dominator cuûa moät nuùt:
- Khôûi ñoäng taäp proper dominator cuûa nuùt n
- Loaïi boû nhöõng nuùt maø noù laø proper dominator nhöõng nuùt khaùc trong
taäp
Giaûi thuaät 10.3. Tìm direct dominator
Nhaäp: ñoà thò doøng G.
Xuaát: direct dominator cuûa moãi nuùt cuûa G.
Giaûi thuaät:
for vôùi moãi nuùt n ∈ N - {Entry} do
DOMd (n) = DOM (n) - {n}
for vôùi moãi nuùt n ∈ N - {Entry} do
for vôùi moãi nuùt s ∈ DOMd (n) - {s} do
if t ∈ DOMd (s) then
DOMd (n) = DOMd (n) - {t};
ÔÛ thí duï ôû hình 10.1, ta coù:
DOMd (1) = {Entry}; DOMd (2) = {1};
DOMd (3) = {2}; DOMd (4) = {2}
10.2.6. Post – dominator
Ñònh nghóa:
Cho ñoà thò doøng ñieàu khieån G = (N, E) vaø n, n’ ∈ N.
- Nuùt n ñöôïc goïi laø post – dominator cuûa nuùt n’, kyù hieäu n Æ n’ neáu
moïi con ñöôøng töø n ñeán nuùt Exit chöùa n’.
ÔÛ thí duï hình 10.3, ta coù caùc post – dominator:
1 ← 1; 1 ← 2; 1 ← 3; 1 ← 4; 2 ← 2; 2 ← 3; 2 ← 4; 3 ← 3; 4 ← 4
- Nuùt n ñöôïc goïi laø direct post – dominator cuûa nuùt n’, kyù hieäu n ← n’,
neáu n ← pn’ vaø khoâng toàn taïi n” ∈ N maø n ← pn” ← pn’.
- Nuùt n ñöôïc goïi laø proper post – dominator cuûa nuùt n’, kyù hieäu laø
n ← pn’, neáu n ← n’ vaø n ≠ n’.
Thí duï veà post – dominator trong G laø dominator trong G-1

G1 G-1
Entry Entry

BB1 BB1

BB2 BB2

BB3 BB4 BB3 BB4

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)

RDout (b) = Gen (b) ∪ [RDin (b) – Kill (b)]


Giaûi thuaät: xaùc ñònh vieäc ñaït ñeán söï ñònh nghóa.
Nhaäp: ñoà thò doøng G vôùi taäp Gen (b) vaø kill (b) ñaõ ñöôïc tính toaùn tröôùc
cho moãi khoái cô baûn b.
Xuaát: RDin (b) vaø Rdout (b) cho moãi khoái cô baûn b
Giaûi thuaät:
RDout (Entry) = ∅
RDout (b) = ∅ ∀ b ∈ N - {Entry, Exit}
/* Gen (b) thì toát hôn */
change = true
while (change) {
change = false
for each b ∈ N - {Entry, Exit} {
oldout = RDout (b)
RDin (b) = ∪ RDout (i)
i ∈ pred (b)

RDout (b) = Gen (b) ∪ [RDin (b) – kill (b)]


if (RDout (b) ≠ oldout) change = true
}
}
RDin (Exit) = ∪ RDout (i)
i ∈ pred (Exit)
Thí duï:
Entry d1 : i := m - 1 d5 : j := j - 1
d2 : j := n d6 : a := u2
Φ Φ
d3 : a := u1 d7 : a := u3
i := m -1 d4 : i := i + 1
j := n BB1
a := u1
BB Gen (BB) Kill(BB)
{d1,d2,d3} {d1,d2,d3,d4, 1 {d1,d2,d3} {d4,d5,d6,d7}
d5,d6}
i := j + 1 2 {d4,d5} {d1,d2}
j := j - 1 BB2 3 {d6} {d3,d7}
{d4,d5,d3,d6}
e1 ? 4 {d7} {d3,d6}
{d4,d5,
{d4,d5, d3,d6}
d3,d6} RDin(b) = ∪ RDout(i)
a := u2 BB3 BB4 a := u3
i ∈ pred(b)
{d4,d5,d6} {d4,d5,d7
} RDout(b) = Gen(b) ∪[RDin(b)
Exit - kill(b)]
10.3.4. Bieán soáng
Bieán ν ñöôïc goïi laø soáng taïi ñieåm p trong chöông trình neáu giaù trò hieän
taïi cuûa ν ñöôïc duøng tröôùc khi ν ñöôïc gaùn giaù trò môùi hoaëc tröôùc khi
chöông trình keát thuùc, ngöôïc laïi goïi laø bieán cheát.
- ÖÙng duïng bieán soáng laø xaùc ñònh xem coù caàn löu giöõ trò cuûa noù khi ra
khoûi khoái cô baûn, trong thanh ghi.
- Caàn xaùc ñònh bieán soáng ôû ñieåm vaøo vaø ra cuûa moãi khoái cô baûn.
10.3.4.1. Taäp Use
Use (b) laø taäp caùc bieán ñöôïc söû duïng tröôùc khi (hoaëc coù theå) ñöôïc ñònh
nghóa trong b.
10.3.4.2. Taäp Def
Def (b) laø taäp caùc bieán ñöôïc ñònh nghóa trong b.
10.3.4.3. Söï caân baèng doøng döõ lieäu
LVin (b): taäp caùc bieán soáng taïi ñieåm vaøo cuûa b
LVout (b): taäp caùc bieán soáng taïi ñieåm ra cuûa b
Coâng thöùc:
LVout (b) = ∪ LVin (i)
i ∈ succ (b)

LVin (b) = Use (b) ∪ [LVout (b) – Def (b)]


Giaûi thuaät 3.2. Giaûi thuaät tìm bieán soáng
Nhaäp: ñoà thò doøng G vôùi Def (b) vaø Use (b) ñöôïc xaùc ñònh tröôùc.
Xuaát: LVout (b) laø taäp bieán soáng taïi ñieåm ra cuûa khoái cô baûn b.
Giaûi thuaät:
LVin (Entry) = ∅
Lvin (b) = ∅ ∀ b ∈ N - {Entry, Exit}
change = true
while change {change = false}
for each b ∈ N - {Entry, Exit} {
oldin = LVin (b)
LVout (b) = ∪ LVin (i)
i ∈ succ (b)

LVin (b) = Use (b) ∪ [LVout (b) - Def (b)]


if (LVin (b) ≠ oldin) change = true
}
}
Thí duï: cho doøng ñieàu khieån nhö sau, tìm taäp caùc bieán soáng khi ra khoûi
caùc khoái cô baûn.
Entry
{c} BB Use (BB) Def (BB)
a := 2 1 {c} {a,b,d,e,g}
b := 3 2 {b,d} {b,d}
d := c BB1 3 {a,b,d,e,g} {d,f,g}
e := a 4 {b,d,e,g} Φ
g := c + 1
a<d?
{b,d,e,g} {a,b,d,e,g} LVout(b) = ∪ LVin(i)
{a,b,d,e,g}
b := b + 1 d := d + 1 i ∈ succ(b)
d := 2 * d BB2 BB3 f := a + b
b > 10 g := e + g LVin(b) = Use(b) ∪[LVout(b)
{b,d,e,g} - Def(b)]
{b,d,e,g} {b,d,e,g}
print (b,d,e,g) BB4
Φ
Φ
Exit
10.3.5. Bieåu thöùc coù saün (Avaible expression)
ƒ Moät bieåu thöùc x op y ñöôïc goïi bieåu thöùc coù saün taïi ñieåm p neáu moïi
con ñöôøng töø nuùt khôûi ñaàu ñeán p hoaëc sau laàn tính toaùn tröôùc khi ñaït
ñeán p khoâng coù taùc vuï gaùn cho x vaø y.
ƒ ÖÙng duïng cuûa bieåu thöùc coù saün laø ñeå loaïi boû bieåu thöùc con duøng
chung.
ƒ Ta phaûi tìm taát caû bieåu thöùc coù saün taïi ñieåm vaøo vaø ra cuûa moãi khoái
cô baûn.
10.3.5.1. Taäp Eval
Eval (b) laø taäp caùc bieåu thöùc coù saün ñöôïc thöïc hieän trong b maø vaãn coù
saün taïi ñieåm ra cuûa b.
10.3.5.2. Taäp Kill
Kill (b) laø taäp caùc bieåu thöùc bò thay ñoåi trong b.
10.3.5.3. Söï caân baèng doøng döõ lieäu
AEin (b): taäp caùc bieåu thöùc coù saün taïi ñieåm baét ñaàu cuûa b.
AEout (b); taäp bieåu thöùc coù saün chaïm ñeán ñieåm keát thuùc cuûa b.
Coâng thöùc:
AEin (b) = ∩ AEout (i)
i ∈ pred (b)
AEout (b) = Eval (b) ∪ [AEin (b) – Kill (b)]
Giaûi thuaät: tìm taäp caùc bieåu thöùc coù saün taïi ñieåm vaøo vaø ra cuûa moãi
khoái cô baûn.
Nhaäp: ñoà thò doøng G vôùi Eval (b) vaø Kill (b) ñöôïc tính toaùn tröôùc cho
khoái cô baûn b.
Xuaát: AEin (b) cho khoái cô baûn b.
Giaûi thuaät:
∪: taäp caùc bieåu thöùc trong ñoà thò doøng ñieàu khieån
AEout (Entry) = ∅
AEout (b) = Eval (b) ∪ [U – Kill (b)] ∀ b ∈ N - {Entry, Exit}
change = true
while (change) {
change = false
for each b ∈ N - {Entry, Exit} {
oldout = AEout (b)
AEin (b) = ∩ AEout (i)
i ∈ pred (b)
10.4. Loaïi boû dö thöøa
Quaù trình loaïi boû dö thöøa bao goàm loaïi boû nhöõng bieåu thöùc con chung,
lan truyeàn nhöõng baûn copy, di chuyeån maõ khoâng ñoåi trong voøng laëp ra
ngoaøi voøng laëp.
10.4.1. Loaïi boû bieåu thöùc con chung
Giaûi thuaät: loaïi boû bieåu thöùc con chung
Nhaäp: maõ ba ñòa chæ cuûa ñoà thò doøng ñieàu khieån vôùi caùc AEin vaø
AEout cho töøng khoái cô baûn.
Xuaát: ñoaïn maõ ba ñòa chæ ñaõ loaïi boû bieåu thöùc con chung.
Giaûi thuaät:
for moãi khoái b ∈ N
for moãi leänh ∈ b coù daïng y = x op y
maø x op y laø coù saün taïi ñieåm vaøo cuûa b {
1. Xaùc ñònh neáu x op y coù saün taïi moãi caâu leänh
2. Xaùc ñònh vieäc tính toaùn x op y maø ñaït ñeán z
3. Taïo moät bieán môùi t
4. Thay theá söï ñònh nghóa w = x op y tìm thaáy ôû böôùc 2 baèng
t = x op y; w = t
5. Thay z = x op y baèng z = t
}
}
Thí duï veà loaïi boû bieåu thöùc con duøng chung
Entry

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}

g := a*c BB3 BB4 d := c


{a+b, d*d} g := 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)

copyout (b) = copy (b) ∪ [copyin (b) – kill (b)]


if (copyout (b) ≠ oldout) changed = true
}
}
Aein (Exit) = ∩ Aeout (i)
i ∈ pred (Exit)

10.4.2.4. Lan truyeàn baûn copy


• Caâu leänh copy laø caâu leänh coù daïng x = y.
• Söï lan truyeàn baûn copy laø thay theá x baèng y maø khoâng laøm thay ñoåi
trò cuûa x hoaëc y.
Giaûi thuaät: lan truyeàn baûn copy
Nhaäp: ñoà thò doøng ñieàu khieån G vôùi du – chain.
Xuaát: ñoà thò doøng ñieàu khieån coù söû duïng lan truyeàn baûn copy.
Giaûi thuaät:
for moãi baûn copy s: x := y thöïc hieän caùc böôùc sau:
1. Xaùc ñònh taát caû caùc nôi maø söï ñònh nghóa cuûa x ñöôïc söû duïng.
2. for moãi laàn söû duïng u:
a. s phaûi coù moät söï ñònh nghóa cuûa x chaïm ñaït ñeán u vaø
b. moïi con ñöôøng töø s ñeán u, khoâng coù taùc vuï gaùn ñeán y.
Thí duï veà söï lan truyeàn baûn copy
Entry Entry

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

if u <v goto BB3 BB2


i := 2
BB3
u := u+1
v := v-1
BB4
if v < =20 goto BB5

j := i BB5
Thí duï (ñieàu kieän 2) Thí duï (ñieàu kieän 3)

i :=1 BB1 i :=1 BB1

i :=3 BB2 if u <v goto BB3 BB2


if u <v goto BB3
i := 2 i := 2
BB3 BB3
u := u+1 u := u+1
v := v-1 k := I
if v < =20 goto BB5 BB4 v := v-1 BB4
if v < =20 goto BB5
j := i BB5
j :=1 BB5
10.5. Toái öu voøng laëp
Trong phaàn naøy chuùng ta seõ trình baøy giaûi thuaät toái öu voøng laëp laø
strength reduction. Muïc ñích cuûa giaûi thuaät naøy laø thay theá caùc caâu
leänh ñaét tieàn baèng caâu leänh reû tieàn hôn.
10.5.1. Bieán thay ñoåi (Induction variable)
Bieán thay ñoåi trong voøng laëp L laø x neáu moãi laàn thay ñoåi noù taêng hoaëc
giaûm moät haèng soá nhaát ñònh.
10.5.2. Bieán thay ñoåi cô baûn (Basic Induction Variable – BIV)
Bieán v ñöôïc goïi laø BIV trong L neáu noù coù daïng
v := v ± c vôùi c laø haèng soá
10.5.3. Bieán thay ñoåi daãn xuaát (Derived Induction Variable – DIV)
Bieán j ñöôïc goïi laø bieán thay ñoåi daãn xuaát neáu noù coù moät trong caùc
daïng sau xuaát hieän trong voøng laëp:
j := a * i hoaëc j := i * a
j := b + i hoaëc j := a * i
j := b – i hoaëc j := i – a
j := i / a
trong ñoù i laø bieán thay ñoåi cô baûn (BIV)
Giaûi thuaät 6.1. Tìm bieán thay ñoåi trong voøng laëp L.
Nhaäp: voøng laëp L.
Xuaát: taát caû caùc BIV vaø DIV trong L.
Giaûi thuaät:
1. Tìm taát caû BIV trong L.
2. Tìm caùc DIV.
3. Laëp laïi böôùc (2) cho ñeán khi naøo khoâng tìm thaáy DIV khaùc.
10.5.4. Giaûi thuaät strength Reduction
Nhaäp: voøng laëp L vaø taäp hoï caùc bieán thay ñoåi.
Xuaát: ñoaïn maõ ñaõ thöïc hieän thay theá caùc caâu leänh phöùc taïp baèng
nhöõng caâu leänh ít phöùc taïp hôn töø voøng laëp L.
Giaûi thuaät:
for moãi bieán BIV i
{
for moãi bieán j trong hoï i Æ (I, a, b)
{
taïo ra moät bieán môùi sj
khôûi ñoäng sj := a * i + b vaø ñaët vaøo preheader cuûa L
thay theá caâu leänh gaùn j baèng j := sj
sau moãi phaùt bieåu i := i ± c trong L
{
cheøn theâm sj := sj ± c * a
}
}
theâm sj vaøo hoï cuûa i

You might also like