loc (haøm) n := loc (id) Khi caàn truy xuaát moät danh bieåu, loc seõ tìm treân baûng danh bieåu töø phaân töû môùi nhaát cuûa taàm vöïc môùi nhaát ñeán phaân töû cuõ nhaát cuûa taàm vöï[r]
(1)CHƯƠNG 8
TỔ CHỨC BẢNG DANH BIỂU
8.1 Giới thiệu
Có bốn phương pháp truy xuất bảng danh biểu: Tìm kiếm tuyến tính (linear search)
2 Tìm kiếm nhị phân (binary search) Tìm kiếm (tree search) Mã hóa băm (hash coding)
(2)Bảng 8.1 Các tác vụ bảng danh biểu
Tên chương trình
con Cách gọi Hành vi thực thi
Enter Enter (id) Khi gặp danh biểu khai báo, thủ tục kiểm tra xem danh biểu có trùng với tên tầm vực? Nếu không, thủ tục enter đưa danh biểu vào bảng danh biểu Ngược lại enter thông báo lỗi việc khai báo danh biểu nhiều lần tầm vực
loc (hàm) n := loc (id) Khi cần truy xuất danh biểu, loc tìm bảng danh biểu từ phân tử tầm vực đến phân tử cũ tầm vực cũ để tìm vị trí id trả thơng qua tên loc hàm
(3)Scopeexit Scopeexit Khi trình biên dịch hết tầm vực scopeenxit thải hồi tên biến khơng cịn có ý nghĩa tái lập tầm vực gần
8.3 Bảng danh biểu tuyến tính (linear symbol table) Thí dụ 8.1 Cho đoạn chương trình ngơn ngữ Algol.
begin real A, B; begin real C, A; .
(4)5
4 A
3 C
2 B
1 A
I =
Hình 8.1 Bảng danh biểu tuyến tính thí dụ 8.1
Các tác vụ bảng danh biểu tuyến tính trình bày sau: Giải thuật:
const tab lim = … ; btablim = … ;
3
2
1
B =
(5)type tabinden = tablim; item = record
key: alfa; /* alfa kiểu chuỗi ký tự */ end;
var btab: array [1 btablim] of integer;
tab: array [1 Tablim] of item; b: • • tablim;
t: tabindex; procedure enter (id: alfa)
var sb: tabindex;
(6)Tìm kiếm bảng TAB từ vị trí sb đến vị trí t – 1, xem có phần tử mang key id khơng? Nếu có, thủ tục error thơng báo lỗi lỗi có hai danh biểu tên tầm vực Ngược lại, if t = tablim then error (12)
else begin tab [t] key := id; t := t +
end; end;
function loc (id: alfa): tabindex; begin
(7)end;
Procedure scopeentry;
begin if b = btablim then error (14)
else begin btab [b] := t; b := b + end;
end;
Procedure Scope exit;
begin b := b – 1; t := btab [b] end;