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

Một phần của tài liệu Lập trình biên dịch nguyên lý kỹ thuật và công cụ (Trang 33 - 34)

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

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

chứa các ký số (digit) được phân cách bởi các dấu cộng và trừ sang dạng hậu vị. Khi những ý tưởng cơ bản đã trở nên rõ ràng hơn, chúng ta sẽ mở rộng chương trình, cho phép xử lý nhiều kết cấu (construct) tổng quát hơn của các ngơn ngữ lập trình. Mỗi chương trình dịch (translator) của chúng ta được tạo ra bằng cách mở rộng cĩ hệ thống chương trình địch trước đĩ.

Trong trình biên dịch của chúng ta, thể phân tích từ uựng (lexical annalyzer) hay nĩi gọn là thể phân từ uựng sẽ biến đổi dịng ký tự nhập (nguyên liệu) thành dịng các thả từ (token), là nguyên liệu (input) cho giai đoạn kế tiếp như được trình bày trong Hình 2.1. Chương trình dịch dựa cú pháp (syntax-directed translator) trong hình này là tổ hợp của ¿hể phân cú pháp (svntax analyzer) và thể sùth mã trung gian (interme- diate-code generator), Một lý do để khởi sự với các biểu thức chứa ký số và các tốn tử đĩ là cơng việc phân tích từ vựng rất dễ; mỗi ký tự nguyên liệu tạo ra một thẻ từ duy nhất. Về sau chúng ta sẽ mở rộng ngơn ngữ, đưa cả các kết cấu từ vựng vào, chẳng hạn như các số, định danh (identifier) và tử khĩa (keyword). Đối với ngơn ngữ mở rộng này chúng ta sẽ xây dựng một thể phân từ vựng lo tập hợp các ký tự nguyên liệu kế cận nhau ứng với các thế từ thích hớp. Việc xây đựng thể phân từ vựng sẽ được thảo luận chỉ tiết trong Chương 3

đồng thể phân ; địng chương trình dịch đạng biểu điển

ký tự từ vựng thẻ từ đựa cú pháp trung gian

Hình 2.1. Cấu trúc kỳ đầu của trình biên dịch.

9.2 ĐỊNH NGHĨA CÚ PHÁP

Trong phần này chúng ta giới thiệu một hệ ký pháp cĩ tên gọi là udn phạm: phí ngữ cảnh (context-free grammar) hoặc nĩi gọn là ốn phạm: (grammiar), được dùng để xác định cú pháp của một ngơn ngữ. Văn phạm này sẽ được sử dụng trong suốt cuốn sách để đặc tả kỳ đầu của một trình biên dịch.

Một văn phạm thường mơ tả cấu trúc phân cấp của nhiều &ế? cấu (construet) của các ngơn ngữ lập trình. Chẳng hạn câu lệnh if-else trong C cĩ dạng

iŸ ( expression ) statement else statement

PHẪN 2.2 ĐỊNH NGHÌA CÚ PHÁP 31

sion), một dấu ngoặc đĩng, một cơu lậnh (statement), từ khĩa else và một câu lệnh khác. (Trong C khơng cĩ từ khĩa then). Nếu sử dụng biến expz để biểu thị cho một biểu thức và biến sứ để biểu thị cho một câu lệnh, qui tắc này cĩ thể được diễn tả như sau

gímt — iŸ_ ( cxpr ) stmt eÌse sim (231)

trong đĩ mũi tên cĩ thể được đọc là "cĩ thể cĩ dạng." Một qui tắc như thế được gọi là một lướt sinh (production). Trong một luật sinh, một thành phần từ vựng như từ khĩa if và các dấu ngoặc được gọi là các ¿»¿ tử (token). Các biến như expr và sứmt biểu thị chuỗi các thẻ từ và được gọi là các ký hiệu chưa tận hoặc nĩi gọn là chưa tận (nonter- mnina]).

Một oăn phạm phi ngữ cảnh cĩ bốn thành phần:

1. Một tập các thẻ từ, được xem là các šý hiệu tận hay nĩi gọn là Zán (terminal), 2. Một tập các chưa tận (nonterminal).

8. Một tập luật sinh, trong đĩ mỗi luật sinh bao gồm một chưa tận, được gọi là nế trái của luật sinh, một mũi tên, và một chuỗi các thẻ từ và/hoặc các chưa tận, là uế phát của luật. sinh.

4. Một ký hiệu khởi đầu, đĩ là một chưa tận.

Chúng ta tuân theo qui ước đặc tả văn phạm bằng cách liệt kê các luật sinh, trước tiên là các luật sinh cho ký hiệu khởi đầu. Chúng ta giả sử rằng các ký số (digit), các đấu (sign) như <=, và chuỗi in đậm như wbile là các tận. Một tên in nghiêng là chưa tận và mọi tên hoặc ký hiệu khơng in nghiêng đều được giả thiết là một thẻ từ.! Để tiện ghi chép, các luật sinh cĩ cùng chưa tận ở vế trái sẽ được nhĩm lại thành một ở vẽ phải, trong đĩ mỗi vế phải được phản cách bởi một gạch đứng | và được đọc là “hoặc”.

Thí dụ 3.1. Nhiều thí dụ trong chương này sử dụng các biểu thức chứa các ký số và các dấu cộng, trừ, thí dụ, 9-5+2, 3-1, và 7. Bởi vì dấu cộng hoặc dấu trừ phải xuất hiện giữa hai ký số, chúng ta sẽ xem những biểu thức như thế là "các danh sách (list) ký số được phân cách bởi các dấu cộng hoặc trừ." Văn phạm sau đây mơ tả cú pháp của những biểu thức này. Các luật sinh là:

lẹt —x» Hit + digtt (2.2›

list ~» list — digt (2.3)

list —> digit (24)

dịgt 1 0|1|2|314|5|6)7|819 (2.5)

Một phần của tài liệu Lập trình biên dịch nguyên lý kỹ thuật và công cụ (Trang 33 - 34)

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

(134 trang)