Vị Trí, Chức Năng, Nhiệm Vụ Của Giai Đoạn Phân Tích Cú Pháp


2.22. Cho các biểu thức chính quy a) 0(0 + 1)* 0+

b) ((0+ 1)*0(0 + 1))+

c) (1+ 0)00 (0* + 1+)

d) (a + ba + aab)*(ε + a)+

Hãy xây dựng các NFAε tương đương với mỗi biểu thức trên.

2.23. Cho các biểu thức chính quy sau: a) ( a* + b+)*

b) ((ε + a) b*)+

c) (a + b)+ abb (a + b)*

d) ab* + (a + bb) a*b

Có thể bạn quan tâm!

Xem toàn bộ 224 trang tài liệu này.

1) Xây dựng NFAε đoán nhận các biểu thức chính quy trên.

2) Hãy chuyển mỗi sang DFA tương đương.

Chương trình dịch - 10

2.24. Quá trình phân tích từ vựng dựa vào sơ đồ chuyển có thể được tiến hành theo giải thuật sau:

Input: Sơ đồ chuyển của token và xâu vào w$ Output: phân tích xâu vào có từ vị của token? Process:

Bước 1: Xuất phát từ trạng thái bắt đầu của ký tự khởi đầu của token, con trỏ trỏ vào ký tự đầu tiên của xâu vào w.

Bước 2: Nếu trên sơ đồ chuyển đang ở nút i và cung đi ra có nhãn là đang nối với nút j thì khi đó:

- Nếu là ký tự kết thúc (Terminal) và ký tự mà con trỏ đang trỏ trong w cũng là thì con trỏ trỏ đến ký tự tiếp theo của xâu w và quá trình duyệt chuyển sang nút j.

- Nếu là token thì quá trình duyệt chuyển sang duyệt trạng thái bắt đầu trong sơ đồ chuyển của token .

+ Nếu quá trình duyệt đến được trạng thái kết thúc của biến thì quá trình duyệt quay trở lại nút j.


+ Ngược lại

* Nếu ở nút i còn cung đi ra thì chọn cung đi ra tiếp theo và quay lại

bước 2.

* Nếu đã xét hết các cung đi ra khỏi nút i và quá trình duyệt không đến

được trạng thái kết thúc của token thì báo lỗi.

- Nếu từ nút i đến nút j có cung mang nhãn , thì quá trình duyệt chuyển thẳng đến nút j và con trỏ trỏ vào ký tự trên xâu vào w đứng yên.

Bước 3: Nếu quá trình duyệt đã duyệt hết xâu vào và:

- Nếu quá trình duyệt đến được trạng thái kết thúc của sơ đồ chuyển của token thì thông báo thành công.

- Ngược lại thì thông báo lỗi.

Cho các sơ đồ chuyển:

Start

0,1,2,3,4,5,6,7,8,9

q0

q1

1)

Digit:


2)

Digits:


Start

+, -

q4

q5

3)

sign:


4) Digitsign:


Start

q

9

+,- ,q

10

digit q

11

.

digit

q12 q13

5)

number:


digit


Start

q2

digit

q3

sign

Start

q6

q7

digit

q8

digit


digit


digit


6)

Nums Start q 14  q 15 digit digit q 16  q 17 digit digit q 18 E q 19  q 20 1

nums: Start


q14


+,- ,


q15


digit


digit


q16 .


q17


digit


digit


q18 E


q19


+,- ,


q20


digit

digit q21

7)


8)


Và các xâu:


Letter:


id:


Hình BT 2.24


Start

q24

letter

q25

Start

q

A,…,Z, a, …,z

22

q

23

letter, digit

1) 123; -23467; 123.56; +123.789; - 001.34256; 123b

2) X1, a23b5; 1b34a; bien12, anpha1

3) 123. 01E02; -021E-03; +23. 098E+04

a) Sử dụng các giải thuật trên, kiểm tra các xâu trên là từ vị của token nào trong các token sau:

1) Digits

2) Digitsign

3) Number

4) Nums

5) id

b) Hãy tổng hợp các sơ đồ trên để có được các sơ đồ chuyển dùng để nhận biết các token:

1) Digits

2) Digitsign

3) Number

4) Nums

5) id

c) Sử dụng các sơ đồ đã tổng hợp được, kiểm tra các xâu trên là từ vị của token nào trong các token trên.



Mục tiêu:

Chương 3 PHÂN TÍCH CÚ PHÁP

Giúp sinh viên có khả năng:

- Biết được vị trí, nhiệm vụ của giai đoạn phân tích cú pháp

- Biết được các phương pháp phân tích cú pháp.

- Hiểu được các kỹ thuật biến đổi văn phạm.

- Hiểu được các kỹ thuật trong phương pháp phân tích top - down.

- Hiểu được các kỹ thuật trong phương pháp phân tích bottom - up .

- Vận dụng các kỹ thuật vào phân tích cú cho một số văn phạm đơn giản

Nội dung chính:

- Vị trí, nhiệm vụ của giai đoạn phân tích cú pháp và các phương pháp phân tích cú pháp.

- Các kỹ thuật biến đổi văn phạm: khử đệ quy trái, thừa số hoá bên trái, khử nhập nhằng.

- Phương pháp phân tích top – down: phân tích cú pháp đệ quy xuống, phân tích cú pháp dự đoán.

- Phương pháp phân tích bottom – up: phân tích cú pháp đẩy thu, phân tích cú pháp LR(k).

3.1. 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. Có thể chỉ ra vị trí của giai đoạn này với các giai đoạn liên quan ở hình 3.1.

Cây phân tích

Thẻ từ mới

Phần còn lại của front end

Bảng ký hiệu

Bộ phân tích từ vựng

Bộ phân tích cú pháp

Chương trình nguồn

Thẻ từ Yêu cầu

cú pháp (Parsing tree)


Hình 3.1. Vị trí của bộ phân tích cú pháp


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.


3.1.3. Các chiến lược phục hồi lỗi

Phục hồi lỗi là kỹ thuật vượt qua các lỗi để tiếp tục quá trình dịch. Nhiều chiến lược phục hồi lỗi có thể dùng trong bộ phân tích cú pháp. Mặc dù không có chiến lược nào được chấp nhận hoàn toàn nhưng một số trong chúng đã được áp dụng rộng rãi. Ở đây sẽ giới thiệu một số chiến lược:

1) Phương thức "hoảng sợ" (panic mode recovery)


Đây là phương pháp đơn giản nhất cho cài đặt và có thể dùng cho hầu hết các phương pháp phân tích. Khi một lỗi được phát hiện thì bộ phân tích cú pháp bỏ qua từng ký hiệu một cho đến khi tìm thấy một tập hợp được chỉ định của các token đồng bộ (synchronizing tokens), các token đồng bộ thường là dấu chấm phẩy (;) hoặc end.

2) Chiến lược mức ngữ đoạn (phrase_level recovery)

Khi phát hiện một lỗi, bộ phân tích cú pháp có thể thực hiện sự hiệu chỉnh cục bộ trên phần còn lại của xâu vào. Cụ thể là thay thế phần đầu còn lại bằng một chuỗi ký tự có thể tiếp tục. Chẳng hạn, dấu phẩy (,) bởi dấu chấm phẩy (;), xóa một dấu phẩy lạ hoặc thêm vào một dấu chấm phẩy.

3) Chiến lược dùng các luật sinh sửa lỗi (error production)

Thêm vào văn phạm của ngôn ngữ những luật sinh lỗi và sử dụng văn phạm này để xây dựng bộ phân tích cú pháp, giúp có thể sinh ra bộ đoán lỗi thích hợp để chỉ ra cấu trúc lỗi được nhận biết trong xâu vào.

4) Chiến lược hiệu chỉnh toàn cục (global correction)

Một cách lý tưởng là chương trình biên dịch tạo ra một số thay đổi trong khi xử lý một lỗi. Có những giải thuật để lựa chọn một số tối thiểu các thay đổi để đạt được một hiệu chỉnh có chi phí toàn cục nhỏ nhất. Cho một xâu vào có lỗi x và một văn phạm G, các giải thuật này sẽ tìm được một cây phân tích cú pháp cho xâu y mà số lượng các thao tác chèn, xóa và thay đổi token cần thiết để chuyển x thành y là nhỏ nhất. Nói chung, hiện nay kỹ thuật này vẫn còn ở dạng nghiên cứu lý thuyết.

3.1.4. Các phương pháp phân tích cú pháp

Hiện tại có nhiều phương pháp phân tích cú pháp khác nhau; tuy nhiên, người ta có thể phân chúng thành 3 loại: phương pháp phân tích tổng hợp, phương pháp phân tích top – down và phương pháp phân tích bottom – up.

1) Phương pháp phân tích tổng hợp (Universal parsing)

Tiêu biểu cho phương pháp phân tích tổng hợp là giải thuật Cooke – Young Kasami và giải thuật Earley; Người ta gọi chúng là giải thuật tổng hợp hay giải thuật vạn năng vì chúng phân tích cú pháp cho văn phạm bất kỳ. Tuy nhiên do tính vạn năng của chúng cho nên nói chung phương pháp này không hiệu quả với một


văn phạm cụ thể; vì lý do trên, người ta ít sử dụng chúng để viết các chương trình dịch (Compiler).

2) Phương pháp phân tích Top – Down

Về mặt trực giác có thể coi phương pháp phân tích Top – Down là phương pháp xây dựng cây phân tích cú pháp từ trên xuống hay có thể xem như một nỗ lực xây dựng cây phân tích cú pháp bắt đầu từ nút gốc và phát sinh dần xuống lá (Root

– Leaves).

3) Phương pháp phân tích Bottom – Up

Về mặt trực giác có thể coi phương pháp phân tích Bottom – Up là xây dựng cây phân tích cú pháp từ dưới lên trên hay hay có thể xem như một nỗ lực xây dựng cây phân tích cú pháp bắt đầu từ các nút lá và thu gọn dần về gốc (Leaves – root).

3.2. Biến Ðổi văn phạm phi ngữ cảnh

Nhiều ngôn ngữ lập trình có cấu trúc đệ quy mà nó có thể được định nghĩa bằng các văn phạm phi ngữ cảnh (context-free grammar) G với 4 thành phần G = (N, T, P, S), trong đó:

- N : là tập hữu hạn các ký hiệu chưa kết thúc hay các biến (variables)

- T : là tập hữu hạn các ký hiệu kết thúc (terminals) với N T = .

- P : là tập luật sinh của văn phạm (productions) có dạng: A với A N và V* = (NT)*

- S N: là ký hiệu bắt đầu của văn phạm (start symbol).

Ví dụ: Văn phạm với các luật sinh sau cho phép định nghĩa các biểu thức số học đơn giản (với E là một biểu thức - expression) :

E → EAE | (E) | - E | id ;

A → + | - | * | / | ↑ .


3.2.1. Cây phân tích cú pháp (Parsing tree) và dẫn xuất

Ta nói rằng αAβ dẫn xuất ra αγβ (ký hiệu: αAβ αγβ) nếu A → γ là một luật sinh, α và β là các chuỗi tùy ý các ký hiệu văn phạm.

Nếu α1 α2 ... αn ta nói α1 dẫn xuất ra (suy ra) αn

Ký hiệu : dẫn xuất ra qua 1 bước


* : dẫn xuất ra qua 0, 1 hoặc nhiều bước.

+

: dẫn xuất ra qua 1 hoặc nhiều bước.

i

: dẫn xuất ra qua i bước.


Ta có tính chất:

*

1. α α với α

*

* *

2. α β và β γ thì α γ

+

Cho một văn phạm G với ký hiệu bắt đầu S. Ta dùng quan hệ để định

nghĩa L(G) một ngôn ngữ được sinh ra bởi G. Xâu các ký hiệu kết thúc w thuộc

+

L(G) nếu và chỉ nếu S w và xâu w được gọi là một câu của G. Một ngôn ngữ

được sinh ra bởi một văn phạm phi ngữ cảnh gọi là ngôn ngữ phi ngữ cảnh. Nếu hai văn phạm cùng sinh ra cùng một ngôn ngữ thì chúng được gọi là hai văn phạm tương đương.

Nếu S * α, trong đó α có thể chứa một ký hiệu chưa kết thúc thì ta nói rằng

α là một dạng câu (sentential form) của G. Một câu là một dạng câu chứa toàn các ký hiệu kết thúc.

Cây phân tích cú pháp là hình ảnh minh họa cho ký hiệu bắt đầu của một văn phạm dẫn đến một xâu trong ngôn ngữ.

Nếu ký hiệu chưa kết thúc A có luật sinh A XYZ thì cây phân tích cú pháp có thể có một nút trong có nhãn A và có 3 nút con có nhãn tương ứng từ trái qua phải là X, Y, Z.

A


X Y Z

Hình 3.2. Minh họa một cây phân tích cú pháp


Một cách hình thức, cho một văn phạm phi ngữ cảnh thì cây phân tích cú pháp là một cây có các tính chất sau đây:

1. Nút gốc có nhãn là ký hiệu bắt đầu.

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 28/06/2022