CHƯƠNG III
PHÂN TÍCH T VNG
Ni dung chính:
Chương này trình bày các k thut xác định và cài đặt b phân tích t vng. K thut
đơn gin để xây dng mt b phân tích t vng là xây dng các lược đồ - automata
hu hn xác định (Deterministic Finite Automata - DFA) hoc không xác định
(Nondeterministic Finite Automata - NFA) – mô t cu trúc ca các th t (token) ca
ngôn ng ngun và sau đó dch “th công” chúng sang chương trình nhn dng các
token. Mt k thut khác nhm to ra b phân tích t vng là s dng Lex – ngôn ng
hành động theo mu (pattern). Trước tiên, người thiết kế trình biên dch phi mô t các
mu được xác định bng các biu thc chính quy, sau đó s dng trình biên dch ca
Lex để t động to ra mt b định dng automata hu hn hiu qu (b phân tích t
vng). Các mô t và cách thc hot động chi tiết ca công c Lex đưc trình bày rõ
hơn trong phn ph lc A.
Mc tiêu cn đạt:
Sau khi hc xong chương này, sinh viên phi nm được các k thut to ra b phân
tích t vng. C th,
Xây dng các lược đồ cho các biu thc chính quy mô t ngôn ng cn được
viết trình biên dch. Sau đó chuyn đổi chúng sang mt chương trình phân tích
t vng.
S dng công c có sn Lex để sinh ra b phân tích t vng.
Kiến thc cơ bn:
Sinh viên phi có các kiến thc v:
DFA và NFA. Các automata hu hn xác định và không xác định này đưc s
dng để nhn dng chính xác ngôn ng mà các biu thc chính quy có th biu
din.
Cách chuyn đổi t NFA sang DFA nhm làm đơn gin hóa quá trình cài đặt b
phân tích t vng.
Tài liu tham kho:
[1] Automata and Formal Language. An Introduction – Dean Kelley – Prentice
Hall, Englewood Cliffs, New Jersey 07632.
[2] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey
D.Ullman - Addison - Wesley Publishing Company, 1986.
[3] Compiler Design – Reinhard Wilhelm, Dieter Maurer - Addison - Wesley
Publishing Company, 1996.
[4] Design of Compilers : Techniques of Programming Language Translation
- Karen A. Lemone - CRC Press, Inc, 1992.
[5] Modern Compiler Implementation in C - Andrew W. Appel - Cambridge
University Press, 1997.
48
I. VAI TRÒ CA B PHÂN TÍCH T VNG
Phân tích t vng là giai đon đầu tiên ca mi trình biên dch. Nhim v ch yếu
ca nó là đọc các ký hiu nhp ri to ra mt chui các token được s dng bi b
phân tích cú pháp. S tương tác này được th hin như hình sau, trong đó b phân tích
t vng được thiết kế như mt th tc được gi bi b phân tích cú pháp, tr v mt
token khi được gi.
B phân
tích cú pháp
B phân
tích t vng
Bng ký
hiu
Chương trình
ngun
token
L
y
token kế
Hình 3.1 - Giao din ca b phân tích t vng
1. Các vn đề ca giai đon phân tích t vng
Có nhiu lý do để tách riêng giai đon phân tích t vng vi giai đon phân tích cú
pháp:
1. Th nht, nó làm cho vic thiết kế đơn gin và d hiu hơn. Chng hn, b phân
tích cú pháp s không phi x lý các khong trng hay các li chú thích na vì chúng
đã được b phân tích t vng loi b.
2. Hiu qu ca trình biên dch cũng s được ci thin, nh vào mt s chương
trình x lý chuyên dng s làm gim đáng k thi gian đọc d liu t chương trình
ngun và nhóm các token.
3. Tính đa tương thích (mang đi d dàng) ca trình biên dch cũng được ci thin.
Ðc tính ca b ký t nhp và nhng khác bit ca tng loi thiết b có th được gii
hn trong bước phân tích t vng. Dng biu din ca các ký hiu đặc bit hoc là
nhng ký hiu không chun, chng hn như ký hiu ( trong Pascal có th được cô lp
trong b phân tích t vng.
2. Token, mu t vng và tr t vng
Khi nói đến b phân tích t vng, ta s s dng các thut ng t t (th t, token),
mu t vng (pattern) và tr t vng (lexeme) vi nghĩa c th như sau:
- T t (token) là các ký hiu kết thúc trong văn phm đối vi mt ngôn ng
ngun, chng hn như: t khóa, danh biu, toán t, du câu, hng, chui, ...
- Tr t vng (lexeme) ca mt token là mt chui ký t biu din cho token đó.
- Mu t vng (pattern) là qui lut mô t mt tp các tr t vng kết hp vi mt
token nào đó.
Mt s ví d v cách dùng ca các thut ng này được trình bày trong bng sau:
49
Token Tr t vng minh ha Mô t ca mu t vng
const const const
if if if
relation <, <=, =, < >, >, >= < hoc <= hoc = hoc <> hoc > hoc >=
id pi, count, d2 M đầu là ch cái theo sau là ch cái, ch s
num 3.1416, 0, 5 Bt k hng s nào
literal “ hello ” Mi ch cái nm gia “ và “ ngoi tr
Hình 3.2 - Các ví d v token
3. Thuc tính ca token
Khi có nhiu mu t vng khp vi mt tr t vng, b phân tích t vng trong
trường hp này phi cung cp thêm mt s thông tin khác cho các bước biên dch sau
đó. Do đó đối vi mi token, b phân tích t vng s đưa thông tin v các token vào
các thuc tính đi kèm ca chúng. Các token có nh hưởng đến các quyết định phân tích
cú pháp; các thuc tính nh hưởng đến vic phiên dch các th t. Token kết hp vi
thuc tính ca nó to thành mt b <token, tokenval>.
Ví d 3.1: Token và giá tr thuc tính đi kèm ca câu lnh Fortran : E = M * C ** 2
đưọc viết như mt dãy các b sau:
< id, con tr trong bng ký hiu ca E >
< assign_op, >
< id, con tr trong bng ký hiu ca M >
< mult_op, >
< id, con tr trong bng ký hiu ca C>
< exp_op, >
< num, giá tr nguyên 2 >
Chú ý rng mt s b không cn giá tr thuc tính, thành phn đầu tiên là đủ để
nhn dng tr t vng.
4. Li t vng
Ch mt s ít li được phát hin ti bước phân tích t vng, bi vì b phân tích t
vng có nhiu cách nhìn nhn chương trình ngun. Ví d chui fi được nhìn thy ln
đầu tiên trong mt chương trình C vi ng cnh : fi ( a == f (x)) ... B phân tích t
vng không th biết đây là li không viết đúng t khóa if hay mt danh biu chưa
được khai báo. fi mt danh biu hp l nên b phân tích t vng phi tr v mt
token và để mt giai đon khác sau đó xác định li. Tuy nhiên, trong mt vài tình
hung phi khc phc li để phân tích tiếp. Chiến lược đơn gin nht là "phương thc
hong s" (panic mode): Các ký t tiếp theo s được xóa ra khi chui nhp còn li
50
cho đến khi tìm ra mt token hoàn chnh. K thut này đôi khi cũng gây ra s nhm
ln cho giai đon phân tích cú pháp, nhưng nói chung là vn có th s dng được.
Mt s chiến lược khc phc li khác là:
1. Xóa đi mt ký t dư.
2. Xen thêm mt ký t b mt.
3. Thay thế mt ký t không đúng bng mt ký t đúng.
4. Chuyn đổi hai ký t kế tiếp nhau.
II. LƯU TR TM CHƯƠNG TRÌNH NGUN
Vic đọc tng ký t trong chương trình ngun có th tiêu hao mt s thi gian
đáng k do đó nh hưởng đến tc độ dch. Ð gii quyết vn đề này người ta đọc mt
lúc mt chui ký t, lưu tr vào trong vùng nh tm - gi là b đệm input (buffer). Tuy
nhiên, vic đọc như vy cũng gp mt s tr ngi do không th xác định mt chui
như thế nào thì cha trn vn mt token? Phn này gii thiu vài phương pháp đọc b
đệm hiu qu:
1. Cp b đệm (Buffer Pairs)
Ði vi nhiu ngôn ng ngun, có mt vài trường hp b phân tích t vng phi
đọc thêm mt s ký t trong chương trình ngun vượt quá tr t vng cho mt mu
trước khi có th thông báo đã so trùng được mt token.
Trong phương pháp cp b đệm, vùng đệm s được chia thành hai na vi kích
thước bng nhau, mi na cha được N ký t. Thông thường, N là s ký t trên mt
khi đĩa, N bng 1024 hoc 4096.
Mi ln đọc, N ký t t chương trình ngun s được đọc vào mi na b đệm
bng mt lnh đọc (read) ca h thng. Nếu s ký t còn li trong chương trình ngun
ít hơn N thì mt ký t đặc bit eof được đưa vào buffer sau các ký t va đọc để báo
hiu chương trình ngun đã được đọc hết.
S dng hai con tr dò tìm trong buffer. Chui ký t nm gia hai con tr luôn
luôn là tr t vng hin hành. Khi đầu, c hai con tr đặt trùng nhau ti v trí bt đầu
ca mi tr t vng. Con tr p1 (lexeme_beginning) - con tr bt đầu tr t vng - s
gi c định ti v trí này cho đến khi con tr p2 (forwar) - con tr ti - di chuyn qua
tng ký t trong buffer để xác định mt token. Khi mt tr t vng cho mt token đã
được xác định, con tr p1 di lên trùng vi p2 và bt đầu dò tìm mt tr t vng mi.
Hình 3.3 - Cp hai na vùng đệm
E = M * C * * 2 EOF
p1 p2
Khi con tr p2 ti ranh gii gia 2 vùng đệm, na bên phi được lp đầy bi N ký
t tiếp theo trong chương trình ngun. Khi con tr p2 ti v trí cui b đệm, na bên
trái s được lp đầy bi N ký t mi và p2 s được di v v trí bt đầu b đệm.
51
Phương pháp cp b đệm này thường hat động rt tt nhưng khi đó s lượng ký
t đọc trước b gii hn và trong mt s trường hp nó có th không nhn dng được
token khi con tr p2 phi vượt qua mt khong cách ln hơn chiu dài vùng đệm.
Gii thut hình thc cho hat động ca con tr p2 trong b đệm :
if p2 cui na đầu then
begin
Ðc vào na cui;
p2 := p2 + 1;
end
else if p2 cui ca na cui then
begin
Ðc vào na đầu;
Di p2 v đầu b đệm ;
end
else p2 := p2 + 1
2. Khóa cm canh (Sentinel)
Phương pháp cp b đệm đòi hi mi ln di chuyn p2 đều phi kim tra xem có
phi đã hết mt na buffer chưa nên kém hiu qu vì phi hai ln kim tra. Ð khc
phc điu này, mi ln ch đọc N-1 ký t vào mi na buffer còn ký t th N là mt
ký t đặc bit, thường là eof. Như vy chúng ta đã rút ngn mt ln kim tra.
E = M * eof C * * 2 eof
p1 p2
Hình 3.4 - Khóa cm canh eof ti cui mi vùng đệm
Gii thut hình thc cho hat động ca con tr p2 trong b đệm :
p2 := p2 + 1;
if p2 = eof then
begin
if p2 cui ca na đầu then
begin
Ðc vào na cui;
p2 := p2 + 1;
end
else if p2 cui ca na sau then
52