MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT BƠN GIẢN

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 82 - 84)

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

80MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT BƠN GIẢN

1©okup (z) trả về chỉ mục của mục ghi trong symtable cho từ số s hoặc trả về 0 nếu sø khơng cĩ ở đĩ.

Mơ đun init.e được dùng để khởi gán các từ khĩa vào bảng ký hiệu. Biểu diễn từ tố và thẻ từ cho tất cả các từ khĩa được lưu trong mảng keywords cùng kiểu với mảng symtable. Hàm init.() đi lần lượt qua mảng keywords, sử dụng hàm insezt để đặt các từ khĩa vào bắng ký hiệu. Cách sắp đặt này cho phép chúng ta thay đổi dạng biểu điễn của các thẻ từ cho các từ khĩa một cách hết sức thuận tiện.

start => list eoŸ liẹt expr ; list

E

expr term morelcrms

moretermes +£erm { primt(Y+') } miorelerms Ắ

- >

| —term. { prim(*~")} moreterms | £

term => factor morefcfors

morefctors —» * fuctor { priml(**!?) } morefactors | /# for { prữ(*/!) 1 moreficlors | điv fuctlor { prinf(*DTV')} morefactors | modfäetor { prinf(V\MOD?) } morefaetors | e£

-— (expr )

| id { primtd.lexeme) } | _ muam_ { prinfnum.uolue) ‡ #uacior

Hình 2.38. Lược để dịch dựa cú pháp sau khi đã loại bỏ đệ qui trái.

Mơ đun lỗi error.e -

Mê đun này quản lý các ghi nhận lỗi và hết sức cần thiết. Khi gặp một lỗi cú pháp, trình biên địch in ra một thơng báo cho biết rằng một lỗi đã xảy ra trên dịng nguyên liệu hiện hành rồi ngừng. Một kỹ thuật khắc phục lỗi tốt hơn cĩ thể sẽ nhảy qua đấu chấm phẩy kế tiếp và tiếp tục phân tích; độc giả rất nên tự thực hiện các sửa đổi như thế cho chương trình địch nảy. Các kỹ thuật khắc phục lỗi phức tạp hơn được trình bày trong Chương 4.

Tạo ra trình biên địch

Đoạn mã cho các mơ đun nằm trong bảy tập tin: lexer.ec, parser.c, emitter.c, symbol.e, init.c, error.e và main.e. Tập tin main.e chứa thủ tục main trong chương trình C và nĩ gọi init(Q), rồi parse(), và hồn tất thành cơng bằng

PHÂN 2.9 KẾT NỔI CÁC KỸ THUẬT 81

Với hệ điêu hành UNIX, trình biên dịch này cĩ thể được tạo ra bằng cách gư lệnh

cœc lexer.c parser.c enitter.c symbol.e init.c error.c mạn,c

hoặc biên dịch từng tập tin riêng rẽ bằng cách dùng cc -c filename.c

rồi nối các tập tin kết quả Øiename. o:

cc lexer.o parser.o emitter.o symbol.o init.o error.o main.o

Lệnh ec tạo ra một tập tìn a. out chứa chương trình dịch. Sau đĩ chương trình dịch cĩ thể được cho chạy bằng cách gõ a. out theo sau là các biểu thức cẩn dịch, thí dụ

2+3*5;

12 dđịv 5 mod 2;

hoặc bất kỳ biểu thức nào chúng ta thích. Hãy thử xem.Š Chương trình nguồn

Dưới đây là chương trình nguồn C cài đặt chương trình dịch này. Trước tiên là tập tin tiêu để gioba1.h, sau đĩ là bảy tập tin nguồn. Để cho dễ đọc, chương trình được viết theo kiểu C cơ bản.

/xx#* global.h ***X****#*%x*w++ tk Kử ki ki t Kế tế KẾ kh / #include <stdio.h> /* tải các thủ tục xuất nhập */ (adsbygoogle = window.adsbygoogle || []).push({});

#include <etype.h> /* tải các thủ tục kiểm tra ký tự */

#define BSIZE 128 /* buffer size kích thước vùng đệm +/ #define NONE ~1 #define NONE ~1 #define FOS 'Ẻ\0! #define NƯM 256 #define DIV 257 #define MỌOD 258 #define ID 259 #define DONE 260

int tokenval; /* giá trị của thuộc tính thẻ từ +/ int lineno;

° Đây là cách địch một chương trình € trong hệ điều hành UNIX và các tập tin nguồn theo đúng bản gốc.

Để chạy được với Turbo € hoặc Microsoft ©. độc giả cĩ thể phải sửa đổi tập tin nguồn và cách dịch. Chúng tơi khơng sửa lại bản gốc và dành cho độc giả tự tìm ra cách sửa đổi. (ND)

82 MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN

struet entry { ⁄#* khuơn dạng cho mục ghi trong bảng ký hiệu */

char *lexptr; int token;

1z

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 82 - 84)