CÁC HỆ THỐNG KIỂU.

Một phần của tài liệu GIÁO TRÌNH MÔN CHƯƠNG TRÌNH DỊCH (Trang 100 - 105)

- Quỏ trỡnh tớnh ∆i j VD: tớnh ∆ 2 4, Tớnh:

3. CÁC HỆ THỐNG KIỂU.

Một hệ thống kiểu là một tập cỏc luật để xỏc định kiểu cho cỏc phần trong chương trỡnh nguồn. Một bộ kiểm tra kiểu làm nhiệm vụ thực thi cỏc luật trong hệ thống kiểu này. Ở đõy, hệ thống kiểu được xỏc định bởi cỏc luật ngữ nghĩa dựa trờn luật cỳ phỏp. Cỏc vấn đề được nghiờn cứu trong phần cỳ phỏp điều khiển và lược đồ dịch.

Một hệ thống kiểu đỳng đắn sẽ xoỏ bỏ sự cần thiết phải kiểm tra động (vỡ nú cho phộp xỏc định tĩnh, cỏc lỗi khụng xảy ra trong lỳc chương trỡnh đớch chạy). Một ngụn ngữ gọi là định kiểu mạnh nếu chương trỡnh dịch của nú cú thể bảo đảm rằng cỏc chương trỡnh mà nú dịch tốt sẽ hoạt động khụng cú lỗi về kiểu. Điều quan trọng là khi bộ kiểm tra phỏt hiện lỗi, nú phải khắc phục lỗi dể tiếp tục kiểm tra. trước hết nú thụng bỏo về lỗi mụ tả và vị trớ lỗi. Lỗi xấut hiện gõy ảnh hưởng đếncỏc luật kiểm tra lỗi, do vậy phải thiết kế kiểu hệ thống như thế nào để cỏc luật cú thể đương đầu với cỏc lỗi này.

3.1. Một số luật ngữ nghĩa kiểm tra kiểu

Đố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ệt void. Nếu cú lỗi về kiểu được phỏt hiện trong cõu lệnh thỡ ta gỏn cho nú giỏ trị kiểu là type_error

Xột cỏch xõy dựng luật ngữ nghĩa kiểm tra kiểu qua một số vớ dụ sau: VD1: Văn phạm cho khai bỏo:

D -> D ; D D -> id : T T -> interger T -> char T -> ^ T T -> array [num] of T

Luật cỳ phỏp Luật ngữ nghĩa

D -> id : T AddType(id.entry,T.type)

T -> char T.type := char

T -> interger T.type := interger

T -> ^T1 T.type := pointer(T1.type)

T -> array [num] of T1 T.type := array(num.val,T1.type)

VD2: Văn phạm sau cho biểu thức S -> id := E

E -> E + E E -> E mod E

E -> E1 [ E2 ] E -> num E -> id

Luật cỳ phỏp Luật ngữ nghĩa

S -> id := E S.type := if id.type=E.type then voidelse type_error

E -> E1 + E2

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 -> num E.type := interger

E -> id E.type := GetType(id. entry)

E -> E1 mod E2 E.type := if E1.type=interger and E2.type=interger then interger

else type_error

E -> E1 [ E2 ] E.type := if E2.type=interger and E1.type=array(s,t) then t else

type_error

VD3: Kiểm tra kiểu cho cỏc cõu lệnh: S -> if E then S

S -> while E do S S -> S1 ; S2

Luật cỳ phỏp Luật ngữ nghĩa

S -> if E then S1 S.type := if E.type=boolean then S1.type

S -> while E do S1 S.type := if E.type=boolean then S1.type

else type_error

S -> S1 ; S2

S.type := if S1.type=void and S2.type=void then

void

else type_error

VD4: Kiểu hàm: luật cỳ phỏp sau đõy thể hiện lời gọi hàm: 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 else type_error

3.2. Vớ dụ về một bộ kiểm tra kiểu đơn giản.

Vớ dụ về một ngụn ngữ đơn giản mà kiểu của cỏc biến phải được khai bỏo trước khi dựng. Bộ kiểm tra kiểu này là một cỳ phỏp dạng lược đồ chuyển đổi nhằm tập hợp kiểu của từng biểu thức từ cỏc kiểu của cỏc biểu thức con. Bộ kiểm tra kiểu cú thể làm việc với cỏc mảng, cỏc con trỏ, lệnh, hàm.

* Một văn phạm dưới đõy sinh ra cỏc chương trỡnh, biểu diẽn bởi biến P, bao gồm một chuỗi cỏc khai bỏo D theo sau một biểu thức đơn E, cỏc kiểu T.

D → D;D|tờn:T

T →char| integer| array| số| of T| ^T E →chữ cỏi| Số | Tờn| E mod E | E; E |E^

- Một chương trỡnh cú thể sinh ra từ văn phạm trờn như sau: Key: Integer;

Key mod 1999

* Lược đồ chuyển đổi như sau: P → D; E

D → D;D

D →Tờn:T {addtype (tờn.entry, T.type)}

T →Char {T.type:= char}

T →integer {T.type:= integer}

T → ^T1 {T.type:= pointer(T1.type)}

T →array | số | of T1 {T.type:= aray(số.val,T1.type)}

Hành động ứng với sản xuất D Tờn:T lưu vào bảng kớ hiệu một kiểu cho một tờn. Hàm {addtype (tờn.entry, T.type)} nghĩa là cất một thuộc tớnh T.type vào bản kớ hiệu ở vị trớ entry.

* Kiểm tra kiểu của cỏc biểu thức.

Trong cỏc luật sau:

E → chữ cỏi {E.type : = char} E → Số { E.type := integer}

Kiểu của thuộc tớnh tổng hợp của E cho biểu thưc được gỏn bằng kiểu hệ thống để sinh biểu thức bởi E. Cỏc luật ngữ nghĩa cho thấy cỏc hằng số biểu diễn bằng từ tố chữ cỏi và số cú kiểu char và integer.

Ta dựng hàm lookup(e) để lấy kiểu caats trong bảng ký hiệu trỏ bởi e. Khi một tờn xuất hiện trong biểu thức kiểu khao bỏo của nú được lấy và gỏn cho thuộc tớnh kiểu

E → tờn {E.type:= lookup (tờn.entry)}

- Một biểu thức được tạo bởi lệnh mod cho 2 biểu thức con cú kiểu integer thỡ nú cũng cú kiểu là integer nếu khụng là kiểu type_error.

E → E1 mod E2 {E.type : = if E1.type = integer and E2.type = integer then integer else type_error}

- Đối với mảng E1[E2 ]bieeur thức chỉ số E2 phải cú kiểu là integer cỏc phần tử của mảng cú kiểu t chớnh là kiểu array(s,t) của Et

E → E1[E2] {E.type :=if E2.type = integer and Et.type = array(s,t) then t else type_error}

- Đối với thuật toỏn lấy giỏ trị con trỏ.

E → Et^ {E.type := if E1.type = pointer (t) then else type_error}

* Kiểm tra kiểu của cõu lệnh:

Đối với cõu lệnh khụng cú giỏ trị: gỏn kiểu đặc biệt void . nếu cú lỗi được phỏt hiện trong cõu lệnh : kiểu cõu lệnh là : type_error.

Cỏc cõu lệnh gồm: lệnh gỏn, điều kiện, vũng lặp while. Chuooix cỏc cõu lệnh phõn cỏch nhau bằng dấu chấm phẩy. một chương trỡnh hoàn chỉnh cú luật dạng P

→ D ; S cho biết một chương trỡnh bao gồm cỏc khai bỏo và theo sau là cỏc cõu lệnh .

S → tờn: = E { S.type:= if tờn.type= E.type then void else type _error } S → if E else S1 {S.type := if E.type = boolean then S1.type else type_error } S → While E do S1 {S.type:= if E.type = boolean then S1.type = void then void else type_error }

* kiểm tra biểu thức của hàm.

Cỏc hàm với tham số cú sản xuất dạng: E → E (E)

Cỏc luật ứng với kiểu biểu thức của kớ hiệu khụng kết thỳc T cú thể làm thừa số theo cỏc sản xuất sau:

T → T1’→’ T2 {T.type := T1.type → T2.type}

Luật kiểm tra kiểu của một hàm là: E → E1(E2) {E.type : =if E2.type =s → t then t else type_error}

luật này cho biết trong một biểu thức được tạo bằng cỏch ỏp dụng E1 vào E2 kiểu của s → t phải là một hàm từ kiểu của s vào kiểu nào đú t. kiểu E1(E2) là t.

Một phần của tài liệu GIÁO TRÌNH MÔN CHƯƠNG TRÌNH DỊCH (Trang 100 - 105)

Tải bản đầy đủ (DOC)

(158 trang)
w