MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN Giao điện của bảng ký hiệu.

Một phần của tài liệu Trình biên dịch nguuyên lý kỹ thuật và công cụ (Trang 70 - 72)

. 98 TỔNG QUAN VỀ BIÊN DỊCH

68MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN Giao điện của bảng ký hiệu.

Giao điện của bảng ký hiệu.

Các thủ tục của bảng ký hiệu chú yếu liên quan đếti việc lưu và truy xuất các từ tế. Khi một từ tố. được lưu, chúng ta cũng lưu thể từ đi kèm với từ tố đĩ. Các thao tác sau đây sẽ được thực hiện trên bảng ký hiệu.

insert(s, tì: trả về chỉ mục của một mục ghi mới cho chuỗi s, thể từ t. 1ookup (8) : trả về chỉ mục của mục ghi dành cho chuỗi s, hoặc là 0

“ nếu khơng tìm thấy s.

Thể phán từ vựng dùng thao tác 1ookup (tìm kiếm) để xác định xem đã cĩ một mục ghỉ dành cho một từ tố trong bảng ký hiệu hay chưa. Nếu mục đĩ chưa cĩ thì nĩ dùng thao tác insert để tạo ra. Chúng ta sẽ thảo luận một cài đặt mà trong đĩ cả thể phân từ vựng và thể phân cú pháp đều biết về dang thức của các mục ghi trong bảng

ký hiệu.

Xử lý các từ khĩa dành riêng

Các thủ tục ở trên cĩ thể xử lý được các từ khĩa dành riêng (reserved keyword). Thí dụ xét các thẻ từ địv và mod với các từ tố div và mod. Chúng ta cĩ thể khởi gán bảng ký hiệu bằng cách dùng lời gọi

insert(*div”, dỉv); insert(*mod”, mod); insert(*mod”, mod);

Mọi lời gọi Lookup (*div”) sau đĩ sẽ trả về thẻ từ div, vì thế điv khơng thể được dùng làm định danh.

Một tập các từ khĩa dành riêng cĩ thể được xử lý theo lối này qua việc khởi gán bảng ký hiệu cho phù hợp.

Một cài đặt cho bảng ký biệu

Cấu trúc dữ liệu cài đặt cụ thể cho một bảng ký hiệu được phác thảo trong Hình 2.29. Chúng ta khơng muốn dà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 đủ lớn để lưu các định danh rất dài và cĩ thể làm lãng phí nhiều khi gặp một định danh ngắn, chẳng hạn như ¡. Trong Hình 2.39, chúng ta dùng một mảng riêng rẽ là 1exemes để lưu chuỗi ký tự tạo ra một định danh. Chuỗi này kết thúc bằng một ký tự EOS (end-of-string, cuối chuỗi) khơng xuất hiện trong các định danh. Mỗi mục ghi trong mảng symtab1e cho bảng ký hiệu là một mẫu tin gồm cĩ hai trường, trường 1exptr chỉ đến đầu từ tố và trường token. Cũng cĩ thể dùng thêm một số trường khác để lưu các giá trị thuộc tính mặc dù ở đây chúng ta khơng làm như thế.

PHẦN 2.7 KẾT HỢP VỚI BẢNG KÝ HIỆU g0

Trong Hình 2.29, mục ghi thứ zero được để trống bởi vì tookup trả về 0 để chí ra rằng khơng cĩ mục ghi nào dành cho chuỗi đang xét. Các mục ghi thứ nhất và thứ hai đành cho các từ khĩa địv và mod. Mục ghi thứ ba và thứ tư dành cho các định danh count và ải,

ARRAY symtable

1exptr token attributos

diy mod iđ id địi|v mịol|d ARRAY lexemeg

Hình 2.29. Bảng ký hiệu và mảng để lưu các chuỗi.

Đoạn mã giả cho thể phân từ vựng được dùng để xử lý các định danh được trình bày trong Hình 2.30; một cài đặt bằng C xuất hiện trong Phản 2.9. Khoảng trắng và hằng số nguyên được xử lý bởi thể phân từ vựng bằng phương thức giống như trong Hình 2.28 của phần trước,

Khi thể phân từ vựng hiện tại của chúng ta đọc một chữ cái, nĩ bắt đầu lưu các chữ cái và ký số trong vùng đệm 1exbuf£. Chuỗi được thu thập vào 1exbuf sau đĩ sẽ được tìm trong bảng ký hiệu bằng thao tác 1ookup. Bởi vì bảng ký hiệu được khởi gán với các mục ghi cho từ khĩa điv và mod như trong Hình 2,29, thao tác 1ookup sẽ thấy những mục ghi này nếu 1exbu£ chứa div hoặc mod. Nếu khơng cĩ mục ghi nào cho chuỗi đang trong Lexbu£, nghĩa là 1ookup trả về 0, thì Lexbu£ chứa một từ tố của một định danh mới. Một mục ghỉ cho định danh mới sẽ được tạo ra bằng thao tác insert. Sau khi chèn, p là chỉ mục của mục ghi trong bảng ký hiệu cho chuỗi đang trong 1exbuf£. Chỉ mục này dùng để tương tác với thể phân cú pháp bằng cách đặt tokenva1 là p, và thẻ từ trong trường token của mục ghỉ này được trả về.

Hành động mặc nhiên là trả về số nguyên mã hĩa cho ký tự làm thẻ từ. Bởi vì ở đây các thẻ từ một ký tự khơng cĩ thuộc tính, tokenval được đặt là NONE.

Một phần của tài liệu Trình biên dịch nguuyên lý kỹ thuật và công cụ (Trang 70 - 72)