M UC LU ÛÛ
4.1 MƠ TẢ CHƯƠNG TRÌNH DỊCH
Ch ng trình dịch đ üc thi t k bă ng cách du ng l üc đươ ươ ế ế ị ì ươ ồ dịch cú pháp (hình4.1a,b,c). L üc đ na y đ üc x y d ûng d ûaươ ồ ì ươ â ư ư tr n cú pháp cu a ng n ng ỵ n Gia nê í ơ ư Đơ í
chương_trình → dãy_lệnh
dãy_lệnh → lệnh;dãy_lệnh|lệnh; lệnh → {dãy_lệnh}
|nếu btqh thì lệnh opt_else_clause |cho id:=bt tới bt lệnh
|cho id:=bt xuống bt lệnh
|trong_khi btqh l ûp lệnhă
|l ûp_lại lệnh đến_khi btqh ă
|id:=bt
|lệnh_khác
opt_else_lause →nếu_khơng lệnh|ε
Hình 4.1a L üc đ dịch cú pháp cho các c u l ûnhươ ồ â ê
lệnh_khác la các l ûnh gọi ha m, m ùi ha m cĩ m üt ch ïcì ê ì ơ ì ơ ư
năng ri ng va t n gọi cu a m ùi ha m khác nhau.ê ì ê í ơ ì
T ûp các ký hi ûu ch a k t thúc: Vâ ê ư ế n = {chương_trình,
T ûp các ký hi ûu k t thúc: Vâ ê ế t={; {, }, nếu, thì,
nếu_khơng, cho, tới, xuống, trong_khi, l ûp, l ûp_lại,ă ă
đến_khi, id, :=, =}
Ký hi ûu mục ti u: ch ng_trìnhê ê ươ Trong đĩ:
btqh: (bi u th ïc quan h û): g m các phép tốn quan h û gi ỵaể ư ê ồ ê ư bi u th ïc v ïi bi u th ïcể ư ơ ể ư
(<, <=, >, >=, =, <>), các phép tốn logic (phủ_định,và,ho ûcă ) cĩ the l ng nhau.í ồ
Nĩ đ üc định nghĩa:ươ
btqh →qh term1
term1 → bt_logic qh term1 |ε
bt_logic → và | ho ûcă
qh →( btqh )
| phủ_định qh | bt pt_qh bt
pt_qh→ < | <= | > | >= | = | <>
Hình 4.1b L üc đ dịch cú pháp cho bi u th ïc quan h ûươ ồ ể ư ê
bt(bi u th ïc s học): các s , định danh va các phép tốn sể ư ố ố ì ố học cĩ th l ng nhau th ng qua các d u ngoặc đ n “(“, ”)”.ể ồ ơ ấ ơ
bt → term rest1 | -bt
rest1 →+term rest1
|-term rest1
|ε
term → factor rest2
rest2 → *factor rest2
|/factor rest2 |div factor rest2 |mod factor rest2
|ε
factor → (bt)
|id
|num
Hình 4.1c L üc đ dịch cho các bi u th ïc s học ươ ồ ể ư ố
The t í ừ id(định danh) bi u di ùn m üt dãy kh ng r ùng g mể ê ơ ơ ơ ồ các ch ỵ cái va ký s bă t đ u bă ng ch ỵ cái, ư ì ố õ ầ ị ư num la m üt dãy kýì ơ s , ố eof la ký t û cu i t ûp tin. Các the t đ üc ph n cách b iì ư ố â í ừ ươ â ở các khoa ng tră ng. í õ
oạn mã ch ng trình đ üc vi t trong nhi u m đun, m ùi m
Đ ươ ươ ế ề ơ ơ ơ
đun la m üt ha m, th ûc hi ûn t ng ch ïc năng ri ng trong quáì ơ ì ư ê ừ ư ê trình ph n tích va di ùn dịch. M đun chính đ dịch ch ng trìnhâ ì ê ơ ể ươ la ha m ì ì compile(), ca i đặt nh sau:ì ư int compile() { init(); nextsym(); lookahead=typetoken; order(1); if (err) return 0; else return 1; }
Ha m ì init() đ üc gọi đ u ti n đ kh i gán các t da nh ri ngươ ầ ê ể ở ừ ì ê va o ba ng ký hi ûu. Lúc đ u loại ì í ê ầ token va trị t v ûng cu a cácì ừ ư í t da nh ri ng đ üc c t trong dãy ừ ì ê ươ ấ keyword, init sẽ du ng ha mì ì
insertđ c t các t khĩa va o ba ng ký hi ûu tr ïc khi trình bi nể ấ ừ ì í ê ươ ê dịch bă t đ u la m vi ûcõ ầ ì ê .Ti p theo ha m ế ì nextsym()đ üc gọi, ha mươ ì na y th ûc hi ûn ch ïc năng ph n tích t v ûng. Bi n ì ư ê ư â ừ ư ế lookahead
đ üc gán cho loại t t ươ ừ ố typetoken tr ïc khi gọi ha m ươ ì order(1)
đ th ûc hi ûn các l ûnh trong ch ng trình.ể ư ê ê ươ