Giáo trình Chương trình dịch (Phần 2)
Giai đoạn phân tích cú pháp
3.1.1. Vị trí, chức năng, nhiệm vụ của giai đoạn phân tích cú pháp
Giai đoạn phân tích cú pháp là giai đoạn tiếp theo của giai đoạn phân tích từ
vựng và trước giai đoạn phân tích ngữ nghĩa.
Chức năng của giai đoạn phân tích cú pháp là phân tích chương trình nguồn
về mặt cú pháp: Xây dụng cây phân tích cú pháp hoặc báo lỗi. Nhiệm vụ chính của
giai đoạn này là nhận vào dòng các thẻ từ (token) có được từ giai đoạn phân tích từ
vựng và xác nhận rằng nó có thể được sinh ra từ văn phạm của ngôn ngữ nguồn
bằng cách tạo ra cây phân tích cú pháp cho dòng thẻ từ này và đầu ra của nó là cây
phân tích cú pháp (parsing tree). Ngoài ra, bộ phân tích cú pháp còn có cơ chế ghi
nhận các lỗi cú pháp theo một phương thức linh hoạt và có khả năng phục hồi được
các lỗi thường gặp để có thể tiếp tục xử lý phần còn lại của xâu vào.
3.1.2. Xử lý lỗi cú pháp
Chương trình nguồn có thể chứa các lỗi ở nhiều mức độ khác nhau:
- Lỗi từ vựng: như tên, từ khóa, toán tử viết không đúng.
- Lỗi cú pháp: như ghi một biểu thức toán học với các dấu ngoặc đóng và mở
không cân bằng, thiếu dấu chấm phảy (;), thiếu từ khoá.
- Lỗi ngữ nghĩa: như một toán tử áp dụng vào một toán hạng không tương thích,
sai kiểu dữ liệu.
- Lỗi logic: như thực hiện một lời gọi đệ quy không thể kết thúc.
Phần lớn việc phát hiện và phục hồi lỗi trong một chương chương trình biên
dịch tập trung vào giai đoạn phân tích cú pháp. Vì thế, bộ xử lý lỗi (error handler)
trong quá trình phân tích cú pháp phải đạt được mục đích sau:
- Ghi nhận và thông báo lỗi một cách rõ ràng và chính xác.
- Phục hồi lỗi một cách nhanh chóng để có thể xác định các lỗi tiếp theo.
- Không làm chậm tiến trình của một chương trình đúng
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Chương trình dịch (Phần 2)
có nhãn là id và ( đang nối với nút có nhãn là 17 và 15. Chọn cung đi ra có nhãn là id, trùng với token đƣợc trỏ bởi con trỏ trên xâu vào. Con trỏ trên xâu vào chuyển sang ký tự tiếp theo là +, tức là ký tự đầu tiên của xâu + id$. Quá trình duyệt chuyển sang nút có nhãn là 17. Vì 17 là nút kết thúc của F nên quá trình duyệt chuyến sang nút có nhãn là 8 trong sơ đồ chuyển của T. Trên sơ đồ chuyển của T đang ở nút 8 và có 2 cung đi ra có nhãn là + và đang nối với nút có nhãn là 7 và 13. Chọn cung đi ra có nhãn là +, trùng với ký tự đƣợc trỏ bởi con trỏ trên xâu vào. Con trỏ trên xâu vào chuyển sang ký tự tiếp theo là id, tức là ký tự đầu tiên của xâu id$. Quá trình duyệt chuyển sang nút có nhãn là 7 của sơ đồ chuyển của T. Trên sơ đồ chuyển của T đang ở nút 7 và cung đi ra có nhãn là F đang nối với nút có nhãn là 8. Vì F là biến, do đó quá trình duyệt chuyển sang duyệt trạng thái bắt đầu trong sơ đồ chuyển của F là 14 . Trên sơ đồ chuyển của F đang ở nút 14 và có 2 cung đi ra có nhãn là id và ( đang nối với nút có nhãn là 17 và 15. Chọn cung đi ra có nhãn là id, trùng với token đƣợc trỏ bởi con trỏ trên xâu vào. Con trỏ trên xâu vào chuyển sang ký tự tiếp theo là $, tức là ký tự kết thúc xâu. Quá trình duyệt chuyển sang nút có nhãn là 17. Vì 17 là nút kết thúc trong sơ đồ chuyển của F và đã duyệt hết xâu vào nên quá trình duyệt kết thúc và thông báo thành công. - w = id + + id * id$ Xuất phát từ trạng thái 0 của ký hiệu khởi đầu E của văn phạm. Con trỏ trỏ vào ký tự đầu tiên của xâu vào id + + id * id$ là id. Trên sơ đồ chuyển của E đang ở nút 0 và cung đi ra có nhãn là T đang nối với nút có nhãn là 3. Vì T là biến, do đó quá trình duyệt chuyển sang duyệt trạng thái bắt đầu trong sơ đồ chuyển của T là 7 . Trên sơ đồ chuyển của T đang ở nút 7 và cung đi ra có nhãn là F đang nối với nút có nhãn là 8. Vì F là biến, do đó quá trình duyệt chuyển sang duyệt trạng thái bắt đầu trong sơ đồ chuyển của F là 14 . 204 Lời giải tóm tắt hoặc hƣớng dẫn Trên sơ đồ chuyển của F đang ở nút 14 và có 2 cung đi ra có nhãn là id và ( đang nối với nút có nhãn là 17 và 15. Chọn cung đi ra có nhãn là id, trùng với token đƣợc trỏ bởi con trỏ trên xâu vào. Con trỏ trên xâu vào chuyển sang ký tự tiếp theo là +, tức là ký tự đầu tiên của xâu + + id * id$. Quá trình duyệt chuyển sang nút có nhãn là 17 của sơ đồ F. Vì 17 là nút kết thúc của F nên quá trình duyệt chuyến sang nút có nhãn là 8 trong sơ đồ chuyển của T. Trên sơ đồ chuyển của T đang ở nút 8 và có 2 cung đi ra có nhãn là + và đang nối với nút có nhãn là 7 và 13. Chọn cung đi ra có nhãn là +, trùng với token đƣợc trỏ bởi con trỏ trên xâu vào. Con trỏ trên xâu vào chuyển sang ký tự tiếp theo là +, tức là ký tự đầu tiên của xâu + id * id$. Quá trình duyệt chuyển sang nút có nhãn là 7. Trên sơ đồ chuyển của T đang ở nút 7 và cung đi ra có nhãn là F đang nối với nút có nhãn là 8 trong sơ đồ chuyển của T. Vì F là biến, do đó quá trình duyệt chuyển sang duyệt trạng thái bắt đầu trong sơ đồ chuyển của F là 14 . Trên sơ đồ chuyển của F đang ở nút 14 và có 2 cung đi ra có nhãn là id và ( đang nối với nút có nhãn là 17 và 15. Các nhãn này là token id và ký tự kết thúc ( đều không trùng với ký hiệu kết thúc + đang đƣợc trỏ bởi con trỏ trên xâu vào. Vì đã xét hết các cung đi ra khỏi các nút 14, 7 và 0 và quá trình duyệt không đến đƣợc trạng thái kết thúc của một sơ đồ chuyển nào nên quá trình duyệt dừng để thông báo lỗi. - Các xâu còn lại phân tích tƣơng tự. 3.39. Lời giải tóm tắt a) Loại bỏ đệ quy trái trực tiếp - expr (expr) expr1 | id expr1 | digits expr1 - expr1 matop expr expr1 | - digit 0 | 1 |...| 9 ; * - digits digit digit ; - letter A | B | ...| Z | a | b |...| z ; * - id (letter| _ ) (letter | digit | _ ) ; - matop → + | - | * | / ; 205 Lời giải tóm tắt hoặc hƣớng dẫn b) Sơ đồ chuyển của văn phạm. digits Start ( expr ) expr expr: 0 1 2 3 1 4 1 id Start mato expr expr1 expr1: 6 7 8 5 p 0,1,2,3,4,5,6,7,8,9 Digit: Start 9 A,, Z, a, , z 10 digit Digits: Start digit 11 12 Letter: Start A,,Z, a, ,z 13 14 letter, digit id: Start letter 15 16 + , - , *, / Matop: Start 17 18 Hình BT 3.39b. Sơ đồ chuyển 206 Lời giải tóm tắt hoặc hƣớng dẫn c) Tự làm, tƣơng tự bài 3.38 3.40. Lời giải tóm tắt a) Khử đệ quy trái trực tiếp, thu đƣợc: E TE1 ; E1 * TE1| ; T FT1 ; T1 +FT1 | ; F GF1 ; F1 /GF1 | ; G BG1 ; G1 -BG1 | ; B (E) | id. T E b) Start 1 E: 0 1 2 E : Start * T E1 1 3 4 5 6 Start F T1 T: 7 8 9 Start + F T1 T1 10 11 12 13 : ‟: : : Start G F1 F: 14 15 16 Start / G F1 F1 17 18 19 20 : Start B G G: 21 22 1 23 207 Lời giải tóm tắt hoặc hƣớng dẫn Start - B G1 G1: 24 25 26 27 Start ( E ) B: 28 29 30 31 id Hình BT 3.40b. Sơ đồ chuyển c) Tự làm, tƣơng tự bài 3.38 3.41. Lời giải tóm tắt id + * ( ) $ E E TE‟ E TE‟ E‟ E‟ +TE‟ E‟ E‟ T T FT‟ T FT‟ T‟ T‟ T‟ *FT‟ T‟ T‟ F F id F (E) Bảng BT 3.41 1) w = id * (id + id) a) Áp dụng giải thuật phân tích cú pháp dự đoán dựa vào ngăn xếp, quá trình phân tích cú pháp cho xâu vào w = id * (id + id) đƣợc trình bày trong bảng sau: Bƣớc STACK INPUT OUTPUT Khởi tạo $ E id * (id + id)$ 1 $ E' T id * (id + id)$ E TE‟ 2 $ E' T‟F id * (id + id)$ T FT‟ 3 $ E' T‟id id * (id + id)$ F id 4 $ E' T‟ * (id + id)$ 5 $ E' T‟F* * (id + id)$ T‟ *FT‟ 6 $ E' T‟F (id + id)$ 7 $ E' T‟) E ( (id + id)$ F (E) 8 $ E' T‟) E id + id)$ 9 $ E' T‟) E‟T id + id)$ E TE‟ 10 $ E' T‟) E‟T‟F id + id)$ T FT‟ 11 $ E' T‟) E‟T‟id id + id)$ F id 208 Lời giải tóm tắt hoặc hƣớng dẫn 12 $ E' T‟) E‟T‟ + id)$ 13 $ E' T‟) E‟ + id)$ T‟ 14 $ E' T‟) E‟T+ + id)$ E‟ +TE‟ 15 $ E' T‟) E‟T id)$ 16 $ E' T‟) E‟T‟F id)$ T FT‟ 17 $ E' T‟) E‟T‟id id)$ F id 18 $ E' T‟) E‟T‟ )$ 19 $ E' T‟) E‟ )$ T‟ 20 $ E' T‟) )$ E‟ 21 $ E' T‟ $ 22 $ E' $ T‟ 23 $ $ E‟ Bảng BT 3.41.1a Mô phỏng quá trình phân tích cú pháp dự đoán X = a = $. Quá trình phân tích kết thúc thành công b) Cây phân tích cú pháp đƣợc hình thành từ output : E T E‟ F T‟ + T E‟ T‟ id * F F T‟ T‟ ( E ) id * F T E‟ id F T‟ id Hình BT 3.41b. Cây phân tích cú pháp của xâu id * (id + id) được xây dựng từ trên xuống theo phương pháp dự đoán dựa vào bảng phân tích 209 Lời giải tóm tắt hoặc hƣớng dẫn 2) w = id + id + id) a) Quá trình phân tích cú pháp đƣợc trình bày trong bảng sau: Bƣớc STACK INPUT OUTPUT Khởi tạo $ E id + id + id) 1 $ E' T id + id + id)$ E TE‟ 2 $ E' T‟F id + id + id)$ T FT‟ 3 $ E' T‟id id + id + id)$ F id 4 $ E' T‟ + id + id)$ 5 $ E' + id + id)$ T‟ 6 $ E' T+ + id + id)$ E‟ +TE‟ 7 $ E' T id + id)$ 8 $ E' T‟F id + id)$ T FT‟ 9 $ E' T‟id id + id)$ 10 $ E' T‟ + id)$ 11 $ E' + id)$ T‟ 12 $ E' T+ + id)$ E‟ +TE‟ 13 $ E' T id)$ 14 $ E' T‟F id)$ T FT‟ 15 $ E' T‟id id)$ F id 16 $ E' T‟ )$ 17 $ E' )$ T‟ 18 $ )$ E‟ Bảng BT 3.41.2a Mô phỏng quá trình phân tích cú pháp dự đoán X = $ a = ). Quá trình phân tích báo lỗi. b) Không có cây phân tích cú pháp. 3) w = id + * id + id. 210 Lời giải tóm tắt hoặc hƣớng dẫn a) Quá trình phân tích cú pháp đƣợc trình bày trong bảng sau: Bƣớc STACK INPUT OUTPUT Khởi tạo $ E id + * id + id$ 1 $ E' T id + * id + id$ E TE‟ 2 $ E' T‟F id + * id + id$ T FT‟ 3 $ E' T‟id id + * id + id$ F id 4 $ E' T‟ + * id + id$ 5 $ E' + * id + id$ T‟ 6 $ E' T+ + * id + id$ E‟ +TE‟ 7 $ E' T * id + id$ Bảng BT 3.41.3a Mô phỏng quá trình phân tích cú pháp dự đoán Không tồn tại luật sinh tại ô M[T, *] của bảng phân tích cú pháp nên quá trình phân tích dừng để thông báo lỗi. b) Không có cây phân tích cú pháp. Các câu 4, 5, 6, 8) Tự làm, tƣơng tự nhƣ trên. 3.42. Lời giải tóm tắt a) Khử đệ quy trái, thu đƣợc văn phạm không đệ quy trái với các luật sinh: E TE1 ; (1) E1 * TE1; (2) E1 (3) T FT1 (4) T1 +FT1; (5) T1 ; (6) F (E) (7) F id (8) b) FIRST và FOLLOW của các ký hiệu không kết thúc 1) FIRST Tính FIRST(F): 211 Lời giải tóm tắt hoặc hƣớng dẫn - Từ luật sinh (7), theo quy tắc 3 ta thêm đƣợc FIRST(„(‟) = „(‟ (theo quy tắc1) vào FIRST(F). - Từ luật sinh (8), theo quy tắc 3 ta thêm đƣợc FIRST(id) = „id‟ (theo quy tắc1) vào FIRST(F). - Không còn luật sinh nào có vế trái là F nữa. Vì vậy, ta không thể thêm ký hiệu nào vào FIRST(F) nữa FIRST(F) = { (, id }. - Tính FIRST(E1): - Từ luật sinh (2), theo quy tắc 3 ta thêm đƣợc FIRST(*) = * (theo quy tắc1) vào FIRST(E1). - Từ luật sinh (3), theo quy tắc 2 ta thêm đƣợc vào FIRST(E1). - Không còn luật sinh nào có vế trái là E1 nữa. Vì vậy, ta không thể thêm ký hiệu nào vào FIRST(E1) nữa FIRST(E1) = { * , }. Tƣơng tự FIRST(T1) = { +, }. Từ luật sinh (4), theo quy tắc 3: T FT1 và FIRST(F) FIRST(T) = FIRST(F) = { (, id } Tƣơng tự từ E TE1 và FIRST(T) FIRST(E) = FIRST(T) = { (, id } Vậy ta có: FIRST(E) = FIRST(T) = FIRST(F) = { (, id } FIRST(E1) = {* , } FIRST(T1) = {+ , } 2) FOLLOW Tính FOLLOW(E): - Vì E là ký hiệu khởi đầu, theo quy tắc 1 ta thêm $ vào FOLLOW(E) . - Áp dụng quy tắc 2 cho luật sinh (7): F (E) ) FOLLOW(E) FOLLOW(E) ={$, )} - Không còn áp dụng đƣợc quy tắc nào cho E nữa. Vậy FOLLOW(E) ={$, )} . Tính FOLLOW(E1): - Áp dụng quy tắc 3 cho luật sinh (1): E TE1 ta thêm mọi ký hiệu của FOLLOW(E) vào FOLLOW(E1) ), $ FOLLOW(E1) - Không thêm đƣợc ký hiệu nào vào FOLLOW(E1) nữa 212 Lời giải tóm tắt hoặc hƣớng dẫn FOLLOW(E1) ={$, )} - Áp dụng luật 2 cho luật sinh (1): E TE1 * FOLLOW(T). - Áp dụng luật 3 cho luật sinh (2, 3): E1 *TE1 , E1 FOLLOW(E1) FOLLOW(T) FOLLOW(T) = { * , ) , $ }. - Áp dụng quy tắc 3 cho luật sinh (4): T FT1 thì FOLLOW(T1) = FOLLOW(T) = {* , ) , $ } Áp dụng quy tắc 2 cho luật sinh (4): T FT1 + FOLLOW(F) Áp dụng quy tắc 3 cho luật sinh (5, 6): T1 +FT1 ; T1 FOLLOW(T1) FOLLOW(F) FOLLOW(F) = {*, +, ), $ }. Vậy ta có: FOLLOW(E) = FOLLOW(E1) = { $, ) } FOLLOW(T) = FOLLOW(T1) = { * , ) , $ } FOLLOW(F) = {*, +, ), $ } c) Xây dựng bảng phân tích cú pháp Áp dụng giải thuật xây dựng bảng phân tích cú pháp dự đoán cho văn phạm trong ví dụ trên: - Xét luật sinh E TE1: Tính FIRST(TE1) = FIRST(T) = {( , id} M[E, id] và M[E,( ] chứa luật sinh E TE1 - Xét luật sinh E1 *TE1 : Tính FIRST(*TE1) = FIRST(*) = {*} M[E1, *] chứa E1 *TE1 - Xét luật sinh E1 : Vì FIRST(E1) và FOLLOW(E1) = { ) , $ } E nằm trong M[E1, )] và M[E1, $] - Xét luật sinh T1 + FT' : Tính FIRST(+ FT') = {+ } T1 + FT1 nằm trong M[T1, +] - Xét luật sinh T1 : Vì FIRST(T1) và FOLLOW(T1) = {* , ) , $} T' nằm trong M[T1, *] , M[T1, )] và M[T1, $] - Xét luật sinh F (E) ; FIRST((E)) = { ( } F ( E) nằm trong M[F, ( ] 213 Lời giải tóm tắt hoặc hƣớng dẫn - Xét luật sinh F id ; FIRST(id) = {id} F id nằm trong M[F, id] Kết quả bảng phân tích cú pháp M của văn phạm đƣợc xây dựng nhƣ trong bảng sau: id * + ( ) $ E E TE1 E TE1 E1 E1 *TE1 E1 E1 T T FT1 T FT1 T1 T1 T1 +FT1 T1 T1 F F id F (E) Bảng BT 3.42 Bảng phân tích cú pháp d) Tự làm, tƣơng tự bài 3.41 3.43. Lời giải tóm tắt a) Khử đệ quy trái trực tiếp, thu đƣợc: E TE1 ; (1) E1 *TE1; (2) E1 (3) T FT1 (4) T1 +FT1; (5) T1 ; (6) F GF1 ; (7) F1 / GF1 ; (8) F1 ; (9) G BG1 ; (10) G1 -BG1 ; (11) G1 ; (12) B (E) (13) B id (14) 214 Lời giải tóm tắt hoặc hƣớng dẫn b) Tính FIRST và FOLLOW của các ký hiệu không kết thúc Tự làm, tƣơng tự bài 4.43b. c) Xây dựng bảng phân tích cú pháp Tự làm, tƣơng tự bài 4.43c. d) Tự làm, tƣơng tự bài 3.42 3.44. Lời giải tóm tắt 1) w = id * (id + id) - Áp dụng giải thuật phân tích cú pháp đẩy - thu, quá trình phân tích xâu đƣợc trình bày trong bảng sau: Bƣớc Ngăn xếp Xâu vào Hành động Kết quả 12 $ id * (id + id)$ Đẩy 13 $id * (id + id)$ Thu gọn E id 14 $E * (id + id)$ Đẩy 15 $E* (id + id)$ Đẩy 16 $E*( id + id)$ Đẩy 17 $E*(id + id)$ Thu gọn E id 18 $E*(E id)$ Đẩy 19 $E*(E+id )$ Thu gọn E id 20 $E*(E+E )$ Thu gọn E E+E 21 $E*(E )$ Đẩy 22 $E*(E) $ Thu gọn E (E) 23 $E*E $ Thu gọn E E*E 24 $E $ Thành công Bảng 3.44.1. Mô phỏng quá trình phân tích đẩy - thu - Xây dựng cây phân tích cú pháp 215 Lời giải tóm tắt hoặc hƣớng dẫn E E E E E E id * ( id id ) + Hình BT 3.44a. Cây phân tích cú pháp của xâu id * (id + id) được xây dựng từ dưới lên theo phương pháp đẩy - thu 2) w = id + id + id) - Quá trình phân tích cú pháp đẩy - thu xâu đƣợc trình bày trong bảng sau: Bƣớc Ngăn xếp Xâu vào Hành động Kết quả 1 $ id + id + id)$ Đẩy 2 $id + id + id)$ Thu gọn E id 3 $E + id + id)$ Đẩy 4 $E+ id + id)$ Đẩy 5 $E+id + id)$ Thu gọn E id 6 $E+E + id)$ Thu gọn E E+E 7 $E + id)$ Đẩy 8 $E+ id)$ Đẩy 9 $E+id )$ Thu gọn E id 10 $E+E )$ Thu gọn E E+E 11 $E )$ Đẩy 12 $E) $ Báo lỗi Bảng 3.44.2. Mô phỏng quá trình phân tích đẩy - thu 216 Lời giải tóm tắt hoặc hƣớng dẫn - Quá trình phân tích gặp lỗi vì Stack không chỉ chứa duy nhất ký tự bắt đầu E nên không có cây phân tích cú pháp. 3) w = id + * id + id - Quá trình phân tích cú pháp đẩy - thu xâu đƣợc trình bày trong bảng sau: Bƣớc Ngăn xếp Xâu vào Hành động Kết quả 1 $ id + * id + id$ Đẩy 2 $id + * id + id$ Thu gọn E id 3 $E + * id + id$ Đẩy 4 $E+ * id + id$ Đẩy 5 $E+* id + id$ Đẩy 6 $E+*id + id$ Thu gọn E id 7 $E+*E + id$ Đẩy 8 $E+*E+ id$ Đẩy 9 $E+*E+id $ Thu gọn E id 10 $E+*E+E $ Thu gọn E E+E 11 $E+*E $ Báo lỗi Bảng 3.44.3. Mô phỏng quá trình phân tích đẩy - thu - Quá trình phân tích gặp lỗi vì Stack không chỉ chứa duy nhất ký tự bắt đầu E nên không có cây phân tích cú pháp. 4, 5, 6, 7) Tự làm, tƣơng tự các câu trên. 3.45. Hƣớng dẫn Tự làm, tƣơng tự bài 3.44. 3.46. Hƣớng dẫn Xem lại và làm tƣơng tự ví dụ 3.34 3.47. Hƣớng dẫn 1) Xem lại và làm tƣơng tự ví dụ 3.25 2) Xem lại và làm tƣơng tự ví dụ 3.26 3) Xem lại và làm tƣơng tự ví dụ 3.26 4) Xem lại và làm tƣơng tự ví dụ 3.24 217 Tài liệu tham khảo TÀI LIỆU THAM KHẢO [1] Vũ Lục, Chương trình dịch, Nhà xuất bản Đại học Bách khoa Hà Nội, 1995. [2] Vũ Đình Hoà, Đỗ Bích Ngọc, Chương trình dịch, Nhà xuất bản Đai học Sƣ phạm, 2007. [3] Phan Thị Tƣơi, Trình biên dịch, Nhà xuất bản Giáo dục, 1986. [4] Nguyễn Văn Xuất, Automat – Ngôn ngữ hình thức và nguyên lý chương trình dịch, Nhà xuất bản khoa học kỹ thuật, 2006. [5] Alfred V.Aho, Jeffrey D.Ullman, Addison, Compilers: Principles, Technique and Tools, Wesley Publishing Company, 1986. 218
File đính kèm:
- giao_trinh_chuong_trinh_dich_phan_2.pdf