intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Trình biên dịch: Chương 1, 2, 3 - TS. Vũ Đức Lung

Chia sẻ: Ngocnga Ngocnga | Ngày: | Loại File: PDF | Số trang:0

186
lượt xem
12
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Chương 1, 2, 3 của bài giảng Trình biên dịch cung cấp cho người học những nội dung sau: Giới thiệu về trình biên dịch, cú pháp và ngữ nghĩa của trình biên dịch, trình biên dịch đơn giản. Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Trình biên dịch: Chương 1, 2, 3 - TS. Vũ Đức Lung

  1. 05/04/2012 TRÌNH BIÊN DỊCH MỤC ĐÍCH & NỘI DUNG (COMPILER)  Môn học Trình biên dịch hay còn gọi là Chương trình dịch  Thời gian: sẽ giới thiệu những nguyên tắc và kỹ thuật cơ bản để cài đặt - Lý Thuyết: 45 tiết (3 TC) một trình biên dịch.  Điểm số:  Những kiến thức này sẽ giúp hiểu được cơ cấu và cách vận - Điểm chuyên cần: 10% hành trong các trình biên dịch của các ngôn ngữ lập trình - Điểm báo cáo: 40% thông dụng như Pascal, C, C++ và Java, nhờ đó hiểu thấu - Điểm thi cuối kỳ: 50% đáo hơn về các ngôn ngữ này, giúp nâng cao kỹ năng lập trình và gỡ lỗi chương trình.  Khoa Kỹ thuật máy tính  GV: TS. Vũ Đức Lung  Email: lungvd@uit.edu.vn Khoa KTMT Vũ Đức Lung 1 Khoa KTMT Vũ Đức Lung 2 CHƯƠNG 1: TÀI LIỆU THAM KHẢO GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1. Phan Thị Tươi. Giáo trình Trình biên dịch, nhà xuất bản đại 1. Ngôn ngữ lập trình: học quốc gia tp HCM, 2009. 1.1 Giới thiệu: 2. Aho, Sethi, and Ullman [1986]. Compilers: Principles,  Con người muốn máy tính thực hiện công việc, phải viết các Techniques, and Tools, Addison-Wesley, Reading Mass., yêu cầu đưa cho máy bằng ngôn ngữ máy hiểu được. 1986. (Bản dịch tiếng Việt gồm hai tập với tựa đề: Trình  Việc viết các yêu cầu ta gọi là lập trình biên dịch: Nguyên lý, Kỹ thuật và Công cụ, nhà xuất bản Thống kê, 2000-2001).  Ngôn ngữ dùng để lập trình được gọi là ngôn ngữ lập trình 3. Cao Hoàng Trụ. Ngôn ngữ lập trình-Các nguyên lý và mô hình. Nhà xuất bản ĐHQG tp.HCM, 2004. Khoa KTMT Vũ Đức Lung 3 Khoa KTMT Vũ Đức Lung 4 GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.2 Phân loại: 1.4 Phiên dịch (translation):  Ngôn ngữ máy.  Quá trình biến đổi một chương trình được viết bằng một 10110011010010010011010110110001 ngôn ngữ (ngôn ngữ nguồn) thành một chương trình tương  Hợp ngữ. đương nhưng được diễn tả bằng một ngôn ngữ khác (ngôn • MOV r0, B ; move B into register r0 ngữ đích). • ADD r0, C ; add • MOV A, r0 ; store  Ngôn ngữ đích thường là ngôn ngữ máy.  Ngôn ngữ cấp cao.  Có hai dạng phiên dịch: Biên dịch (compilation) và Thông A := B + C dịch (interpretation): 1.3 Chương trình:  Chương trình chịu trách nhiệm dịch từ một ngôn ngữ này  Tập hợp các yêu cầu được sắp đặt hợp lý để máy thực hiện. sang một ngôn ngữ khác được gọi chung là chương trình  Các yêu cầu có thể được diễn tả bằng nhiều ngôn ngữ khác nhau, thế dịch (translator) và có thể được chia thành hai loại: Trình nhưng máy tính chỉ hiểu được một ngôn ngữ duy nhất: ngôn ngữ biên dịch (compiler) và Trình thông dịch (interpreter). máy (machine language). Khoa KTMT Vũ Đức Lung 5 Khoa KTMT Vũ Đức Lung 6 1
  2. 05/04/2012 GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.4.1 Biên dịch (compilation):  Trình biên dịch, còn gọi là phần mềm biên dịch, compiler,  Chương trình nguồn được ghi trong các tập tin rồi được dịch thành là một chương trình máy tính làm công việc dịch một chuỗi chương trình đích và được ghi lại trong các tập tin. các câu lệnh được viết bằng một ngôn ngữ lập trình (gọi là  Sau đó chúng ta có thể cho chương trình chạy bằng cách "mở" tập tin ngôn ngữ nguồn hay mã nguồn), thành một chương trình chứa chương trình đích ra. tương đương nhưng ở dưới dạng một ngôn ngữ máy tính mới  Công việc này tương tự như công việc của một chuyên gia dịch thuật khi thực hiện dịch một văn bản (tác phẩm văn học, tài liệu kỹ thuật). (gọi là ngôn ngữ đích) và thường là ngôn ngữ ở cấp thấp hơn, như ngôn ngữ máy.  Chương trình mới được dịch gọi mã đối tượng  Chương trình đích có thể được thi hành trực tiếp bởi một máy tính hay bởi một máy ảo Khoa KTMT Vũ Đức Lung 7 Khoa KTMT Vũ Đức Lung 8 GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.4.2 Thông dịch (interpretation): Biên dịch và thông dịch  Chương trình nguồn được dịch rồi cho thực hiện ngay mà không ghi lại bản dịch. Chương trình Compiler Chương trình nguồn đích  Công việc này tương tự như công việc của một thông dịch viên. Input Chương trình đích Output Chương trình Interpreter Output nguồn Input Khoa KTMT Vũ Đức Lung 9 Khoa KTMT Vũ Đức Lung 10 GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.5. Đặc Đặc tả ngôn ng ngữữ lập trì trình nh  Cú pháp và Ngữ nghĩa Tối thiểu cần định nghĩa:  Cú pháp: sự kết hợp của các ký hiệu (dạng của biểu thức, các 1. Tập các ký hiệu cần dùng trong các chương trình hợp lệ phát biểu, các đơn vị nhỏ trong chương trình) 2. Tập các chương trình hợp lệ  Ngữ nghĩa: ý nghĩa của các kết hợp 3. Nghĩa của chương trình hợp lệ Các phương pháp xác định nghĩa của CT hợp lệ: - Phương pháp thứ nhất là định nghĩa bằng phép ánh xạ. Sử dụng phép toán hàm: hàm Lamda. - Phương pháp thứ hai: Máy trừu tượng. - Phương pháp thứ ba: Tập (x,y) là sự biên dịch,x là CT nguồn, y là đích. Khoa KTMT Vũ Đức Lung 11 Khoa KTMT Vũ Đức Lung 12 2
  3. 05/04/2012 TRÌNH BIÊN DỊCH TRÌNH BIÊN DỊCH 1. Các thành phần của trình biên dịch: 1.2 Bảng danh biểu 1.1 Phân tích từ vựng: Ví dụ: COST := (PRICE + TAX) * 65 Nhận dạng token. Token: danh biểu, hằng, từ khóa, các toán tử phép toán, các ký hiệu phân cách, khoảng trắng, các ký hiệu đặc biệt Ví dụ: COST := ( PRICE + TAX )*65 Đầu ra của bộ phân tích từ vựng: () := ( () + () ) * (,4) Viết gọn: id1 := (id2 + id3) * num4 Bảng danh biểu Khoa KTMT Vũ Đức Lung 13 Khoa KTMT Vũ Đức Lung 14 TRÌNH BIÊN DỊCH TRÌNH BIÊN DỊCH 1.3 Phát hiện và thông báo lỗi 1.5 Phân tích ngữ nghĩa: 1.4 Phân tích cú pháp Vídụ: COST := (PRICE + TAX) * 65 Kết quả phân tích từ vựng: id1 := ( id2 + id3 )* num4 Kết quả phân tích cú pháp: Cây cú pháp của phát biểu Cây cú pháp có xử lý ngữ nghĩa Khoa KTMT Vũ Đức Lung 15 Khoa KTMT Vũ Đức Lung 16 TRÌNH BIÊN DỊCH TRÌNH BIÊN DỊCH 1.6 Sinh mã trung gian: 1.8 Sinh mã đối tượng: temp1:= intoreal(65) movF id2, R1 temp2:= id2+ id3 movF id3, R2 temp3:= temp2* temp1 addF R2, R1 id1:= temp3 multF# 65.0, R1 1.7 Tối ưu mã trung gian: movF R1, id1 temp1:= id2+ id3 id1:= temp1 * 65 Khoa KTMT Vũ Đức Lung 17 Khoa KTMT Vũ Đức Lung 18 3
  4. 05/04/2012 TRÌNH BIÊN DỊCH TRÌNH BIÊN DỊCH Tổng hợp quá trình biên dịch Khoa KTMT Vũ Đức Lung 19 Khoa KTMT Vũ Đức Lung 20 CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 1. Bộ tiền xử lý: 2. Trình biên dịch hợp ngữ:  Xử lý macro (macro processing) Phát biểu gán b := a + 2 được dịch ra mã hợp ngữ  Chêm tập tin (file inclusion) LOAD a, R1  Bộ xử lý hoà hợp (rational processor) ADD #2 , R1  Mở rộng ngôn ngữ (language extension) STORE R1, b Khoa KTMT Vũ Đức Lung 21 Khoa KTMT Vũ Đức Lung 22 CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 3. Trình biên dịch hợp ngữ hai chuyến: 4. Bộ cất liên kết soạn thảo: Chuyến thứ nhất: đọc mã hợp ngữ và tạo bảng danh biểu Loader là chương trình thực hiện hai nhiệm vụ: cất và soạn thảo liên kết. Quá trình cất bao gồm lấy mã máy khả định vị tính lại thành địa chỉ tuyệt đối. Danh biểu Điạ chỉ tương đối Như ở ví dụ phần 3: Giả sử mã máy được cất trong bộ nhớ trong tại địa a 0 chỉ L = 00001111 => địa chỉ tuyệt đối của a, b là 00001111 và b 4 00010011. Chuyến thứ hai: đọc mã hợp ngữ và dịch sang mã máy khả định vị địa chỉ: Ba chỉ thị (1.6) được viết lại dưới dạng mã máy tuyệt đối: LOAD a, R1 0001 01 00 00000000 * 0001 01 00 00001111 0011 01 10 00000010 (1.7) ADD #2, R1 0010 01 10 00000010 (1.6) 0010 01 00 00010011 STORE R1, b 0100 01 00 00000100 * Link-editor cho phép tạo một chương trình duy nhất từ nhiều tập tin ở dạng mã máy khả định vị của những lần biên dịch riêng biệt và từ các tập tin thư viện do hệ thống cung cấp. Khoa KTMT Vũ Đức Lung 23 Khoa KTMT Vũ Đức Lung 24 4
  5. 05/04/2012 CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH  Hệ thống xử lý ngôn ngữ 5. Nhóm các giai đoạn của trình biên dịch  Giai đoạn trước và giai đoạn sau(front end and back end)  Các chuyến  Thu giảm số lượng các chuyến Thídụ: goto L : goto L : L:a=b+c Khoa KTMT Vũ Đức Lung 25 Khoa KTMT Vũ Đức Lung 26 Lợi ích của của ngôn ngữ trung gian Lợi ích dùng CIL  Tương tác giữa các ngôn ngữ lập trình: http:// lhu.edu.vn 27 http:// lhu.edu.vn 28 BÀI TẬP  Tìm hiểu thêm về các Tool cho phép xây dựng các Compiler – ANTLR – Lex, Yacc 5
  6. 05/04/2012 Chương 2 : Cú pháp và ngữ nghĩa Nội dung:  Các khái niệm cơ bản TRÌNH BIÊN DỊCH  Đặc tả hình thức (Formal description) (COMPILER)  Đặc tả từ vựng  Biểu thức chính quy  Đặc tả cú pháp hình thức  Khoa Kỹ thuật máy tính  TS. Vũ Đức Lung  Email: lungvd@uit.edu.vn Khoa KTMT - UIT TS. Vũ Đức Lung 1 Khoa KTMT - UIT TS. Vũ Đức Lung 2 Đặc tả hình thức Các khái niệm cơ bản (Formal description)  NNLT = Ký hiệu + qui tắc kết hợp  Đặc tả hình thức cung cấp một mô tả chính xác về một ngôn  Cú pháp: sự kết hợp của các ký hiệu (dạng của biểu thức, các ngữ lập trình(nnlt) phát biểu, các đơn vị nhỏ trong chương trình)  Ngữ nghĩa: ý nghĩa của các kết hợp Đặc tả NNLT  Ngữ dụng: Mối quan hệ của L (cú pháp+ngữ nghĩa) với thế giới bên ngoài  Ví dụ 1: – BT1 = 4 BT2 = 1 + 3 BT3 = 1 + 1 + 1 +1 Chương trình Bộ dịch  VD 2: vòng lặp WHILE và REPEAT trong Pascal  VD 3: Số lượng tối đa các phần tử mảng array phụ thuộc – Kích thước kiểu dữ liệu – Dung lượng bộ nhớ Khoa KTMT - UIT TS. Vũ Đức Lung 3 Khoa KTMT - UIT TS. Vũ Đức Lung 4 Đặc tả hình thức Đặc tả từ vựng  Ngôn ngữ là tập hợp chuỗi các ký tự từ alphabet (A…Z, a…z,  Đặc tả hình thức cho phép: $ @ 0 …9, + - = …. – Người học có thể tiếp thu nnlt dễ dàng – Bộ dịch có thể sinh mã đúng đắn  Sự kết hợp một số ký tự trong alphabet → từ vựng – Bộ dịch có thể kiểm tra lỗi tự động – VD: BEGIN – Có thể chứng minh được tính đúng đắn của chương trình  Token là một dạng của lexeme Lexemes Tokens  Đặc tả hình thức: – VD: index = 2*count + 17; Index Identifier – Từ vựng = Equal_sign – Văn phạm (cú pháp) Tokens tương tự như loại từ trong ngôn ngữ học. 2 Int_literal Tương tự như danh từ hay tính từ, động từ, tokens * Mult_op – Ngữ nghĩa sẽ được định nghĩa gồm từ khóa (keyword), định Count Identifier danh (identifier), số nguyên, số chấm động tùy + Plus_op theo đặc điểm của trình biên dịch 17 Int_literal ; semicolon Khoa KTMT - UIT TS. Vũ Đức Lung 5 Khoa KTMT - UIT TS. Vũ Đức Lung 6 1
  7. 05/04/2012 Ngôn ngữ Ngôn ngữ  Chuỗi và ngôn ngữ Ví dụ: L = {A, B, ..., Z, a, b, ..., z } và – Tập hợp các ký tự Σ D = { 0, 1, , ..., 9 } – Một chuỗi S trên Σ là 1 dãy hữu hạn các ký tự thuộc Σ 1. L ∪ D là tập hợp các chữ cái và chữ số – Chuỗi rỗng ∈ 2. LD là tập hợp các xâu bao gồm một chữ cái và một chữ số – Một ngôn ngữ L trên Σ là tập hợp các chuỗi trên Σ 3. L4 là tập hợp tất cả các xâu 4 chữ cái  Tác vụ trên ngôn ngữ 4. L * là tâp hợp tất cả các xâu của các chữ cái bao gồm cả chuỗi rỗng – Hợp: L1 ∪ L2 5. L(L ∪ D)* là tập hợp tất cả các xâu mở đầu bằng một chữ cái theo sau là chữ cái hay chữ số – Kết nối: L1 L2 6. D+ là tập hợp tất cả các xâu gồm một hoặc nhiều chữ số Khoa KTMT - UIT TS. Vũ Đức Lung 7 Khoa KTMT - UIT TS. Vũ Đức Lung 8 Định nghĩa chính qui Biểu thức chính quy (regular expression) (regular definition)  Một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc  Để thuận tiện về mặt kí hiệu, ta dùng định nghĩa chính qui cú pháp nhất định (ĐNCQ) để đặt tên cho các BTCQ  Có thể hiểu như là 1 ngôn ngữ nhỏ dùng cho mục đích : để tìm  Một ĐNCQ là một dãy các định nghĩa có dạng chuỗi con trong biểu thức chuỗi lớn d1 → r1  Microsoft cho nó vào Windows trong namespace .NET : d2 → r 2 System.Text.RegularExpressions ......... VD: email dn → r n – /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/ Trong đó di là các tên, ri là các BTCQ trên tập các kí hiệu – Tìm hiểu các biểu thức chính qui trong RegularExpressionValidator trong Validation Control trong ASP.NET? Σ∪{d1, d2, ....di-1} Khoa KTMT - UIT TS. Vũ Đức Lung 9 Khoa KTMT - UIT TS. Vũ Đức Lung 10 Biểu thức chính quy Biểu thức chính quy  Ví dụ: ĐNCQ cho tập số không dấu được viết lại như sau  Để biểu diễn các tokens, người ta dùng biểu thức chính quy digit → 0 | 1 |...| 9 a : có xuất hiện ký tự 'a' digits → digit + ab : có xuất hiện ký tự 'b' theo sau ký tự 'a' (theo đúng thứ tự) optional_fraction → (. digits) ? a|b : có 'a' hoặc có 'b' optional_exponent → ( E ( + | - ) ? digits) ? a* : xuất hiện nhiều hoặc không xuất hiện ký tự 'a' num → digits optional_fraction optional_exponent a+ : xuất hiện nhiều hoặc ít nhất là một ký tự 'a'  Sử dụng các tập kí tự [abc]=a | b | c, [a-z]=a | b |..z ta có thể đặc tả (a)+ == a(a)* các định danh bởi BTCQ a3 : xuất hiện 3 ký tự a [A - Z a - z] [A - Z a - z 0 - 9]* a? : xuất hiện a hoặc không xuất hiện (a)? = a | ∈  VD: biểu diễn số nguyên: digits = '0' | '1' | '2' | '3' | '4 | '5' | '6' | '7' | '8' | '9' integer = '−'?(digits)+ Khoa KTMT - UIT TS. Vũ Đức Lung 11 Khoa KTMT - UIT TS. Vũ Đức Lung 12 2
  8. 05/04/2012 Biểu thức chính quy Biểu thức chính quy  Biểu thức chính qui r diễn tả ngôn ngữ L(r) Ví dụ: Cho Σ= { a, b}. – ∈⇒ {∈} 1. BTCQ a | b đặc tả {a, b} –a∈Σ ⇒ {a} 2. BTCQ (a | b) (a | b) đặc tả {aa, ab, ba, bb}.Tập hợp này có  Giả sử r và s lần lượt diễn tả ngôn ngữ L(r) và L(s) thì thể được đặc tả bởi BTCQ tương đương sau: aa | ab | ba | bb – (r) | (s) ⇒ L(r) ∪ L(s) 3. BTCQ a* đặc tả {ε, a, aa, aaa, ... } – (r)(s) ⇒ L(r)L(s) 4. BTCQ (a | b)* đặc tả {a, b, aa,bb, ...}. Tập hợp này có thể đặc tả bởi (a*b* )* – (r)* ⇒ (L(r))* 5. BTCQ a | a* b đặc tả {a, b, ab, aab,... } – (r) ⇒ L(r) Khoa KTMT - UIT TS. Vũ Đức Lung 13 Khoa KTMT - UIT TS. Vũ Đức Lung 14 Đặc tả cú pháp hình thức (Formal methods of Describing Syntax) Ví dụ: ĐNCQ của các định danh trong pascal là  Cú pháp trừu tượng (Abstract syntax) letter → A | B | ...| Z | a | b |...| z digit → 0 | 1 | ...| 9  Cú pháp cụ thể (concrete syntax) id → letter (letter | digit)* – Văn phạm phi ngữ cảnh (context-free grammar) Ví dụ: ĐNCQ của các số không dấu trong pascal như 3254, – BNF (Backus-Naur Form) 23.243E5,16.264E-3... là  Sơ đồ cú pháp (Syntax diagrams) digit → 0 | 1 |...| 9  Chuỗi dẫn xuất và Cây phân tích (Derivations and parse digits → digit digit* trees) optional_fraction → (. digits)?  Sự nhập nhằng (Ambiguity) optional_exponent → ( E ( + | - )? digits)?  Tính kết hợp của toán tử (Associativity of Operator) num → digits optional_fraction optional_exponent  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 15 Khoa KTMT - UIT TS. Vũ Đức Lung 16 Cú pháp trừu tượng Cú pháp trừu tượng  Phân các yếu tố ngôn ngữ • Ưu điểm: đơn giản thành các lớp văn phạm • Khuyết điểm: (Syntactic class)  Không có định nghĩa ký tự kết thúc  Có thể xảy ra hiện tượng nhập nhằng  Liệt kê tất cả các dạng (Syntactic form) của mỗi lớp  Ví dụ: – Lớp cú pháp: C Hằng (constant) I Định danh (Identifier) O Toán tử (operator) E Biểu thức (expression) – Dạng cú pháp: E ::= I | C | E O E | ( E ) Khoa KTMT - UIT TS. Vũ Đức Lung 17 Khoa KTMT - UIT TS. Vũ Đức Lung 18 3
  9. 05/04/2012 Đặc tả cú pháp hình thức Văn phạm phi ngữ cảnh (Formal methods of Describing Syntax) Context-Free Grammars Context-  Cú pháp trừu tượng (Abstract syntax)  1956-1959, Chomsky  Là một bộ gồm 4 thành phần:  Cú pháp cụ thể (concrete syntax)  Ký hiệu bắt đầu S ∈ N(Start symbol) – Văn phạm phi ngữ cảnh (context-free grammar) – BNF (Backus-Naur Form)  Tập các ký hiệu không kết thúc N (Non-terminals)  Sơ đồ cú pháp (Syntax diagrams)  Tập các ký hiệu kết thúc Σ (Terminals)  Chuỗi dẫn xuất và Cây phân tích (Derivations and parse  Tập các luật sinh (Production) có dạng: A → α trees) Với A ∈ N và α là chuỗi các ký hiệu kết thúc và không kết thúc  Sự nhập nhằng (Ambiguity)  Tính kết hợp của toán tử (Associativity of Operator)  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 19 Khoa KTMT - UIT TS. Vũ Đức Lung 20 Ví dụ số nguyên không dấu BNF (Backus- (Backus-Naur Form) (Unsigned Integers)  1959, John Backus giới thiệu ALGOL 58 thuộc nhóm ACM-GAMM  1960 Peter Naur cho ra phiên bản mới ALGOL 60  BNF là một ký hiệu tự nhiên mô tả cú pháp, là một siêu • Ký hiệu bắt đầu ngôn ngữ mô tả ngôn ngữ khác • Ký hiệu không kết thúc ,  Rất gần với văn phạm phi ngữ cảnh • Ký hiệu kết thúc 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 • Luật VD: → | ::= | Khoa KTMT - UIT TS. Vũ Đức Lung 21 Khoa KTMT - UIT TS. Vũ Đức Lung 22 BNF (Backus- (Backus-Naur Form) Ví vụ một biểu thức  Start symbol  left-hand side (LHS)  Non-terminals , , ,  right-hand side (RHS) , ,  Có thể có nhiều RHS  Terminals 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -, *, / VD: -> | begin end  Productions:  Danh sách cú pháp ( Syntactic lists) dùng đệ qui → | -> ident | ident, → | → | () → + | − → ∗ | / Khoa KTMT - UIT TS. Vũ Đức Lung 23 Khoa KTMT - UIT TS. Vũ Đức Lung 24 4
  10. 05/04/2012 Đặc tả cú pháp hình thức Sơ đồ cú pháp (Formal methods of Describing Syntax) (Syntax Diagrams) Sơ đồ cú pháp của biểu thức  Cú pháp trừu tượng (Abstract syntax) exp  Cú pháp cụ thể (concrete syntax) term – Văn phạm phi ngữ cảnh (context-free grammar) – BNF (Backus-Naur Form)  Sơ đồ cú pháp (Syntax diagrams)  Chuỗi dẫn xuất và Cây phân tích (Derivations and parse trees) exp term_op term  Sự nhập nhằng (Ambiguity)  Tính kết hợp của toán tử (Associativity of Operator)  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 25 Khoa KTMT - UIT TS. Vũ Đức Lung 26 Đặc tả cú pháp hình thức Chuỗi dẫn xuất (Formal methods of Describing Syntax) (Derivations) Chuỗi dẫn xuất của biểu thức: 32*5 + 8  Cú pháp trừu tượng (Abstract syntax)  Cú pháp cụ thể (concrete syntax) ⇒ – Văn phạm phi ngữ cảnh (context-free grammar) ⇒ + – BNF (Backus-Naur Form) ⇒ +  Sơ đồ cú pháp (Syntax diagrams) ⇒ * + 8  Chuỗi dẫn xuất và Cây phân tích (Derivations and ⇒ * 5 + 8 parse trees) ⇒ 32 * 5 + 8  Sự nhập nhằng (Ambiguity)  Tính kết hợp của toán tử (Associativity of Operator)  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 27 Khoa KTMT - UIT TS. Vũ Đức Lung 28 Cây phân tích cú pháp Cây cú pháp (Parse Trees) (Parse Trees) + Cây cú pháp + * * 32 5 8 12 3 4 Khoa KTMT - UIT TS. Vũ Đức Lung 29 Khoa KTMT - UIT TS. Vũ Đức Lung 30 5
  11. 05/04/2012 Đặc tả cú pháp hình thức Sự nhập nhằng (Formal methods of Describing Syntax) (Ambiguity)  Cú pháp trừu tượng (Abstract syntax)  Văn phạm cho câu lệnh gán đơn giản → =  Cú pháp cụ thể (concrete syntax) → A|B|C – Văn phạm phi ngữ cảnh (context-free grammar) → + | * | () | – BNF (Backus-Naur Form)  VD biểu thức gán: A = B * (A + C) có chuỗi dẫn xuất cực tả:  Sơ đồ cú pháp (Syntax diagrams)  Chuỗi dẫn xuất và Cây phân tích (Derivations and parse trees)  Sự nhập nhằng (Ambiguity)  Tính kết hợp của toán tử (Associativity of Operator)  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 31 Khoa KTMT - UIT TS. Vũ Đức Lung 32 Sự nhập nhằng Sự nhập nhằng (Ambiguity) (Ambiguity)  Văn phạm cho câu lệnh gán đơn giản (mở rộng VD trước) → = → A|B|C → + | * | () |  Là một văn phạm nhập nhằng vì A = B + C * A có 2 cây cú pháp Khoa KTMT - UIT TS. Vũ Đức Lung 33 Khoa KTMT - UIT TS. Vũ Đức Lung 34 Sự nhập nhằng Đặc tả cú pháp hình thức (Ambiguity) (Formal methods of Describing Syntax)  Văn phạm không nhập nhằng cho câu lệnh gán đơn giản  Cú pháp trừu tượng (Abstract syntax) → = → A|B|C  Cú pháp cụ thể (concrete syntax) → + | term – Văn phạm phi ngữ cảnh (context-free grammar) → * | factor – BNF (Backus-Naur Form) → () |  Sơ đồ cú pháp (Syntax diagrams)  Sử dụng toán tử ưu tiên (operator precedence)  Chuỗi dẫn xuất và Cây phân tích (Derivations and parse  VD tìm chuỗi dẫn xuất và cây cú pháp cho biểu thức : trees) A=B+C*A  Sự nhập nhằng (Ambiguity)  Tính kết hợp của toán tử (Associativity of Operator)  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 35 Khoa KTMT - UIT TS. Vũ Đức Lung 36 6
  12. 05/04/2012 Tính kết hợp của toán tử Đặc tả cú pháp hình thức (Associativity of Operator) (Formal methods of Describing Syntax)  Đối với các toán tử có cùng mức độ ưu tiên  Cú pháp trừu tượng (Abstract syntax)  VD: A = B + C + A  Cú pháp cụ thể (concrete syntax) – Biến là số nguyên: không có sự khác biệt – Văn phạm phi ngữ cảnh (context-free grammar) – Biến là số chấm động: có khác biệt, ví dụ số chấm động dùng độ chính xác 7 bit (1 bit trước dấu phẩy và 6 bit sau dấu phẩy) – BNF (Backus-Naur Form) 107 + 1 + … + 1 = ?  Sơ đồ cú pháp (Syntax diagrams) 10  Chuỗi dẫn xuất và Cây phân tích (Derivations and parse – (107 + 1) + 1 + … = ? trees) – 1 + 1 + … + 107 = ?  Sự nhập nhằng (Ambiguity)  Tính kết hợp của toán tử (Associativity of Operator)  BNF mở rộng (Extended BNF) Khoa KTMT - UIT TS. Vũ Đức Lung 37 Khoa KTMT - UIT TS. Vũ Đức Lung 38 BNF mở rộng (Extended BNF) BNF vs EBNF  Không làm tăng khả năng đặc tả của BNF, chỉ là cách biểu BNF: diễn gọn hơn -> + 1. Phần lựa chọn được đặt vào trong dấu [] | - -> if () [else )] | -> * 2. Đặt những phần tương tự trong RHS vào trong () và ngăn | / cách bởi | | -> (+ | -) const 3. Đặt những phần lập lại trong {} EBNF: -> letter {letter | digit} -> {(+ | -) }  -> {(* | /) } Khoa KTMT - UIT TS. Vũ Đức Lung 39 Khoa KTMT - UIT TS. Vũ Đức Lung 40 Ngữ nghĩa hình thức (Formal Semantics)  Đặc tả ngữ nghĩa hình thức cho phép: – Chứng minh tính đúng đắn của chương trình – Kiểm tra tính đúng đắn của chương trình dịch  Các phương pháp đặc tả: BÀI TẬP  Ngữ nghĩa tác vụ (Operational semantics)  Ngữ nghĩa tiên đề (Axiomatic semantics)  Ngữ nghĩa biểu thị (Denotational semantics) Khoa KTMT - UIT TS. Vũ Đức Lung 41 Khoa KTMT - UIT TS. Vũ Đức Lung 42 7
  13. 05/04/2012 Ngữ nghĩa hình thức Yêu cầu (Formal Semantics)  Đầy đủ  Đặc tả ngữ nghĩa hình thức cho phép: Mọi chương trình đúng và dừng thì phải có ngữ – Chứng minh tính đúng đắn của chương trình nghĩa phù hợp được cho bởi các luật  Nhất quán – Kiểm tra tính đúng đắn của chương trình dịch Cùng một chương trình không thể cho nhiều ngữ  Các phương pháp đặc tả: nghĩa khác nhau và mâu thuẫn  Ngữ nghĩa tác vụ (Operational semantics)  Không phụ thuộc  Ngữ nghĩa tiên đề (Axiomatic semantics) Không có luật nào có thể dẫn xuất từ một luật khác  Ngữ nghĩa biểu thị (Denotational semantics) Khoa KTMT - UIT TS. Vũ Đức Lung 43 Khoa KTMT - UIT TS. Vũ Đức Lung 44 Ngữ nghĩa tác vụ (Operational Semantics) Ngữ nghĩa tác vụ  Ý tưởng: đặc tả ý nghĩa một chương trình khi thực thi từng câu  Dùng ngữ nghĩa tác vụ để đặc tả ngữ nghĩa một ngôn ngữ lập trình L cần: lệnh trên máy tính (máy thật hoặc mô phỏng) – Bộ chuyển đổi (translator) đổi L thành ngôn ngữ cấp thấp – Máy ảo cho ngôn ngữ cấp thấp  Sự thay đổi trạng thái của máy tính cho ta ý nghĩa của câu lệnh  VD:  Dựa vào một máy ảo mà tập các tác vụ của nó đã được định Ngôn ngữ C: Ngữ nghĩa tác vụ: nghĩa chính xác for ( expr1; expr2; expr3 ) expr1;  Ngữ nghĩa của mỗi phần tử chương trình được đặc tả bằng 1 { Loop: if expr2 == 0 goto out tập các tác vụ của máy ảo } … Expr3; goto Loop; out:… Khoa KTMT - UIT TS. Vũ Đức Lung 45 Khoa KTMT - UIT TS. Vũ Đức Lung 46 Ngữ nghĩa hình thức Ngữ nghĩa tiên đề (Axiomatic semantics) (Formal Semantics)  Đặc tả ngữ nghĩa hình thức cho phép: • Ý nghĩa của chương trình được xác định bởi tập hợp – Chứng minh tính đúng đắn của chương trình các quy tắc làm thay đổi dữ liệu sau khi thực hiện một phép toán nào đó của ngôn ngữ lập trình. – Kiểm tra tính đúng đắn của chương trình dịch • NNTĐ dùng để chứng minh các tính chất của chương  Các phương pháp đặc tả: trình  Ngữ nghĩa tác vụ (Operational semantics) • Tác dụng của một phát biểu (statement) được định  Ngữ nghĩa tiên đề (Axiomatic semantics) nghĩa thông qua tiền diều kiện (precondition) và hậu điều kiện (postcondition).  Ngữ nghĩa biểu thị (Denotational semantics) • Tập hợp các tiên đề và luật cho định nghĩa tác dụng của chương trình. Khoa KTMT - UIT TS. Vũ Đức Lung 47 Khoa KTMT - UIT TS. Vũ Đức Lung 48 8
  14. 05/04/2012 Ngữ nghĩa tiên đề Ngữ nghĩa tiên đề  Ký hiệu NNTĐ thông thường: {P} S {Q} {P} S {Q} • x = E, Q – hậu đk Tiền ĐK Phát biểu Hậu ĐK • Tiên đề: P = Qx→E • VD: a = b/2 – 1 {a < 10} => P={b 1}  Nhiều sách ghi: một tiền đk có thể: {b > 10} {Px→E} x := E {P} Tiền đk yếu nhất: {b > 0}  ωp(S,Q) với Q là biến số có thể xem là ngữ nghĩa chính xác của S  VD: x = 2*y – 3 {x>25} => {y>14} Khoa KTMT - UIT TS. Vũ Đức Lung 49 Khoa KTMT - UIT TS. Vũ Đức Lung 50 Ngữ nghĩa tiên đề Ngữ nghĩa tiên đề Chứng minh tính đúng của chương trình  HỆ LUẬT HOARE L1: Nếu {P} S {Q} ∧ (Q ⇒ R) thì {P} S {R} VD: {x > 3} x := x - 3 {x > 0} L2: Nếu {P} S {Q} ∧ (R ⇒ P) thì {R} S {Q} E=x-3 L3: {Qx→E} x := E {Q} Q=x>0 VD1: CM tính đúng: {x > 5} x := x - 3 {x > 0} ? Qx→E = x - 3 > 0 = x > 3 VD2: CM tính đúng của đặc tả: {f=i!} i:=i+1 {f*i=i!} Trong trường hợp {x > 5} x := x - 3 {x > 0} ? VD3: CM tính đúng của đặc tả: {f*i=i!} f:=f*i {f=i!} Khoa KTMT - UIT TS. Vũ Đức Lung 51 Khoa KTMT - UIT TS. Vũ Đức Lung 52 Ngữ nghĩa tiên đề Ngữ nghĩa tiên đề  HỆ LUẬT HOARE  HỆ LUẬT HOARE L4: luật phát biểu ghép (sequences) if ({P} S1 {Q}) ∧ ({Q} S2 {R}) then {P} S1 ; S2 {R} VD4: CM tính đúng của đặc tả: {f=i!} i:=i+1, f = f*i {f = i!} Với ¬B = NOT B CM: theo vd 2 & 3 VD4: CM tính đúng của đặc tả: {xyy then max:=x else max:=y {max>0} CM: theo L3 & L2 Khoa KTMT - UIT TS. Vũ Đức Lung 53 Khoa KTMT - UIT TS. Vũ Đức Lung 54 9
  15. 05/04/2012 Chứng minh chương trình Ngữ nghĩa tiên đề (Program Proofs)  HỆ LUẬT HOARE VD4: CM tính đúng của đặc tả: {f=i!} while i # n do begin i:=i+1; f:=f*I end {f=n!}  VD: Chứng minh tính ñúng của chương trình CM: { x = A AND y = B} t = x; x = y; y = t; {x = B AND y = A} Khoa KTMT - UIT TS. Vũ Đức Lung 55 Khoa KTMT - UIT TS. Vũ Đức Lung 56 Ngữ nghĩa hình thức Ngữ nghĩa biểu thị (Denotational semantics) (Formal Semantics)  Đặc tả ngữ nghĩa hình thức cho phép:  Trên cơ sở lý thuyết hàm đệ qui  Phương pháp đặc tả ngữ nghĩa trừ tượng nhất – Chứng minh tính đúng đắn của chương trình  Phiên bản gốc được phát triển bởi Scott và Strachey (1970) – Kiểm tra tính đúng đắn của chương trình dịch  Tiến trình xây dựng đặc tính biểu thị cho một ngôn ngữ:  Các phương pháp đặc tả: 1. định nghĩa các đối tượng toán học cho mỗi thực thể ngôn ngữ  Ngữ nghĩa tác vụ (Operational semantics) 2. Định nghĩa hàm ánh xạ mỗi thể hiện của thực thể đến thể hiện của đối tượng toán học tương ứng  Ngữ nghĩa tiên đề (Axiomatic semantics)  Mỗi cấu trúc chương trình là một hàm ánh xạ đầu vào đến đầu ra  Ngữ nghĩa biểu thị (Denotational semantics)  Một chương trình là sự hợp thành của nhiều hàm  Sự khác nhau giữa ngữ nghĩa tác vụ và ngữ nghĩa biểu thị: Trong NN tác vụ trạng thái thay đổi bởi thuật toán, còn trong NN biểu thị NN được định nghĩa là các hàm toán học chính xác Khoa KTMT - UIT TS. Vũ Đức Lung 57 Khoa KTMT - UIT TS. Vũ Đức Lung 58 Ngữ nghĩa biểu thị Ngữ nghĩa biểu thị  VD cấu trúc ngôn ngữ số nhị phân.  Ngữ nghĩa biểu thị của các ký tự số thập phân – Cú pháp: → 0 | 1 | 0 | 1 – Để biểu thị ý nghĩa của số nhị phân sử dụng ngữ nghĩa biểu thị và cú → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 pháp trên sử dụng hàm ngữ nghĩa: | (0 | 1 | 2 | 3 | 4 | • Mbin(‘0’) = 0 5 | 6 | 7 | 8 | 9) • Mbin(‘1’) = 1 Mdec('0') = 0, Mdec ('1') = 1, …, Mdec ('9') = 9 • Mbin( ‘0’) = 2* Mbin() Mdec ( '0') = 10 * Mdec () • Mbin( ‘1’) = 2* Mbin() + 1 Mdec ( '1’) = 10 * Mdec () + 1 Cây phân tích số 110 và ngữ nghĩa biểu thị của nó? … Mdec ( '9') = 10 * Mdec () + 9 Khoa KTMT - UIT TS. Vũ Đức Lung 59 Khoa KTMT - UIT TS. Vũ Đức Lung 60 10
  16. 05/04/2012 BÀI TẬP Khoa KTMT - UIT TS. Vũ Đức Lung 61 11
  17. 05/04/2012 CHƯƠNG 3:TRÌNH BIÊN DỊCH ĐƠN GIẢ GIẢN N Nội dung:  Định nghĩa cú pháp TRÌNH BIÊN DỊCH  Cây phân tích  Biên dịch điều khiển bởi cú pháp (COMPILER)  Lược đồ dịch  Phân tích cú pháp • Phân tích cú pháp từ trên xuống • Sự phân tích cú pháp đoán nhận trước  Khoa Kỹ thuật máy tính  Sự phân tích từ vựng  TS. Vũ Đức Lung  Thiết kế trình biên dịch đơn giản  Email: lungvd@uit.edu.vn FCE-UIT TS. Vũ Đức Lung 1 FCE-UIT TS. Vũ Đức Lung 2 Tổng quát Định nghĩa cú pháp  Cấu trúc trình biên dịch “Front end”  Ta dùng văn phạm phi ngữ cảnh để miêu tả cú pháp cho ngôn ngữ.  Văn phạm phi ngữ cảnh (PNC) được định nghĩa: G = (Vt, Vn, S, P) P : A -> α1| α 2|………| α n  Ví dụ 1: Cho văn phạm G: P: list -> list + digit |list –digit |digit digit ->0 |1|2 |…|9 FCE-UIT TS. Vũ Đức Lung 3 FCE-UIT TS. Vũ Đức Lung 4 Định nghĩa cú pháp Cây phân tích  Ví dụ 2: Văn phạm miêu tả phát biểu hỗn hợp begin end của Pascal 1. Gốc là ký hiệu mục tiêu S. P : block -> begin opt_stmts end 2. Mỗi lá là token hay ký hiệu rỗng €. opt_stmts-> stmt_list |€ 3. Mỗi nút không phải là nút cuối của cây là ký hiệu stmt_list -> stmt_list ; stmt |stmt không kết thúc. 4. Nếu A là nhãn của nút không phải là nút cuối, X1, X2, …Xn là nhãn các con của nút có nhãn Atừ trái sang phải thì A-> X1X2…Xn là luật sinh thuộc tập luật sinh P. FCE-UIT TS. Vũ Đức Lung 5 FCE-UIT TS. Vũ Đức Lung 6 1
  18. 05/04/2012 Cây phân tích Sự kết hợp của các toán tử  Mức ưu tiên của các toán tử: * và / có mức ưu tiên hơn + , -. Dựa vào nguyên tắc trên chúng ta xây dựng cú pháp cho biểu thức số học: exp -> exp + term |exp – term |term term -> term * factor |term / factor |factor factor -> digit |( exp )  Lưu ý: phép toán lũy thừa và phép gán trong C là phép toán kết hợp phải. Văn phạm cho phép gán như sau: assign -> letter = right |letter right-> right|letter letter -> a |b |…|z FCE-UIT TS. Vũ Đức Lung 7 FCE-UIT TS. Vũ Đức Lung 8 Biên dị dịch ch điề điều khiể khiển b bở ởi cú pháp pháp Syntax--Directed Translation Syntax Biên dị dịch ch điề điều khiể khiển b bởởi cú pháp pháp  Dùng: dịch các cấu trúc ngôn ngữ lập trình 2. Định nghĩa trực tiếp cú pháp (Syntax-directed definition)  Phần tử: kết hợp giữa thuộc tính & các thành phần cú pháp Văn phạm phi ngữ cảnh và tập luật ngữ nghĩa sẽ thiết lập định  Biểu thức số học: Infix expression, postfix expression nghĩa trực tiếp cú pháp. Biên dịch là phép ánh xạ từ nhập →  Ký hiệu hậu tố (postfix notation): xuất. Dạng xuất của chuỗi nhập x được xác định như sau: 1) Nếu E là biến hoặc hằng số thì ký hiệu hậu tố của E chính là E. 1. Xây dựng cây phân tích cho chuỗi x. 2) Nếu E là biểu thức có dạng E1 op E2 với op là toán tử hai ngôi thì 2. Giả sử nút n của cây phân tích có tên cú pháp X, X.a biểu ký hiệu hậu tố của E là E1’E2’ op. thị giá trị thuộc tính a của X tại nút n. X.a được tính nhờ 3) Nếu E là biểu thức có dạng (E1) thì ký hiệu hậu tố của E1 cũng là luật ngữ nghĩa. Cây phân tích có chú thích các trị thuộc tính ký hiệu hậu tố của E. ở mỗi nút được gọi là cây phân tích chú thích (annotated Lưu ý: Không cần có dấu đóng, mở ngoặc trong ký hiệu parse tree) hậu tố. FCE-UIT TS. Vũ Đức Lung 9 FCE-UIT TS. Vũ Đức Lung 10 Biên dị dịch ch điề điều khiể khiển b bởởi cú pháp pháp Biên dị dịch ch điề điều khiể khiển b bở ởi cú pháp pháp Tổng hợp thuộc tính (synthesized attributes) Ví dụ 4: cây phân tích chú thích câu 9 – 5 + 2 Ví dụ 3. Cho văn phạm G có tập luật sinh P: FCE-UIT TS. Vũ Đức Lung 11 FCE-UIT TS. Vũ Đức Lung 12 2
  19. 05/04/2012 Lược đồ dịch Lược đồ dịch  Lược đồ dịch là văn phạm PNC, trong đó các đoạn chương Ví dụ 6: Lược đồ dịch cho câu 9 – 5 + 2 trình gọi là hành vi ngữ nghĩa được nhúng vào vế phải của luật sinh.  Ví dụ 5:. Lược đồ dịch của văn phạm G: FCE-UIT TS. Vũ Đức Lung 13 FCE-UIT TS. Vũ Đức Lung 14 Giải thuật duyệt theo chiều sâu (depth-first traversals) của cây phân tích (depth- Phân tích cú pháp Procedure visit (n: node); Phân tích cú pháp từ trên xuống begin  Ví dụ 7. Cho văn phạm G: type -> simple |↑id| array [simple] of type For với mỗi con m của n, từ trái sang phải do simple -> integer|char|num dotdot num visit (m);  Hãy xây dựng cây phân tích cho câu: Tính trị ngữ nghiã tại nút n array [num dotdot num] of integer end; FCE-UIT TS. Vũ Đức Lung 15 FCE-UIT TS. Vũ Đức Lung 16 Xây dựng cây phân tích cho câu Sự phân tích cú pháp đoán nhận trước  Dạng đặc biệt của phân tích cú pháp từ trên xuống là phương pháp đoán nhận trước. Phương pháp này sẽ nhìn trước một ký hiệu nhập để quyết định chọn thủ tục cho ký hiệu không kết thúc tương ứng.  Thí dụ 8. Cho văn phạm G: P: S -> xA A -> z |yA  Dùng văn phạm G để phân tích câu nhập xyyz FCE-UIT TS. Vũ Đức Lung 17 FCE-UIT TS. Vũ Đức Lung 18 3
  20. 05/04/2012 Sự phân tích cú pháp đoán nhận trước Sự phân tích cú pháp đoán nhận trước  Thí dụ 9. Cho văn phạm với các luật sinh như sau: S -> A |B A -> xA|y B -> xB|z Phân tích cú pháp cho câu xxxz không thành công FCE-UIT TS. Vũ Đức Lung 19 FCE-UIT TS. Vũ Đức Lung 20 Sự phân tích cú pháp đoán nhận trước Sự phân tích cú pháp đoán nhận trước  Ví dụ 10: Cho văn phạm G có tập luật sinh: S → Ax A→x|∈ Phân tích câu nhập x: sự phân tích thất bại FCE-UIT TS. Vũ Đức Lung 21 FCE-UIT TS. Vũ Đức Lung 22 Sự phân tích từ vựng Sự hình thành bảng danh biểu 1. Loại bỏ khoảng trắng và chú thích 1. Giao tiếp với bảng danh biểu Hai thao tác với bảng danh biểu: 2. Nhận biết các hằng insert(s,t) và lookup(s). 3. Nhận biết danh biểu và từ khóa 2. Lưu giữ từ khóa Nhận dạng token của bộ phân tích từ vựng 3. Hiện thực bảng danh biểu Bảng danh biểu gồm có bảng symtable và dãy lexemes. FCE-UIT TS. Vũ Đức Lung 23 FCE-UIT TS. Vũ Đức Lung 24 4
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2