ươ

ễ Nguy n Ph ọ

ng Thái ộ B  môn Khoa h c Máy tính http://www.coltech.vnu.vn/~thainp/

ể ệ ố ậ ữ ể

Nội dung Bi u th c ki u ể ứ H  th ng ki u ể Lu t ng  nghĩa ki m tra ki u ể

Giới thiệu Mô đun phân tích ng  nghĩa: ki m tra tính đúng đ n v   ề

ươ ể ng trình ngu n ữ m t ng  nghĩa c a ch

ươ

ặ ệ ủ ượ ạ ồ c chia làm hai lo i:

ng trình đích

ể ể ch y)ạ

ữ Vi c ki m tra đ ể ki m tra tĩnh  ki m tra đ ng (ki m tra đ ng x y ra lúc ch

Trong bài gi ng này ta ch  xét m t s  d ng c a ki m tra

ộ ố ạ ủ ể ả ỉ

tĩnh

ắ ủ

Giới thiệu (tiếp) ki m tra ki u: ki m tra v  tính đúng đ n c a các ki u toán h ng

ể trong bi u th c.

ki m tra dòng đi u khi n: m t s  đi u khi n ph i có c u trúc h p  ộ ố ề

ả ả ằ

ụ ư ệ

break trong ngôn ng  C ph i n m trong m t

ề lý, ví d  nh  l nh  vòng l p.ặ

ượ ị

ộ ầ

ả ượ

ầ ử

ướ

ki m tra tính nh t quán: có nh ng ng  c nh mà trong đó m t đ i  ộ ố ữ ả ữ ộ c đ nh nghĩa ch  đúng m t l n. Ví d , trong Pascal, m t  ả c khai báo duy nh t, các nhãn trong l nh case ph i  ượ ặ c l p

ệ ng không đ

ể  trong ki u vô h

ể ượ ng đ t tên ph i đ khác nhau, và các ph n t i.ạ l ể

ki m tra quan h  tên: Đôi khi m t tên ph i xu t hi n t

ng trình con có m t tên mà

ệ ở ầ

ụ ả

ươ

ươ ố ủ

ệ lên. Ví d , trong Assembly, m t ch chúng ph i xu t hi n

ở ầ ệ ừ  hai l n tr   ộ ng trình con này.

đ u và cu i c a ch

ữ ượ ị ở ể

Biểu thức kiểu Ki u c a m t c u trúc ngôn ng  đ

c bi u th  b i

c xây d ng t

ể ơ ả  các ki u c  b n theo

ượ  nào đó

ộ ấ ể ủ ể ứ ể “bi u th c ki u” M t bi u th c ki u có th  là: ứ ể ộ ể m t ki u c  b n  ể ơ ả ộ ki u h p thành: đ ợ ể ộ ố m t s  toán t

ệ ặ ể ả ề t dùng đ  tr  v

ộ ấ

ệ ặ ấ ị

ể t khác, bi u th  các c u  ư ệ

Kiểu cơ bản boolean, char, interger, real type_error : m t ki u c  b n đ c bi ể ơ ả ộ ể ị ỗ i ki u m t c u trúc b  l void: m t ki u c  b n đ c bi ể ơ ả ể ộ ị ầ trúc không c n xác đ nh ki u nh  câu l nh

ộ ả ể

Kiểu hợp thành M ng.ả ứ ể

ộ ố ớ array(I,T) là m t ộ ầ ử ể T và   ki u

ị ể

ủ ứ ể ể

ể  N u ế T là m t bi u th c ki u thì  ứ bi u th c ki u đ i v i m t m ng các ph n t ỉ ố I là t p các ch  s .  Ví d , trong ngôn ng  Pascal khai báo:   var A: array[1..10] of interger; ể ủ ẽ s  xác đ nh ki u c a A là  ộ ể ứ ể ề ế T1  ủ T1xT2

ể ứ ể ể ể ộ

array(1..10,interger) Tích c a bi u th c ki u là m t bi u th c ki u. N u  ứ và T2 là các ki u bi u th c ki u thì tích Đ  các c a  là m t bi u th c ki u.

ộ ả ể ể

Kiểu hợp thành (tiếp) B n ghi ả ượ

ườ ứ . Ki u c a m t b n ghi chính là bi u th c ki u  ợ ủ ng h p c a nó. ể ủ  các ki u c a các tr đ

type row=record

address: interger; lexeme: array[1..15] of char;

ươ ứ

ế ủ

end; var table: array[1..101] of row; nh  v y m t bi n c a row thì t

ng  ng v i m t bi u th c ki u

ư ậ là: record((address x interger) x (lexeme x array(1..15,char)))

ể ủ ừ ự c xây d ng t Ví d  (ngôn ng  Pascal): ữ ụ

ứ ộ

Kiểu hợp thành (tiếp) Con trỏ. Gi ể ị

Ví d  (ngôn ng  Pascal):

pointer(row)

ể ả ử T là m t bi u th c ki u thì  pointer(T) là   s   ể ể ứ ể ị ộ m t bi u th  m t bi u th c ki u xác đ nh ki u cho con  ể T.  ộ ố ượ tr  c a m t đ i t ng ki u  ữ

ộ ỏ ủ ụ var p: ^row ể thì p có ki u là

ộ ầ ử ủ ạ ừ ộ

c a m t  ộ ể

các ph n t ể ộ ể

ư ậ ẽ ượ ệ ể ộ

Kiểu hợp thành (tiếp) Hàm. M t hàm là m t ánh x  t ộ ộ ậ ư ậ ậ t p vào m t t p khác. Nh  v y có th  coi ki u m t hàm  ạ ừ ộ ạ ể ề  m t ki u mi n D vào m t ki u ph m vi R.  là ánh x  t ể ứ c ký hi u  Bi u th c ki u cho m t hàm nh  v y s  đ là D­>R.  ụ

Ví d  (ngôn ng  Pascal), m t hàm khai báo nh  sau:

ư ộ

interger x interger và ki u ph m vi là  ị ể

ư ậ

ạ ể

ể ứ

pointer(interger). Và nh  v y bi u th c ki u xác đ nh  ki u cho hàm đó là:

interger x interger ­> pointer(interger)

ữ function f(a,b:interger): ^interger; có ki u mi n là

ể ị

ươ

các ph n trong ch ể ậ ể ồ ụ ự ậ

Hệ thống kiểu H  th ng ki u: là m t t p các lu t đ  xác đ nh ki u cho  ộ ậ ể ng trình ngu n B  ki m tra ki u: làm nhi m v  th c thi các lu t trong  ệ

K  thu t: cú pháp đi u khi n và l

ệ ố ầ ộ ể ể ệ ố h  th ng ki u ậ ỹ ề ể ượ ồ ị c đ  d ch

ộ ố ụ

Một số luật ngữ nghĩa kiểm tra kiểu Ta s  xét m t s  ví d ẽ Chú ý:

đ i v i câu l nh không có giá tr , ta có th  gán cho nó ki u

ố ớ ơ ở ặ c  s  đ c bi n u có l ế

c phát hi n trong câu l nh thì ta

ệ ệ void t  ỗ ề ể ượ i v  ki u đ ị ể

type_error

gán cho nó giá tr  ki u là

Phần khai báo của chương trình D ­> id : T T ­> interger T ­> char T ­> ^ T T ­> array [num] of T

ậ Lu t cú pháp D ­> id : T

T ­> char T ­> interger T ­> ^T1 T ­> array [num] of T1

ữ Lu t ng  nghĩa AddType(id.entry,T.type); D.type := void T.type := char T.type := interger T.type := pointer(T1.type) T.type := array(num.val,T1.type)

Biểu thức S ­> id := E E ­> E + E E ­> E mod E E ­> E1 [ E2 ] E ­> num E ­> id

ữ Lu t ng  nghĩa

Lu t cú pháp S ­> id := E

E ­> E1 + E2

E ­> num E ­> id E ­> E1 mod E2

E ­> E1 [ E2 ]

S.type := if id.type=E.type then void        else type_error ; AddType(id.entry,E.type) E.type:=    if E1.type=interger and E2.type=interger then    interger   else  if E1.type=interger and E2.type=real then real   else  if E1.type=real and E2.type=interger then real   else  if E1.type=real and E2.type=real then real    else type_error E.type := interger E.type := GetType(id. entry) E.type := if E1.type=interger and E2.type=interger  then interger else type_error E.type := if E2.type=interger and E1.type=array(s,t)  then t else type_error

Câu lệnh S ­> if E then S S ­> while E do S S ­> S1 ; S2

Lu t cú pháp S ­> if E then S1

S ­> while E do S1

S ­> S1 ; S2

ữ Lu t ng  nghĩa S.type := if E.type=boolean then S1.type else type_error S.type := if E.type=boolean then S1.type else type_error S.type := if S1.type=void and  S2.type=void then void else type_error

Hàm

ể ệ ờ ọ

i g i hàm:

lu t cú pháp sau đây th  hi n l E ­> E1 ( E2 )   Ví d :ụ

function f(a,b:char):^interger; begin . . .

end; var  p:^interger; q:^char;        x,y:interger; begin . . . p:=f(x,y);// đúng q:=f(x,y);// sai end;

Lu t cú pháp

ữ Lu t ng  nghĩa

E ­> E1 ( E2 )

E.type := if E2.type=s and E1.type=s­>t  then t else type_error