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