M UC LU ÛÛ
3.4.3 Một cài dặt cho bảng ký hiệu
C u trúc d ỵ li ûu ca i đặt cho ba ng ký hi ûu đ üc phát tha oấ ư ê ì í ê ươ í trong (hình 3.7).
Ta kh ng mu n da nh ra m üt l üng kh ng gian nh t định đơ ố ì ơ ươ ơ ấ ể l u các t t tạo ra định danh; m üt l üng kh ng gian c địnhư ừ ố ơ ươ ơ ố cĩ th kh ng đu l ïn đ l u các định danh r t da i va cĩ th la mể ơ í ơ ể ư ấ ì ì ể ì lãng phí nhi u khi gặp m üt định danh ngă n.ề ơ õ
lexptr token value 1 5 9 15 div mo d id id 1 2 3 4 0 symtable
EOS EOS n EOS
d i v m o d c o u t i EOS
lexems
Ba ng í symtale la m üt dãy. M ùi ph n t cu a dãy la m u tinì ơ ơ ầ ử í ì ẩ l u gi ỵa hai vu ng. Vu ng con tro ư ư ì ì í lexptr chỉ đ n ký t û bă t đ uế ư õ ầ cu a m ùi trị t v ûng trong dãy í ơ ừ ư lexemes. Vu ng ì token l u gi ỵ loạiư ư
token. Co n các trị thu üc tính khác sẽ kh ng nĩi đ y. Vị trí th ïì ơ ơ ở â ư
0 cu a í symtale đ tr ng vì khi ể ố lookup kh ng tìm th y ơ ấ token c nầ tìm, nĩ sẽ tra v í ề0 la vị trí cu a ì í symtable. Vị trí 1, 2 ch ïa các tư ừ khĩa div, mod. Vị trí 3, 4 ch ïa danh bi u cĩ trị t v ûng la ư ể ừ ư ì count
va ì i, ngăn cách gi ỵa các trị t v ûng ký hi ûu ư ừ ư ê EOS, kh ng thu ücơ ơ trong danh bi u. Gia i thu ût nh ûn dạng ể í â â token cu a b ü ph n tíchí ơ â t v ûng (hình 3.8). N u ký t û la d u tr ng, ký t û tab, d uừ ư ế ư ì ấ ố ư ấ xu ng do ng đ üc b ü ph n tích t v ûng ra đ n chúng sẽ boố ì ươ ơ â ừ ư ì ế í qua ma kh ng c t va o ba ng danh ký hi ûu va kh ng sinh ra ì ơ ấ ì í ê ì ơ token. Bi n toa n cục ế ì lineno sẽ tăng l n m üt khi d u xu ng do ng đ ücê ơ ấ ố ì ươ ra đ n.ì ế
B ü ph n tích t v ûng sẽ đọc ký t û ti p theo. N u gặp kýơ â ừ ư ư ế ế t û đ u ti n cu a trị tư ầ ê í ừ
v ûng m ïi la s , b ü ph n tích t v ûng sẽ đọc ti p các ký t ûư ơ ì ố ơ â ừ ư ế ư k ti p. N u lại la s , b ü ế ế ế ì ố ơ
ph n tích t v ûng ghép các s tha nh m üt con s ch ïa va oâ ừ ư ố ì ơ ố ư ì bi n ế tokenval, cho loại
tokenla ìnum.
N u ký t û đ u ti n cu a ế ư ầ ê í token ti p theo la ch ỵ, b ü ph n tíchế ì ư ơ â t v ûng sẽ c t ch ỵ s va o b ü đ ûm ừ ư ấ ư ố ì ơ ê lexbuf. Sau đĩ lookup sẽ du ng ì lexbuf tìm ki m trong ba ng ký hi ûu, n u n üi dung cu aế í ê ế ơ í
lexbuf laì div hoặc mod thì kh ng cĩ ha nh vi c t va o ba ng danhơ ì ấ ì í bi u, ma tra sang b ü ph n tích cú pháp ể ì í ơ â <div,div> hoặc <mod,mod>. N u ế lookup tìm th y n üi dung trong ấ ơ lexbuf đã cĩ trong ba ng ký hi ûu ma kh ng pha i la t da nh ri ng thì b ü ph ní ê ì ơ í ì ừ ì ê ơ â tích t v ûng sẽ g i sang b ü ph n tích cú pháp ừ ư ở ơ â <id,trị thuộc
tính>. Trong tr ng h üp na y trị thu üc tính la vị trí cu a danhườ ơ ì ơ ì í
bi u trong ba ngể í symtable. N u kh ng tìm th y ế ơ ấ lookup sẽ tra ví ề trị 0, lúc đĩ insertth ûc hi ûn ha nh vi th m n üi dung cu a ư ê ì ê ơ í lexbuf
va loại ì token va o ba ng ký hi ûu, trị ì í ê p đ üc ươ tokenval l u ch ïaư ư va loại ì tokenđ üc gi ỵ trong bi n ươ ư ế typetoken.
function lexan:integer;
var lexbuf: array[0..100]of char; c: char; begin
loop begin
đọc một ký tự vào c;
if c là một ký tự trống then khơng thực hiện gì cả
else if c là một ký tự newline then lineno:=lineno+1
else if c là một ký số then begin
đ ût tokenval là giá trị của ký ă
số này và các ký số theo sau; return num
end
else if c là một chữ cái then begin
đ ût c và các ký tự, ký số theo sau vào lexbuf;ă
p:=lookup(lexbuf ); if p=0 then
p:=insert(lexbuf,id); tokenval:=p;
return trường token của mục ghi p end
else begin /* thẻ từ là một ký tự*/
đ ût tokenval là none ; /*khơng cĩ thuộc tính*/ă
return số nguyên mã hĩa ký tự c end
end end
CHƯƠNG 4
THIẾT KẾ CHƯƠNG TRÌNH DỊCH CHO NGƠN NGỮ ĐƠN GIẢN
Ch ng na y sẽ n u l n cách thi t k ch ng trình dịch d ûaươ ì ê ê ế ế ươ ư tr n c s lý thuy t đã n u ch ng 3. Ng n ng ỵ đ üc ca i đặt đê ơ ở ế ê ở ươ ơ ư ươ ì ể thi t k la ng n ng ỵ C. ế ế ì ơ ư Đầu va o la m üt file ch ng trình ngu nì ì ơ ươ ồ vi t bă ng ng n ng ỵ n Gia n, đ u ra la k t qua cu a ch ngế ị ơ ư Đơ í ầ ì ế í í ươ trình na y.ì