Giáo trình chương trình dịch

186 140 0
Giáo trình chương trình dịch

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC LỜI NÓI ĐẦU TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH VÀ CHƢƠNG TRÌNH DỊCH TRÌNH BIÊN DỊCH CHƢƠNG I.TỔNG QUAN 1.1 Các khái niệm liên quan 1.1.1 Trình biên dịch 1.1.2 Trình thông dịch: 1.2 Phân tích chƣơng trình nguồn 1.2.1 Phân tích từ vựng 1.2.2 Phân tích cú pháp 1.2.3 Phân tích ngữ nghĩa 1.3 Các giai đoạn trình biên dịch 1.3.1 Kỳ đầu 1.3.2 Kỳ sau CHƢƠNG II PHÂN TÍCH TỪ VỰNG 12 2.1.Vai trò phân tích từ vựng 14 2.1.1 Nhiệm vụ 14 2.1.2 Tiến trình phân tích từ vựng 15 2.1.3 Từ vị, từ tố, mẫu 16 2.1.4 Thuộc tính token 17 2.1.5 Lỗi từ vựng 17 2.2 Lƣu trữ tạm thời trƣơng trình nguồn 18 2.2.1 Cặp đệm 18 2.2.2 Khóa cầm canh 19 2.3 Tính chất nhận dạng token 20 2.3.1 Đặc tả token 20 2.3.2 Nhận dạng token 23 2.4 Các bƣớc để xây dựng phân tích từ vựng 29 2.5 Ngôn ngữ đặc tả cho phân tích từ vựng 29 2.5.1 Bộ sinh phân tích từ vựng 29 2.5.2 Ðặc tả lex 30 BÀI TẬP CHƢƠNG II- PHÂN TÍCH TỪ VỰNG 32 Trang i CHƢƠNG III PHÂN TÍCH CÚ PHÁP 33 3.1 Phƣơng pháp phân tích cú pháp 35 3.1.1 Vai trò phân tích cú pháp 35 3.1.2 Văn phạm phi ngữ cảnh 36 3.1.3 Các phƣơng pháp phân tích cú pháp 43 3.2.Các phƣơng pháp phân tích tất định 64 3.2.1 Bộ phân tích LL 64 3.2.2 Biến đổi văn phạm mơ hồ 80 3.3 Cú pháp điều khiển 84 3.3.1 Định nghĩa điều khiển dựa cú pháp 84 3.3.2 Xây dựng phân tích cú pháp 88 3.3.3 Thứ tự đánh giá thuộc tính 92 BÀI TẬP CHƢƠNG III PHÂN TÍCH CÚ PHÁP 103 CHƢƠNG IV PHÂN TÍCH NGỮ NGHĨA VÀ BẢNG DANH BIỂU 108 4.1 Các hệ thống kiểu 110 4.1.1 Biểu thức kiểu 110 4.1.2 Hệ thống kiểu 110 4.1.3 Kiểm tra kiểu tĩnh động 110 4.2 Các vấn đề kiểm tra kiểu 110 4.2.1 Đặc tả kiểm tra kiểu đơn giản 110 4.2.2 Sự tƣơng đƣơng biểu thức kiểu 112 4.2.3 Chuyển đổi kiểu 113 4.3 Bảng danh biểu 115 4.3.1 Mục đích bảng danh biểu 115 4.3.2 Các yêu cầu bảng danh biểu 115 4.3.3 Cấu trúc liệu bảng danh biểu 115 CHƢƠNG V SINH MÃ 120 5.1 Sinh mã trung gian 121 5.1.1 Các ngôn ngữ trung gian 121 5.1.2 Khai báo 127 5.1.3 Lệnh gán 131 5.1.4 Biểu thức logic 134 5.1.5 Phát biểu Case 139 5.2 Sinh mã đích 140 5.2.1 Các dạng mã đối tƣợng 140 5.2.2 Các vấn đề thiết kế sinh mã 141 Trang ii 5.2.3 Máy đích 144 5.2.4 Quản lý nhớ thời gian thực 146 5.2.5 Khối lƣu đồ 152 5.2.6 Bộ sinh mã đơn giản 158 BÀI TẬP CHƢƠNG V SINH MÃ 163 PHỤ LỤC A 165 PHỤ LỤC B 170 PHỤ LỤC C 177 TÀI LIỆU THAM KHẢO 183 Trang iii LỜI NÓI ĐẦU Trong thời kỳ đầu máy tính, chế vận hành lập trình viên chuyển từ mã nguồn sang mã máy để máy tính hiểu thực công việc Đến có nhiều ngôn ngữ lập trình tạo với trợ giúp môi trường thuận tiện để lập trình viên thiết kế ứng dụng Nội dung chương trình dịch thực việc chuyển đổi chương trình hay đoạn chương trình từ ngôn ngữ nguồn mà người hiểu sang ngôn ngữ đích (ngôn ngữ máy; mã máy) tương đương để máy tính hiểu thực hiện, việc chuyển đổi phụ thuộc hoàn toàn vào môi trường máy tính (phần cứng, hệ điều hành) Trong chương trình dịch minh họa lý thuyết ngôn ngữ hình thức Automata, kết việc nghiên cứu diễn dịch làm tảng việc hình thành tri thức loài người như: diễn giải biên dịch, thông dịch lại thông tin nguồn, ngôn ngữ nguồn (của tự nhiên, đối tượng thể tồn tại) sang ngôn ngữ mà đối tượng khác hiểu thực công việc Nội dung giáo trình giới thiệu cách tiếp cận sáu bước biên dịch ứng dụng tin học gọi chương trình dịch (Trình biên dịch) Sáu bước biên dịch là: phân tích từ vựng, phân tích cú pháp, phân tích ngữ nghĩa, sinh mã trung gian, tối ưu hóa mã trung gian, sinh mã đích Trong phần phụ lục tham khảo trình bày kiến thức liên quan mà đường dẫn phần ghi rõ Nhóm tác giả nghiên cứu từ nhiều nguồn tài liệu trình biên dịch, với mong muốn có giáo trình “Trình Biên Dịch” đáp ứng phần nhu cầu mong đợi sinh viên chuyên ngành Mặc dù nhiều cố gắng trình biên sọan hạn chế, mong nhận nhiều ý kiến đóng góp quý đồng nghiệp bạn đọc gần xa, để lần tái sau hoàn chỉnh Trang TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH VÀ CHƢƠNG TRÌNH DỊCH Nội dung chính: Chương cung cấp kiến thức giúp cho bạn đọc hiểu sáu bước biên dịch là: bước 1: phân tích từ vựng; bước 2: phân tích cú pháp; bước 3: phân tích ngữ nghĩa; bước 4: sinh mã trung gian; bước 5: tối ưu hóa mã trung gian; bước 6: sinh mã đích Mục tiêu Giúp cho bạn đọc hiểu cách thức chương trình dịch nhân dạng mã nguồn, phân tích mã nguồn, xử lý mã nguồn Nếu xử lý thành công: sinh mã đích, xử lý không thành công: thông báo lỗi Lĩnh vực ứng dụng Mô hình hóa việc xử lý thông tin đầu vào, thông tin đầu vào đối tượng ngôn ngữ nguồn Yêu cầu chung Đọc giả hiểu ngôn ngữ lập trình, cấu trúc máy tính, lý thuyết ngôn ngữ, cấu trúc liệu, phân tích thiết kế giải thuật công nghệ phần mềm TÀI LIỆU THAM KHẢO CHƢƠNG 1: [1] Dƣơng Tuấn Anh (1986), “Giáo trình trình biên dịch” - NXB Đại Học Bách Khoa TPHCM [2] Phạm Hồng Nguyên, “Giáo trình Chương trình Dịch” - NXB Đại Học Quốc Gia Hà Nội [3] Phan Thị Tƣơi (2011), “Trình Biên Dịch” - (Trường Ðại học kỹ thuật Tp.HCM) - NXB Giáo dục [4] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman - Addison - Wesley Publishing Company, 1986 [5] Compiler Design – Reinhard Wilhelm, Dieter Maurer - Addison – Wesley Publishing Company, 1996 Trang TRÌNH BIÊN DỊCH CHƢƠNG I.TỔNG QUAN 1.1 Các khái niệm liên quan 1.1.1 Trình biên dịch Trình biên dịch chương trình thực việc chuyển đổi chương trình hay đoạn chương trình từ ngôn ngữ (gọi ngôn ngữ nguồn) sang ngôn ngữ khác (gọi ngôn ngữ đích) tương đương Một phần quan trọng trình dịch ghi nhận lại lỗi có chương trình nguồn để thông báo lại cho người viết chương trình chương trình nguồn (ngôn ngữ bậc cao) Trình biên dịch chương trình đích (ngôn ngữ máy) Lỗi Hình 1.1: Sơ đồ trình biên dịch 1.1.2 Trình thông dịch: Trình thông dịch trình xử lý dạng bên chương trình nguồn liệu thời gian Trong thông dịch mã nguồn không dịch trước thành ngôn ngữ máy mà lần cần chạy chương trình mã nguồn dịch để thực thi dòng (line by line) Tất ngôn ngữ không biên dịch mã máy điều phải sử dụng trình thông dịch (PHP, WScripts, Perl, Linux Shell, Python ) Chương trình nguồn (ngôn ngữ bậc cao) Trình thông dịch Kết Dữ liệu Hình 1.2: Sơ đồ trình thông dịch Trang 1.2 Phân tích chƣơng trình nguồn 1.2.1 Phân tích từ vựng Trong trình biên dịch, giai đoạn phân tích từ vựng đọc chương trình nguồn từ trái sang phải (scanning) để tách thành thẻ từ ngữ (token) Các thẻ từ ngữ thuộc dạng dạng định nghĩa trước trình biên dịch: danh biểu, ký hiệu, số Có hai dạng danh biểu: danh biểu cài đặt sẵn (từ khóa, ví dụ Dim Visual Basic), danh biểu người dùng định nghĩa Ví dụ 1.1a: Quá trình phân tích từ vựng cho câu lệnh gán position := initial + rate * 10 tách thành token sau: Danh biểu position Danh biểu rate Ký hiệu phép gán:= Ký hiệu phép nhân (*) Danh biểu initial Số 10 Ký hiệu phép cộng (+) Trong trình phân tích từ vựng khoảng trắng (blank) bị bỏ qua Ví dụ 1.1b: Xem chương trình nguồn tạo Visual Basic 6.0 Private Sub Form_Load() Dim namtam As Integer namtam = Year(Date) MsgBox (" Xin Chao " & namtam) End Sub Với kết hiển thị tách thành token sau: Danh biểu Private Danh biểu Sub Danh biểu Form_Load Ký hiệu ( Ký hiệu ) Danh biểu Dim Trang Danh biểu namtam Danh biểu As Danh biểu Integer 10 Ký hiệu phép gán = 11 Danh biểu Year 12 Danh biểu Date 13 Danh biểu MsgBox 14 Ký hiệu “ 14 Ký hiệu ” 16 Danh biểu Xin 17 Danh biểu Chao 18 Ký hiệu & 19 Danh biểu End 20 Danh biểu Sub Trong trình phân tích từ vựng khoảng trắng (blank) bị bỏ qua Gặp Private Sub, End Sub phân tích từ vựng nhóm lại thành danh biểu cài đặt sẵn Khi đọc ký hiệu “ ; phân tích từ vựng sinh danh biểu String1 String1 lưu giử chuỗi kết thúc ký hiệu ” Đó chuỗi “Xin Chào ” có khoảng trắng Trong trình phân tích từ vựng khoảng trắng (blank) bị bỏ qua 1.2.2 Phân tích cú pháp Giai đoạn phân tích cú pháp thực công việc xem chuỗi token sinh từ văn phạm cho trước không Đó trình xây dựng phân tích cho chuỗi token Thông thường, ngữ đoạn văn phạm biểu diễn dạng phân tích cú pháp với : - Ngôn ngữ đặc tả luật sinh - Phân tích cú pháp dựa vào luật sinh để xây dựng phân tích cú pháp Ví dụ 1.2: Giả sử ngôn ngữ đặc tả luật sinh sau: Stmt → id := expr expr → expr + expr | expr * expr | id | number Với câu nhập: position := initial + rate * 10, phân tích cú pháp xây dựng sau : Trang id Stmt | := position expr expr + expr | | id expr * expr | | | initial id number | | rate 10 Hình 1.3 - Cây phân tích cú pháp Ví dụ 1.3: 1) Danh biểu (identifier) biểu thức (expr) 2) Số (number) biểu thức 3) Nếu expr1 expr2 biểu thức thì: expr1+ xpr2, expr1* xpr2, (expr) xem biểu thức Câu lệnh (statement) định nghĩa đệ qui : 1) Nếu id1 danh biểu expr2 biểu thức id1 := expr2 lệnh (stmt) 2) Nếu expr1 biểu thức stmt2 lệnh while (expr1) stmt2 if (expr1) then stmt2 lệnh Người ta dùng qui tắc đệ qui để đặc tả luật sinh (production) cho ngôn ngữ Sự phân chia trình phân tích từ vựng phân tích cú pháp tùy theo công việc thực 1.2.3 Phân tích ngữ nghĩa Giai đoạn phân tích ngữ nghĩa thực việc kiểm tra xem chương trình nguồn có chứa lỗi ngữ nghĩa hay không tập hợp thông tin kiểu cho giai đoạn sinh mã sau Một phần quan trọng giai đoạn phân tích ngữ nghĩa kiểm tra kiểu ép chuyển đổi kiểu Ví dụ 1.4: Trong biểu thức position := initial + rate * 10 Các danh biểu (tên biến) khai báo real, 10 số integer trình biên dịch đổi số nguyên 10 thành số thực 10.0 Trang := := position + initial thành position initial * rate + 10 * rate inttoreal 10.0 Hình 1.4 - Chuyển đổi kiểu phân tích cú pháp 1.3 Các giai đoạn trình biên dịch Ðể dễ hình dung, trình biên dịch chia thành giai đoạn, giai đoạn chuyển chương trình nguồn từ dạng biểu diễn sang dạng biểu diễn khác Một cách phân rã điển hình trình biên dịch trình bày hình sau Chương trình nguồn Phân tích từ vựng Quản Phân tích cú pháp lý Xử Phân tích ngữ nghĩa bảng ký lý lỗi Sinh mã trung gian hiệu Tối ưu mã trung gian Sinh mã đích Chương trình đích Hình 1.5 - Các giai đoạn trình biên dịch Trang biểu diễn trạng thái “chấp nhận” accepter Ngược lại, ký hiệu đọc vào ký số, automat chuyển sang trạng thái trạng thái “không chấp nhận” accepter giữ trạng thái (định danh không hợp lệ) Ở giả thiết ký hiệu nhập vào ký tự ký số Trình biên dịch máy chuyển dịch chương trình từ ngôn ngữ tới ngôn ngữ khác dùng ý tưởng trình bày ví dụ Ngôn ngữ lập trình định nghĩa cách xác thông qua văn phạm Trang 169 PHỤ LỤC B NGÔN NGỮ LẬP TRÌNH VÀ CHƢƠNG TRÌNH DỊCH B.1 Các mức khác ngôn ngữ lập trình Để cho máy tính thực thuật toán, cần phải viết thuật toán dạng dòng "lệnh" theo quy ước mà máy tính thực cách trực tiếp viết dạng để sinh tự động dạng mà máy tính thực trực tiếp Tập kí hiệu quy tắc viết lệnh để thể thuật toán gọi ngôn ngữ lập trình (programming language) Các quy tắc để viết chương trình gọi cú pháp (syntax) ngôn ngữ lập trình Mỗi chương trình mang ý nghĩa định mà ta gọi ngữ nghĩa (semantic) chương trình Có nhiều lớp ngôn ngữ lập trình khác Theo mức độ hình thức hoá, người ta chia ngôn ngữ lập trình thành lớp sau: Ngôn ngữ máy Chương trình ngôn ngữ máy dãy lệnh máy mà CPU thực trực tiếp Đó ngôn ngữ lập trình mà máy tính "hiểu được" Trong thang bậc ngôn ngữ giao tiếp với máy tính, mức thấp hiệu chương trình cao ta khai thác triệt để khả máy Tuỳ theo thiết kế phần cứng, loại máy tính có ngôn ngữ máy khác Các lệnh viết ngôn ngữ máy nói chung dạng nhị phân biến thể chúng hệ đếm 16 Ví dụ sau đoạn chương trình viết ngôn ngữ máy máy tính dùng vi xử lý Intel 8086 Trang 170 Bảng B.1 Ngôn ngữ máy Mã hệ nhị phân Mã hệ 16 Ý nghĩa 1001 0001 0110 0100 0001 0000 A1 64 10 Nạp số byte từ 1064 lên AX 0000 0011 0110 0110 0001 0000 03 65 10 Cộng AX với số byte 1066 kết để AX 1010 0011 0000 0000 0010 1011 A3 00 2B Chuyển kết từ AX hai byte 2B00 Đoạn chương trình cộng hai số nguyên hai byte địa 1064 1066 Kết để hai byte địa 2B00 Cột đầu dòng lệnh hệ 16, cột dòng lệnh tương đương hệ nhị phân (chính hình ảnh thực chương trình nhớ) cột bên phải giải thích AX tên ghi 16 bít vi xử lý 8086 Qua ví dụ trên, ta thấy ngôn ngữ máy không thật thích hợp cho số đông người sử dụng máy tính để viết hiểu chương trình, người ta phải nhớ máy móc mã số lệnh mà dòng số hàm ý rõ ràng Mặt khác tập lệnh xử lý khác nên dùng chương trình viết xử lý chạy máy tính dùng xử lý khác loại Hợp ngữ (Assembly) Để khắc phục nhược điểm ngôn ngữ máy, người ta đề xuất ngôn ngữ giao tiếp với máy mức độ hình thức gọi hợp ngữ Về bản, hợp ngữ có cấu trúc giống với ngôn ngữ máy Điều khác hợp ngữ viết lệnh dạng mã chữ Mã chữ thể mã lệnh đối tượng lệnh (trong ngôn ngữ máy mã lệnh địa đối tượng) Mã lệnh dạng chữ thường từ tiếng Anh có ý nghĩa rõ ràng, đối tượng ta tự đặt tên phù hợp với ý niệm đối tượng Ví dụ đoạn chương trình dùng để cộng chiều dài chiều rộng hình chữ nhật để tính nửa chu vi hợp ngữ ASM ta cần viết Trang 171 Bảng B.2 Chương trình viết Assembly MOV AX CHIEU_DAI ADD AX CHIEU_RONG MOV NUA_CHU_VI AX Từ MOV có gốc từ từ MOVE tiếng Anh, có nghĩa chuyển, từ ADD có nghĩa cộng Lệnh thứ có nghĩa nạp số liệu mà ta đặt tên CHIEU_DAI lên ghi AX, lệnh thứ hai có nghĩa cộng số ghi AX với số liệu mà ta đặt tên CHIEU_RONG Ta thấy cồng kềnh phụ thuộc vào loại máy tính cụ thể, hợp ngữ dễ dùng nhiều so với ngôn ngữ máy Để chương trình viết hợp ngữ chạy máy tính, cần phải dịch ngôn ngữ máy Rõ ràng là, hợp ngữ dùng cho loại máy cần có trình dịch phù hợp Khi dịch, hai đối tượng CHIEU_DAI CHIEU_RONG nói tự động thay hai địa cụ thể không thiết 1064 1066 ví dụ Vì ta không cần phải quan tâm đến xếp địa cụ thể sau dịch xong chạy chương trình Chương trình dịch hợp ngữ gọi hợp dịch (assembler) Ngôn ngữ thuật toán (còn gọi ngôn ngữ thuật toán) Ta thấy ngôn ngữ máy hợp ngữ phụ thuộc vào hệ thống lệnh loại máy cụ thể Chúng chưa thật thích hợp cho đông đảo người sử dụng máy tính Người ta muốn thể thuật toán lệnh với ý nghĩa thực tế độc lập với loại máy cụ thể Chẳng hạn ví dụ cần viết NUA_CHU_VI = CHIEU_DAI + CHIEU_RONG đủ Từ đầu năm 50, người ta xây dựng ngôn ngữ lập trình vạn có lệnh gần với ngôn ngữ tự nhiên ngôn ngữ toán học Các ngôn ngữ lập trình gọi ngôn ngữ lập trình bậc cao (high level programming language) Vì chúng nhằm vào thể thuật toán độc lập với máy tính cụ thể nên người ta gọi ngôn ngữ thuật toán (algorithmic language) Cũng hợp ngữ, ngôn ngữ lập trình bậc cao loại máy cụ thể cần có chương trình dịch để dịch chương trình sang sang ngôn ngữ máy máy thực Trang 172 Chú ý lệnh hợp ngữ nói chung dịch thành lệnh ngôn ngữ máy lệnh ngôn ngữ bậc cao thường tương đương với nhiều lệnh máy Ví dụ lệnh NUA_CHU_VI = CHIEU_DAI + CHIEU_RONG dịch thành lệnh máy Có hai kiểu dịch: thông dịch (Interpeter) kiểu dịch lệnh để hiểu công việc phải làm thực không thiết phải tạo đoạn mã tương ứng ngôn ngữ máy Nếu lệnh cần thực nhiều lần phải dịch nhiều lần Ngôn ngữ BASIC thịnh hành vào năm 80 thường theo chế độ thông dịch Còn trình biên dịch (compiler) dịch toàn chương trình ban đầu (gọi chương trình nguồn) thành chương trình tương ứng ngôn ngữ máy (gọi chương trình đích), sau nạp chương trình đích vào máy tính để thực Sở dĩ tiếng Việt gọi hai kiểu dịch "thông dịch' "biên dịch" tính chất dịch có phần giống với dịch tiếng nước Thông dịch giống công việc người phiên dịch (thông ngôn), nói tới đâu dịch tới Còn biên dịch công việc người biên dịch, tài liệu đầy đủ, ta viết lần dịch đầy đủ Ngôn ngữ bậc cao xây dựng vào năm 1957 ngôn ngữ FORTRAN (FORmula TRANslator - Bộ dịch công thức) Ngày có nhiều ngôn ngữ lập trình bậc cao PASCAL hay C Sau đoạn chương trình giải phương trình bậc viết PASCAL FORTRAN Bạn đọc dù chưa có chút ý niệm ngôn ngữ hiểu đoạn chương trình sau nói Bảng B.3 Chương trình viết Pascal (*Đoạn chương trình PASCAL*) DELTA := B*B - 4*A*C; IF DELTA > THEN BEGIN X1 := (- B + SQRT(DELTA))/(2*A); X2 := (- B - SQRT(DELTA))/(2*A); WRITE (X1,X2); END Trang 173 ELSE WRITE('Vo nghiem'); Sau đoạn chương trình viết ngôn ngữ FORTRAN Theo quy ước, chương trình FORTRAN viết giấy mẫu có 80 cột Từ cột đến cột dành cho nhãn toán tử, từ cột đến 72 dành cho toán tử Các lệnh in phải kèm với thông tin cách in (ví dụ kênh để nối máy in nhãn toán tử FORMAT giải thích cách in, ví dụ F8.3 in số thực vị trí dành cho phần lẻ sau dấu phảy vị trí) Bảng B.4 Chương trình viết FORTRAN IV 72 73 80 DELTA = B*B - 4* A*C IF DELTA < GOTO 10 X1 = (- B + SQRT(DELTA))/(2*A) X2 = (- B - SQRT(DELTA))/(2*A) WRITE (3,20) X1, X2 20 FORMAT ('NGHIEM 1= ', F8.3, NGHIEM = ', F8.3) GOTO 30 10 WRITE(3,40) 40 FORMAT('VO NGHIEM') 30 Qua ví dụ ta thấy ngôn ngữ thuật toán dễ sử dụng nhiều so với hợp ngữ ngôn ngữ máy Ngày người phải sử dụng hợp ngữ ngôn ngữ máy để phát triển phần mềm B.2 Quá trình thực chƣơng trình với ngôn ngữ bậc cao Cần nhắc lại MTĐT làm việc trực tiếp với ngôn ngữ máy Việc dịch chương trình viết ngôn ngữ bậc cao sang ngôn ngữ máy chương trình dịch (compiler) thực Chương trình dịch loại phần mềm thuộc lớp công cụ Quá trình tạo chương trình thực bao gồm bước sau: Trang 174 Soạn thảo chương trình nguồn Có thể dùng phần mềm soạn thảo văn để tạo văn chương trình nguồn Phân tích từ vựng (Lexical Analysis) phân tích cú pháp (Syntax Analysis) Phân tích từ vựng để xây dựng danh sách đối tượng chương trình Phân tích cú pháp có mục đích duyệt chương trình nguồn để phát thông báo lỗi không với quy ước ngôn ngữ Các lỗi làm cho nghĩa chương trình không rõ dịch Ví dụ ngôn ngũ PASCAL ta viết dòng lệnh d := (a+ b)/e-f)+g Khi đọc đến dấu ngoặc đóng thứ sau f, ta không hiểu nguời viết muốn tính đương nhiên dịch Lý làm cho dòng lệnh không rõ nghĩa thiếu dấu ngoặc "(" phía trước, trước chữ e, trước chữ a Những lỗi sai với quy ước ngôn ngữ gọi lỗi cú pháp Quá trình phân tích cú pháp tạo thông tin cần thiết cấu trúc chương trình đối tượng dùng công việc dịch mô ta Trong trình phân tích cú pháp, danh mục đối tượng xây dựng để sinh mã chương trình giai đoạn Công việc gọi phân tích từ vựng Dịch (Compile) Nếu chương trình nguồn lỗi cú pháp việc dịch lệnh máy tiến hành Thông thường việc phân tích cú pháp dịch thường tiến hành xen kẽ Kết sau giai đoạn dịch đoạn chương trình gọi mô đun đối tượng (object module) Nói chung mô đun đối tượng chưa đủ hoàn chỉnh để thi hành Sau dịch tối ưu mã Một đoạn chương trình sau dịch chuyển tải ý đồ thuật giải chưa đối ưu Công đoạn tối ưu hoá giúp tạo mã hiệu Liên kết (Link) Trên thực tế, chương trình có nhiều phần dịch cách độc lập Ngoài nhiều công việc thường dùng lập trình sẵn lưu thư viện dạng mô đun đối tượng Người lập trình cần viết yêu cầu sử dụng Ví dụ PASCAL viết y := + sin(x) đoạn chương trình tính sin lập sẵn từ trước dạng mô đun đối tượng ghép vào chương trình đích Như sau dịch để có chương trình hoàn chỉnh cần phải liên kết các mô đun đối tượng lại với Quá trình ghép nối đoạn chương trình người sử dụng đoạn chương trình khác lập từ trước gọi Trang 175 hợp liên kết (link) Quá trình gặp lỗi ví dụ không tìm thấy đoạn chương trình yêu cầu nối vào cấu trúc kết nối không phù hợp, ví dụ mô đun A thông báo chuyển cho mô đun B liệu ký tự trong mô đun B lại yêu cầu nhận mọt số Thực (run) Sau liên kết, ta chương trình sẵn sàng thi hành máy Trong trình thi hành máy có lỗi gọi lỗi thi hành (runtime error) Lỗi thi hành có nguyên nhân từ thuật toán , có nguyên nhân ta xác ý nghĩa không kiểm soát trình sinh biến đổi đối tượng Các lỗi gọi lỗi ngữ nghĩa (semantic) Ví dụ dòng lệnh ngôn ngữ PASCAL a: = x/y nghĩa a tính thương x y không sai cú pháp thực y gây lỗi ngữ nghĩa Lỗi thi hành có nguyên nhân tình trạng xử lý cụ thể máy Ví dụ chương trình đòi in máy in không bật điện ghi đĩa đĩa bị hỏng Sơ đồ thực công việc sử dụng hợp ngữ ngôn ngữ bậc cao minh hoạ hình B.1.Ta thấy dịch hay chương trình liên kết loại phần mềm phát triển Hình B.1 Sơ đồ thực công việc sử dụng hợp ngữ ngôn ngữ bậc cao Trang 176 PHỤ LỤC C THUẬT NGỮ TIẾNG ANH VÀ CHỮ VIẾT TẮT Abstract machine  máy tính trừu tƣợng Activation record  bảng ghi hoạt động Activation tree  hoạt động Actual parameter  thông số thực Adjacency  phƣơng pháp truyền hàm Annotated parse tree  phân tích thích Array  mảng Assembler  hợp ngữ Assembly code  mã hợp ngữ Assembly language  hợp ngữ Attribute propagation  truyền thuộc tính Augment grammar  văn phạm Back end  thời kỳ sau Balanced construct  cấu trúc cân Basic block  khối Binary search  tìm kiếm nhị phân Blank  ký tự rỗng BNF(Backus-Naur Form)  ký pháp BNF Trang 177 Bottom –up  từ dƣới lên Buffer pair  cặp đệm Coercion  áp đặt toán tử Compiler time  thời gian dịch Compiler  trình biên dịch CFG  văn phạm phi ngữ cảnh Dag  đồ thị có hƣớng không lặp vòng Depth – first order  thứ tự đánh giá Depth – first traversals  chu trình theo chiều sâu Desciptor  đặc tả DFA  Automat hữu hạn tất định Display  bảng tầm vực dynamic link  đƣờng liên kết động edge  cạnh embedded  đƣợc nhúng false  sai flow graph  lƣu đồ formal parameter  thông số hình thức frame  khung front end  thời kỳ trƣớc Trang 178 function  hàm grouping of phases  nhóm giai đoạn hash coding  mã hóa băm hashing symbol table  bảng danh biểu băm hashing function  hàm băm higher – level language  ngôn ngữ cấp cao LALR(LookAhead LR)  phƣơng pháp LR nhìn trƣớc ký tự nhập Lexeme beginning pointer  trỏ ký tự đầu trị từ vựng Lexical analysis  phân tích từ vựng Lexical unit  đơn vị từ vựng Loop  vòng lặp Machine language  ngôn ngữ máy Macro processing  xử lý macro NFA  Automat hữu hạn không tất định Other  khác Parse- tree method  phƣơng pháp phân tích Parsing tree  phân tích Pattern  mẫu PNC  văn phạm phi ngữ cảnh Pointer  trỏ Trang 179 Postfix expression  toán tử sau toán hạng Postfix notation  ký hiệu hậu tố Program segment  đoạn chƣơng trình Programming  lập trình Record  ghi Scope  tầm vực Source language  ngôn ngữ nguồn Stack  kiểu chồng State  trạng thái Symbol table  bảng danh biểu Syntactic tree  cú pháp Syntax-directed  trực tiếp cú pháp Target machine  máy đích Terminal symbol  ký hiệu kết thúc Topdown  từ xuống Translation  biên dịch Yacc  sinh phân tích cú pháp  tên (bắt đầu chữ dấu gạch ident_token dƣới, theo sau chữ cái, chữ số dấu gạch dƣới) Trang 180 num_token comment_token  số nguyên  thích (chú thích kiểu C – cặp /* comment */) begin_token  từ khóa begin end_token  từ khóa end int_token  từ khóa kiểu int var_token  từ khóa var (khai báo biến) procedure_token  từ khóa procedure (khai báo thủ tục) call_token  từ khóa call (gọi thủ tục) read_token  từ khóa read (đọc từ bàn phím) write_token  từ khóa write (viết hình) if_token  từ khóa if then_token  từ khóa then else_token  từ khóa else fi_token  từ khóa fi (kết thúc if) while_token  từ khóa while do_token  từ khóa od_token  từ khóa od (kết thúc do) negate_token  toán tử neg absolute_token  toán tử abs Trang 181 open_token  dấu mở ngoặc close_token  dấu đóng ngoặc list_token  dấu phẩy period_token  dấu chấm separator_token  dấu chấm phẩy becomes_token  dấu gán (=) plus_token  dấu cộng (+) minus_token  dấu trừ (-) times_token  dấu nhân (*) over_token  dấu chia (/) modulo_token  dấu lấy phần dƣ (%) equal_token  dấu (==) not_equal_token  dấu khác (!=) less_than_token  dấu nhỏ (=) Trang 182 TÀI LIỆU THAM KHẢO Tiếng Việt [1] Dƣơng Tuấn Anh (1986), “Giáo trình trình biên dịch” - NXB Đại Học Bách Khoa TPHCM [2] Nguyễn Văn Ba (1993), “Thực hành kỹ thuật biên dịch” - NXB Đại Học Bách Khoa Hà Nội [3] Phạm Hồng Nguyên, “Giáo trình Chương trình Dịch” - NXB Đại Học Quốc Gia Hà Nội [4] Hồ văn Quân (2002), “Giáo trình Automat ngôn ngữ hình thức” - Nhà xuất Đại học Quốc gia TP.HCM [5] Nguyễn Thị Thanh Tâm (2004), “Nghiên cứu phân tích cứu pháp phương pháp xác suất ứng dụng cho phân tích cú pháp câu đơn giản tiếng Anh” - Luận văn thạc sỹ trường ĐHQGTPHCM [6] Phan Thị Tƣơi (2011), “Trình Biên Dịch” - (Trường Ðại học kỹ thuật Tp.HCM) NXB Giáo dục [7] Nguyễn Văn Linh (2003), “Trình biên dịch” - Khoa CNTT trường Đại học Cần Thơ [8] Nguyễn Văn Định “Bài giảng Lý thuyết Automat ngôn ngữ hình thức” - Khoa CNTT trường ĐHSPKT – TP.HCM Tiếng Anh [1] Automata and Formal Language An Introduction – Dean Kelley – Prentice Hall, Englewood Cliffs, New Jersey 07632 [2] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman - Addison - Wesley Publishing Company, 1986 [3] Compiler Design – Reinhard Wilhelm, Dieter Maurer - Addison - Wesley Publishing Company, 1996 [4] Design of Compilers : Techniques of Programming Language Translation - Karen A Lemone - CRC Press, Inc, 1992 [5] Modern Compiler Implementation in C - Andrew W Appel - Cambridge University Press, 1997 Trang 183 ... Company, 1996 Trang TRÌNH BIÊN DỊCH CHƢƠNG I.TỔNG QUAN 1.1 Các khái niệm liên quan 1.1.1 Trình biên dịch Trình biên dịch chương trình thực việc chuyển đổi chương trình hay đoạn chương trình từ ngôn... Một phần quan trọng trình dịch ghi nhận lại lỗi có chương trình nguồn để thông báo lại cho người viết chương trình chương trình nguồn (ngôn ngữ bậc cao) Trình biên dịch chương trình đích (ngôn ngữ... trình biên dịch 1.1.2 Trình thông dịch: Trình thông dịch trình xử lý dạng bên chương trình nguồn liệu thời gian Trong thông dịch mã nguồn không dịch trước thành ngôn ngữ máy mà lần cần chạy chương

Ngày đăng: 03/05/2017, 21:29

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan