CHƯƠNG IV
PHÂN TÍCH CÚ PHÁP
Ni dung chính:
Mi ngôn ng lp trình đều có các quy tc din t cu trúc cú pháp ca các chương
trình có định dng đúng. Các cu trúc cú pháp này được mô t bi văn phm phi ng
cnh. Phn đầu ca chương nhc li khái nim văn phm phi ng cnh, cách tìm mt
văn phm tương đương không còn đệ quy trái và mơ h. Phn ln ni dung ca
chương trình bày các phương pháp phân tích cú pháp thường được s dng trong các
trình biên dch: Phân tích cú pháp t trên xung (Top down) và Phân tích cú pháp t
dưới lên (Bottom up). Các chương trình ngun có th cha các li cú pháp. Trong quá
trình phân tích cú pháp chương trình ngun, s rt bt tin nếu chương trình dng và
thông báo li khi gp li đầu tiên. Vì thế cn phi có k thut để vượt qua các li cú
pháp để tiếp tc quá trình dch - Các k thut phc hi li. T văn phm đặc t ngôn
ng lp trình và la chn phương pháp phân tích cú pháp phù hp, sinh viên có th t
mình xây dng mt b phân tích cú pháp. Phn còn li ca chương gii thiu công c
Yacc. Sinh viên có th s dng công cy để to b phân tích cú pháp thay vì phi t
cài đặt. Mô t chi tiết v Yacc được tìm thy phn ph lc B.
Mc tiêu cn đạt:
Sau khi hc xong chương này, sinh viên phi nm được:
Các phương pháp phân tích cú pháp và các chiến lược phc hi li.
Cách t cài đặt mt b phân tích cú pháp t mt văn phm phi ng cnh xác
định.
Cách s dng công c Yacc để sinh ra b phân tích cú pháp.
Kiến thc cơ bn:
Sinh viên phi có các kiến thc v:
Văn phm phi ng cnh (Context Free Grammar – CFG), Automat đẩy xung
(Pushdown Automata – PDA).
Cách biến đổi t mt CFG v mt PDA.
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.
65
I. VAI TRÒ CA B PHÂN TÍCH CÚ PHÁP
1. Vai trò ca b phân tích cú pháp
B phân tích cú pháp nhn chui các token t b phân tích t vng và xác nhn
rng chui này có th được sinh ra t văn phm ca ngôn ng ngun bng cách to ra
cây phân tích cú pháp cho chui. B phân tích cú pháp cũng có cơ chế ghi nhn các li
cú pháp theo mt phương thc linh hot và có kh năng phc hi được các li thường
gp để có th tiếp tc x lý phn còn li ca chui nhp.
Chương
trình
ngun
token Cây
phân tích
cú pháp
B
phân
tích t
v
n
g
B phân
tích cú
pháp
Phn
còn li
ca front
en
d
Ly token
tiếp
Biu din
trung gian
Bng ký hiu
Hình 4.1 - V trí ca b phân tích cú pháp trong mô hình trình biên dch
2. X lý li cú pháp
Chương trình ngun có th cha các li nhiu mc độ khác nhau:
- Li t vng như danh biu, t khóa, toán t viết không đúng.
- Li cú pháp như ghi mt biu thc toán hc vi các du ngoc đóng và m
không cân bng.
- Li ng nghĩa như mt toán t áp dng vào mt toán hng không tương thích.
- Li logic như thc hin mt li gi đệ qui không th kết thúc.
Phn ln vic phát hin và phc hi li trong mt trình bin dch tp trung vào giai
đọan phân tích cú pháp. Vì thế, b x lý li (error handler) trong quá trình phân tích cú
pháp phi đạt mc đích sau:
Ghi nhn và thông báo li mt cách rõ ràng và chính xác.
Phc hi li mt cách nhanh chóng để có th xác định các li tiếp theo.
Không làm chm tiến trình ca mt chương trình đúng.
3. Các chiến lược phc hi li
Phc hi li là k thut vượt qua các li để tiếp tc quá trình dch. Nhiu chiến
lược phc hi li có th dùng trong b phân tích cú pháp. Mc dù không có chiến lược
nào được chp nhn hoàn toàn, nhưng mt s trong chúng đã được áp dng rng rãi.
đây, chúng ta gii thiu mt s chiến lưc :
a. Phương thc "hong s" (panic mode recovery): Ðây là phương pháp đơn
gin nht cho cài đặt và có th dùng cho hu hết các phương pháp phân tích. Khi mt
66
li được phát hin thì b phân tích cú pháp b qua tng ký hiu mt cho đến khi tìm
thy mt tp hp được ch định ca các token đồng b (synchronizing tokens), các
token đồng b thường là du chm phy (;) hoc end.
b. Chiến lược mc ng đon (phrase_level recovery): Khi phát hin mt li, b
phân tích cú pháp có th thc hin s hiu chnh cc b trên phn còn li ca dòng
nhp. C th là thay thế phn đầu còn li bng mt chui ký t có th tiếp tc. Chng
hn, du phy (,) bi du chm phy (;), xóa mt du phy l hoc thêm vào mt du
chm phy.
c. Chiến lược dùng các lut sinh sa li (error production): Thêm vào văn phm
ca ngôn ng nhng lut sinh li và s dng văn phm này để xây dng b phân tích
cú pháp, chúng ta có th sinh ra b đoán li thích hp để ch ra cu trúc li được nhn
biết trong dòng nhp.
d. Chiến lược hiu chnh toàn cc (global correction): Mt cách lý tưởng là trình
biên dch to ra mt s thay đổi trong khi x lý mt li. Có nhng gii thut để la
chn mt s ti thiu các thay đổi để đạt đưc mt hiu chnh có chi phí toàn cc nh
nht. Cho mt chui nhp có li x và mt văn phm G, các gii thut này s tìm được
mt cây phân tích cú pháp cho chui y mà s lượng các thao tác chèn, xóa và thay đổi
token cn thiết để chuyn x thành y là nh nht. Nói chung, hin nay k thut này vn
còn dng nghiên cu lý thuyết.
II. BIN ÐI VĂN PHM PHI NG CNH
Nhiu ngôn ng lp trình có cu trúc đệ quy mà nó có th được định nghĩa bng
các văn phm phi ng cnh (context-free grammar) G vi 4 thành phn G (V, T, P, S),
trong đó:
V : là tp hu hn các ký hiu chưa kết thúc hay các biến (variables)
T : là tp hu hn các ký hiu kết thúc (terminals).
P : là tp lut sinh ca văn phm (productions).
S V: là ký hiu bt đầu ca văn phm (start symbol).
Ví d 4.1: Văn phm vi các lut sinh sau cho phép định nghĩa các biu thc s
hc đơn gin (vi E là mt biu thc expression) :
E E A E (E) - E id
A + - * /
1. Cây phân tích cú pháp và dn xut
Cây phân tích cú pháp có th được xem như mt dng biu din hình nh ca mt
dn xut. Ta nói rng αAβ dn xut ra αγβ (ký hiu: αAβ αγβ) nếu A γ là mt
lut sinh, αβ là các chui tùy ý các ký hiu văn phm.
Nếu α1 α2 .. .. αn ta nói α1 dn xut ra (suy ra) αn
Ký hiu : dn xut ra qua 1 bước
* : dn xut ra qua 0 hoc nhiu bước.
67
+ : dn xut ra qua 1 hoc nhiu bước.
Ta có tính cht:
1. α * α vi ∀α
2. α * ββ * γ thì α * γ
Cho mt văn phm G vi ký hiu bt đầu S. Ta dùng quan h + để định nghĩa
L(G) mt ngôn ng được sinh ra bi G. Chui trong L(G) có th ch cha mt ký
hiu kết thúc ca G. Chui các ký hiu kết thúc w thuc L(G) nếu và ch nếu S + w,
chui w được gi là mt câu ca G. Mt ngôn ng được sinh ra bi mt văn phm gi
là ngôn ng phi ng cnh. Nếu hai văn phm cùng sinh ra cùng mt ngôn ng thì
chúng được gi là hai văn phm tương đương.
Nếu S * α, trong đó α có th cha mt ký hiu chưa kết thúc thì ta nói rng α
mt dng câu (sentential form) ca G. Mt câu là mt dng câu có cha toàn các ký
hiu kết thúc.
Mt cây phân tích cú pháp có th xem như mt biu din đồ th cho mt dn xut.
Ð hiu được b phân tích cú pháp làm vic ta cn xét dn xut trong đó ch có ký
hiu chưa kết thúc trái nht trong bt k dng câu nào được thay thế ti mi bước, dn
xut như vy được gi là trái nht. Nếu α β trong đó ký hiu chưa kết thúc trái nht
trong α được thay thế, ta viết α * lm β
Nếu S * lm α ta nói α là dng câu trái ca văn phm.
Tương t, ta có dn xut phi nht - còn gi là dn xut chính tc (canonical
derivations)
d 4.2: Cây phân tích cú pháp cho chui nhp : - (id + id) sinh t văn phm
trong ví d 4.1 E
E
E
-
( )
+ E E
i
d
i
d
Hình 4.2 - Minh ha mt cây phân tích cú pháp
Ð thy mi quan h gia cây phân tích cú pháp và dn xut, ta xét mt dn xut :
α1 α2 .. .. αn trong đó αi là mt ký hiu chưa kết thúc A.
Vi mi αi ta xây dng mt cây phân tích cú pháp. Ví d vi dn xut:
E -E - (E) - (E + E) - (id + E) - (id + id)
Ta có quá trình xây dng cây phân tích cú pháp như sau :
68
E
- E
E
_
E
E
( )
E
-
E
E
( ) E
E E
+
-
E
E
( ) E
E E +
id
E
E
( ) E
E E +
id id
_
Hình 4.3 - Xây dng cây phân tích cú pháp t dn xut
2. Loi b s mơ h
Mt văn phm to ra nhiu hơn mt cây phân tích cú pháp cho cùng mt chui
nhp được gi là văn phm mơ h. Nếu mt văn phm là mơ h, ta không th xác định
được cây phân tích cú pháp nào s đưc chn. Vì thế, ta phi viết li mt văn phm
nhm tránh s mơ h ca nó. Mt ví d, chúng ta s loi b s mơ h trong văn phm
sau :
Stmt
if expr then stmt
if expr then stmt else stmt
other
Ðây mt văn phm mơ h vì câu nhp if E1 then if E2 then S1 else S2 s có hai
cây phân tích cú pháp :
Stmt
if expr
then Stmt
if expr then Stmt
elsem Stmt
E2 S1 S2
E1
69