Bài giảng Xây dựng chương trình dịch - Chương 5: Kiểm tra kiểu
•Biểu thức kiểu
•Kiểu của một ngôn ngữ lập trình được kí hiệu bởi các biểu thức kiểu (type expression).
•Biểu thức kiểu được định nghĩa như sau:
1.Kiểu cơ sở là một biểu thức kiểu: boolean, char, integer, real, type_error, void
2.Một tên kiểu là một biểu thức kiểu
3. Mỗi kiểu dữ liệu có cấu trúc là một biểu thức kiểu, các cấu trúc bao gồm:
Bạn đang xem tài liệu "Bài giảng Xây dựng chương trình dịch - Chương 5: Kiểm tra kiểu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_giang_xay_dung_chuong_trinh_dich_chuong_5_kiem_tra_kieu.ppt
Nội dung text: Bài giảng Xây dựng chương trình dịch - Chương 5: Kiểm tra kiểu
- CHƯƠNG V Kiểm tra kiểu Mục tiêu: • Nắm được cách định nghĩa hệ thống kiểu trong các ngôn ngữ lập trình • Cách kiểm tra kiểu trong quá trình biên dịch 1
- a. Mảng (array): Nếu T là một biểu thức kiểu thì array(I, T) là một biểu thức kiểu. Một mảng có tập chỉ số I và các phần tử có kiểu T b. Tích (product): Nếu T1, T2 là biểu thức kiểu thì tích Đề- các T1* T2 là biểu thức kiểu c. Bản ghi (record): Là cấu trúc bao gồm một bộ các tên trường, kiểu trường d. Con trỏ (pointer): Nếu T là một biểu thức kiểu thì pointer(T) là một biểu thức kiểu T e. Hàm (function): Hàm là một ánh xạ các phần tử của tập xác định (domain) D lên tập giá trị (range) R. Một hàm là một biểu thức kiểu D → R 3
- • Định nghĩa một ngôn ngữ đơn giản: Văn phạm sau sinh ra một chương trình, biểu diễn bởi một ký hiệu chưa kết thúc P chứa một chuỗi các khai báo D và một biểu thức đơn giản E P → D ; E D → D ; D | id : T T → char | integer | array[num] of T | T E → literal | num | id | E mod E | E [E] | E Ví dụ 5.1: Chương trình sau sinh bởi văn phạm trên key: integer; key mod 1999 5
- Kiểm tra kiểu của các biểu thức • Lược đồ dịch cho kiểm tra kiểu của biểu thức: E → literal {E.type := char } E → num {E.type := integer } E → id {E.type := lookup(id.entry) } E → E1 mod E2 {E.type := if E1.type = integer and E2.type = integer then integer else type_error } E → E1[E2] {E.type := if E2.type =integer and E1.type = array(s,t) then t else type_error } E → E1 { E.type := if E1.type = pointer(t) then t else type_error } 7
- Kiểm tra kiểu của các hàm • Việc ghép một hàm với một đối (argument) có thể diễn đạt bởi luật sinh: E → E ( E ) • Lược đồ dịch kiểm tra kiểu cho một hàm: E → E1 (E2) {E.type := if E2.type = s and E1.type = s -> t then t else type_error } • Nếu có nhiều đối có kiểu tương ứng T1, T2, , Tn được coi như một đối duy nhất có kiểu T1*T2* *Tn 9
- • Ép kiểu (coercion): Việc chuyển một kiểu dữ liệu sang một kiểu khác được gọi là ẩn (implicit) nếu nó được làm tự động bởi compiler và được gọi là hiện (explicit) nếu được giải quyết bởi người lập trình Ví dụ 5.2: Hàm ord() trong pascal chuyển kiểu kí tự sang số nguyên, phép chuyển đổi là hiện Lệnh a:=b; trong đó a kiểu real, b kiểu integer khi thực hiện compiler sẽ thực hiện ép kiểu biến b sang kiểu real trước khi thực hiện lệnh gán, phép chuyển đổi là ẩn 11