3.1. Phân tích cú pháp
Một trong những vấn đề được quan tâm khi nghiên cứu ngôn ngữ là đối với 1 ngôn ngữ trên bảng chữ cái cho trước thì một xâu nào đó thuộc * có thuộc L hay không?
Vấn đề này thực chất là việc đoán nhận ngôn ngữ và là một vấn đề không đơn giản với 1 ngôn ngữ tùy ý. Đối với ngôn ngữ chính quy vấn đề này đã được giải quyết triệt để vì ngôn ngữ chính quy là lớp ngôn ngữ đơn giản nhất trong các lớp ngôn ngữ được nghiên cứu. Trên thực tế, lớp ngôn ngữ có nhiều ứng dụng trong lập trình lại là lớp ngôn ngữ phi ngữ cảnh. Với lớp ngôn ngữ này, vấn đề nhận biết ngôn ngữ phức tạp hơn nhiều so với lớp ngôn ngữ chính quy. Một trong các cách tiếp cận giải quyết vấn đề đặt ra là sử dụng phương pháp phân tích ngôn ngữ. Ý tưởng chính của phương pháp phân tích là với một xâu đã cho, tìm cách phân tích dựa trên cấu trúc của ngôn ngữ L đã biết để đi đến quyết định là có hay không thuộc ngôn ngữ L. Có nhiều phương pháp phân tích khác nhau: phương pháp phân tích từ trên xuống Top-Down, phương pháp phần tử từ dưới lên Bottom- Up và phương pháp phân tích tất định. Mỗi phương pháp đều có những ưu và nhược điểm khác nhau. Hai phương pháp phân tích Top-Down và Bottom-Up có ưu điểm là đơn giản nhưng có chung nhược điểm là thời gian thực hiện chậm vì độ phức tạp tính toán lớn: với xâu vào độ dài n thì số bước thực hiện tỷ lệ thuận với an, tức là có độ phức tạp lũy thừa. Vì vậy trên thực tế những phương pháp này chỉ áp dụng cho những bài toán cỡ nhỏ. Phương pháp phân tích tất định có ưu thế hơn
- 69 -
2 phương pháp nói trên về độ phức tạp tính toán: với xâu vào độ dài n thì số bước thực hiện tỷ lệ thuận với n, tức là có độ phức tạp tuyến tính. Tuy nhiên phương pháp phân tích tất định chỉ áp dụng được cho lớp ngôn ngữ phi ngữ cảnh không nhập nhằng và không đệ quy trái. Sau đây sẽ xét các điều kiện để 1 ngôn ngữ phi ngữ cảnh là không nhập nhằng và không đệ quy trái như thế nào.
3.2. Các hàm FIRST và FOLLOW Định nghĩa hàm First:
- Giả sử trong văn phạm G=<, , I, R> có các quy tắc có chung vế trái đều là A: A 1 2… k thì hàm First của A được định nghĩa là tập hợp tất cả các ký hiệu kết thúc ở vị trí đầu của các xâu có thể suy dẫn được từ các xâu i với i=1, 2, … , k. Có thể viết theo ngôn ngữ tập hợp như sau:
First(A)={a i ├ a với ( )*, i=1, 2, … , k}. - Nếu a thì First(a)={a}
- Nếu =X với X , ( )* thì First(X)=First(X). - Từ định nghĩa suy ra:
Nếu A 12…k
Thì: First(A)=First(1) First(2) … First(k)
Định nghĩa hàm Follow:
- Giả sử trong văn phạm G=<, , I, R>, A , hàm Follow của A, ký hiệu Follow(A) là tập hợp tất cả các ký hiệu kết thúc có thể xuất hiện ở vị trí ngay sau A trong các xâu có thể suy diễn được từ các quy tắc của văn phạm G. Quy tắc xác định Follow(A) như sau: Nếu trong văn phạm G các quy tắc có chứa A ở vế phải là:
Xi iAi , Xi , i, i ( )* , i=1, 2, … , k Thì: Follow(A)=First(1) First(2) … First(k)
Ví dụ: Cho văn phạm phi ngữ cảnh G=<, , I, R> , với
={a, b, c, d}; ={I, A, B}
- 70 -
Xác định First(I), First(A), First(B), Follow(I), Follow(A), Follow(B).
Giải:
First(I)=First(aIA) First(bIB) First()={a, b} First(A)=First(cAd) First()={c}
First(B)=First(dBc) First()={d} Follow(I)=First(A) First(B)={c, d} Follow(A)=First() First(d)={d} Follow(B)=First() First(c)={c}
3.3. Văn phạm phi ngữ cảnh không nhập nhằng và không đệ quy trái
Văn phạm phi ngữ cảnh G=<, , I, R> là văn phạm không nhập nhằng và không đệ quy trái nếu với mọi cặp quy tắc có chung vế trái A đều thỏa mãn các điều kiện: First() First()= và First(A) Follow(A)=.
Nhận xét: Nếu văn phạm G không có 2 quy tắc nào chung vế trái thì các điều kiện trên luôn thỏa mãn.
Ví dụ xét ở mục trên: G là văn phạm không nhập nhằng, không đệ quy trái.
Ví dụ: Cho văn phạm phi ngữ cảnh G=<, , I, R>, với
={a, b, c}; ={I, A, B}
R={I A, I B, A aA, A c, B bB, B c}
Cho biết G có phải là văn phạm không nhập nhằng, không đệ quy trái?
Giải:
Xét cặp quy tắc I A B
Có: First(A)=First(aA) First(c)={a} {c}={a, c} First(B)=First(bB) First(c)={b} {c}={b, c}
Suy ra: First(A) First(B)={c}
Không thỏa mãn điều kiện, vậy văn phạm G là nhập nhằng.
Sự nhập nhằng thể hiện ở chỗ một xâu có thể tạo bởi nhiều cách khác nhau, ví dụ, xâu c có thể tạo theo 2 cách I A c hoặc I B c.
- 71 -
3.4. Thuật toán phân tích top-down
Input: Văn phạm phi ngữ cảnh G=<, , I, R> không đệ quy trái. Xâu vào =a1a2…an*
Output: Cây suy dẫn đầy đủ của nếu L(G) hoặc thông báo lỗi nếu
L(G).
Bước 1: Gốc cây cú pháp là I và con trỏ của đầu đọc chỉ vào ký tự a1 của
Bước 2: Giả sử X là ký tự đỉnh hiện tại và con trỏ của đầu đọc đang trỏ vào ký tự hiện tại x của xâu (đỉnh hiện tại sẽ là đỉnh được xây dựng tiếp theo). Có 2 trường hợp:
Trường hợp 1: Nếu X thì chọn quy tắc có vế trái là X, chẳng hạn quy tắc X (nếu có nhiều quy tắc vế trái là X thì đánh số và chọn lần lượt để xét). Nếu không có quy tắc nào có vế trái là X thì đưa ra thông báo lỗi và dừng thuật toán với kết luận L(G).
- Nếu = thì đỉnh tiếp theo là đỉnh bên phải của X. - Nếu và =X1X2…Xk thì đỉnh tiếp theo là X1
Trường hợp 2: Nếu X=a thì so sánh a với ký tự hiên tại x của :
- Nếu X=a=x thì đỉnh tiếp theo là đỉnh bên phải của X và con trỏ của đầu đọc dịch sang phải một ký tự. Nếu bên phải của X không có ký hiệu nào và x chính là xn thì kết thúc thuật toán và đưa ra cây suy dẫn đầy đủ của với kết luận
L(G), còn nếu x xn thì quay về trường hợp 1 của bước 2 để chọn lại quy tắc khác có vế trái là x để xét (quay lui).
- Nếu X=a x thì quay về trường hợp 1 của bước 2 để chọn lại quy tắc khác có vế trái là x để xét (quay lui).
Vì độ dài của xâu vào là hữu hạn, tập quy tắc R hữu hạn, nên thuật toán chắc chắn sẽ dừng sau hữu hạn bước thực hiện, và có độ phức tạp Cn với C là hằng số nào đó.
3.5. Thuật toán phân tích tất định
Cơ sở của phương pháp phân tích tất định là automat đẩy xuống và sử dụng cách tiếp cận Top-Down. Mô hình phân tích tất định gồm băng vào chứa xâu cần
- 72 -
phân tích với ký hiệu kết thúc là $ ($ là ký hiệu đặc biệt không thuộc ngôn ngữ), một ngăn xếp Stack chứa các ký hiệu của văn phạm với ký hiệu đáy $, một bộ điều khiển chứa chương trình phân tích và bảng phân tích là mảng 2 chiều M[A, a] với A là ký hiệu không kết thúc còn a là ký hiệu kết thúc và một đầu ra. Bộ phân tích tất định hoạt động theo thuật toán phân tích tất định. Cho trước văn phạm phi ngữ cảnh G=<, , I, R> không nhập nhằng, không đệ quy trái, với mỗi xâu vào *, thuật toán phân tích tất định sẽ thực hiện phân tích và cho ra câu trả lời: có thuộc L(G) hay không, nếu L(G) thì kết quả thể hiện trên bảng phân tích và cho cây phân tích tất định là cây suy dẫn đầy đủ của . Sơ đồ hoạt động của bộ phân tích tất định như hình sau đây:
Thuật toán phân tích tất định:
Input: Văn phạm phi ngữ cảnh G=<, , I, R> không nhập nhằng, không đệ
quy trái. Xâu vào *
Output: Bảng phân tích tất định và cây phân tích tất định nếu L(G) hoặc
thông báo lỗi nếu L(G).
Bước 1: Ban đầu stack chứa $ I, ký hiệu $ ở đáy, I trên đỉnh. $
Trên băng vào là xâu cần phân tích $.
Trong bảng phân tích tất định, tại cột Input chứa $.
Bước 2: Xét ký hiệu X trên đỉnh stack (là ký hiệu bên phải trong cột Stack) và ký hiệu hiện tại a của Input (ký hiệu bên trái trong cột Input). Có 2 trường hợp:
X Y Z $ $ - Chương trình phân tích tất định - Bảng phân tích M Xâu vào Stack Ra
- 73 - Trường hợp 1: X {$}.
- Nếu ký hiệu hiện tại a của Input và X đều là $: X=a=$ Thì kết thúc thuật toán.
- Nếu ký hiệu hiện tại a của Input và X bằng nhau và $ Thì loại X khỏi stack, loại a khỏi Input, đầu đọc trên băng vào dịch sang phải 1 vị trí.
- Nếu ký hiệu hiện tại a của Input và X khác nhau: X a Thì dừng thuật toán và đưa ra thông báo lỗi.
Trường hợp 2: X
Bộ phân tích chọn từ R quy tắc có vế trái là X, vế phải có ký hiệu đầu là a, tức là quy tắc có dạng X a, với ( )*
Thay thế X bởi xâu a, các ký hiệu của xâu a đưa vào stack theo chiều phải sang trái, tức là ký hiệu a sẽ ở trên đỉnh. In ra quy tắc X a trong cột Output.
Nếu trong R không có quy tắc nào có dạng X a thì dừng thuật toán và đưa ra thông báo lỗi.
Bước 3: Lặp lại bước 2 cho tới khi dừng thuật toán. Khi thuật toán kết thúc, có 2 khả năng xảy ra: Trong trường hợp dừng và đưa ra thông báo lỗi thì kết luận
L(G), còn trong trường hợp dừng khi X=a=$ thì kết luận L(G) và in ra cây phân tích tất định của .
Chú ý: Vì văn phạm G đã cho là không nhập nhằng, không đệ quy trái, nên trong R không thể có quá 1 quy tắc dạng X a.
Vì độ dài của xâu vào là hữu hạn, tập quy tắc R hữu hạn, nên thuật toán chắc chắn sẽ dừng sau hữu hạn bước thực hiện, và số bước thực hiện tỷ lệ thuận với độ dài của xâu vào .
Ví dụ: Cho văn phạm phi ngữ cảnh G=<, , I, R> với
={x, y, z}; ={I, A}; R={I xA, A yAz} Hãy phân tích tất định với xâu vào =xyyz
Giải: Dễ dàng kiểm tra và kết luận văn phạm G đã cho là không nhập nhằng, không đệ quy trái, vì vậy có thể áp dụng thuật toán phân tích tất định. Quá trình
- 74 -
thực hiện thuật toán theo các bước và kết quả được ghi lại trong bảng phân tích tất định sau đây:
Stack Input Output
$ I xyyz$ I xA $Ax xyyz$ $A yyz$ A yA $Ay yyz$ $A yz$ A yA $Ay yz$ $A z$ A z $z z$ $ $
Kết luận L(G) và cây phân tích tất định có dạng
4. Bài tập chƣơng 3
1) Cho văn phạm phi ngữ cảnh G=<,,I,R> với ={0,1}; ={I,A,B,C}; R={I0A0, I1B1, A0A0, A0C, C1C1, CA, A, B}; Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.A là ký hiệu không đến được b.B là ký hiệu vô sinh
c.C là ký hiệu không đến được d.Cả 3 phát biểu trên đều sai
2) Cho văn phạm phi ngữ cảnh G=<,,I,R> với ={0,1};
={I,A,B,C}; R={I0A,B1B,A0A,A0B,B0C,C0C,C};
x y I A A y A z
- 75 -
Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây: a.G có ký hiệu không đến được
b.G có ký hiệu vô sinh c.G không có ký hiệu thừa d.Cả 3 phát biểu trên đều sai
3) Cho 2 văn phạm phi ngữ cảnh G1=<,,I,R1> và G2=<,,I,R2> với ={0,1};
={I,A,B}; R1={I0I, IAB, AAA, BBB, A0, B1}; R2={IAB, II I, I10, AAA, BAB, A000, B111}; Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.Chỉ có G1 là văn phạm chuẩn của Chomsky b.Chỉ có G2 là văn phạm chuẩn của Chomsky
c.Cả G1 và G2 đều là văn phạm chuẩn của Chomsky d.Cả 3 phát biểu trên đều sai
4) Cho văn phạm phi ngữ cảnh G=<,,I,R> với ={0,1};
={I,A,B}; R={IAB,IB,A0A,A0,B1B,B1}; Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.Follow(A)={0} b.Follow(A)={0,1} c.Follow(A)={^}
d.Cả 3 phát biểu trên đều sai
5) Cho 2 văn phạm phi ngữ cảnh G1=<,,I,R1> và G2=<,,I,R2> với ={0,1};
={I,A,B}; R1={IAB, A0A, A1A, B1B, A0, B1}; R2={IAB, A0A, A1A, B0B, A0, B1};
Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.Chỉ có G1 là văn phạm không nhập nhằng và không đệ quy trái b.Chỉ có G2 là văn phạm không nhập nhằng và không đệ quy trái
c.Cả G1 và G2 đều là văn phạm không nhập nhằng và không đệ quy trái d.Cả 3 phát biểu trên đều sai
6) Trong định nghĩa Automat đẩy xuống M=<,Q,,,q0,Z0 ,F> thì là: a.ánh xạ từ x Q x vào 2Qx
b.ánh xạ từ x Q x vào 2Q
c.ánh xạ từ {^} x Q x vào 2Q d.ánh xạ từ {^} x Q x vào 2Qx
7) Cho Automat đẩy xuống M=<,Q,,,q0,Z0 ,F> và T(M). Chọn phát biểu đúng:
- 76 -
b.Sau khi đọc xong xâu thì ngăn xếp của M rỗng và trạng thái của M thuộc F c.Sau khi đọc xong xâu thì trạng thái của M thuộc F
d.Sau khi đọc xong xâu thì ngăn xếp của M không rỗng và trạng thái của M thuộc F
8) Giả sử L là một ngôn ngữ được biểu diễn bởi một biểu thức chính quy. Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.Chỉ có thể đoán nhận L bởi Automat hữu hạn b.Chỉ có thể đoán nhận L bởi Automat đẩy xuống
c.Có thể đoán nhận L bởi Automat hữu hạn hoặc Automat đẩy xuống d.Cả 3 phát biểu trên đều sai
9) Cho ngôn ngữ L={0n1nn≥0}
Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây: a.Chỉ có thể đoán nhận L bởi Automat hữu hạn
b.Chỉ có thể đoán nhận L bởi Automat đẩy xuống
c.Có thể đoán nhận L bởi Automat hữu hạn hoặc Automat đẩy xuống d.Cả 3 phát biểu trên đều sai
10) Cho ngôn ngữ L = { * , *, là từ gương của } Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.Chỉ có thể đoán nhận L bởi Automat hữu hạn b.Chỉ có thể đoán nhận L bởi Automat đẩy xuống
c.Có thể đoán nhận L bởi Automat hữu hạn hoặc Automat đẩy xuống d.Cả 3 phát biểu trên đều sai
11) Cho ngôn ngữ L = { ambnambn m 0, n 0 } Hãy chọn phát biểu đúng nhất trong các phát biểu sau đây:
a.Chỉ có thể đoán nhận L bởi Automat hữu hạn b.Chỉ có thể đoán nhận L bởi Automat đẩy xuống
c.Có thể đoán nhận L bởi Automat hữu hạn hoặc Automat đẩy xuống d.Cả 3 phát biểu trên đều sai
12)Tìm phát biểu sai (FA:automat hữu hạn, PA:automat đẩy xuống). a. FA và PA đều có hữu hạn trạng thái
b. FA có hữu hạn trạng thái còn PA có vô hạn trạng thái c. FA và PA đều đoán nhận được ngôn ngữ chính quy d. PA có ngăn xếp còn FA thì không có
13)Cho Automat đẩy xuống không đơn định M=<,Q,,,q0,Z0 ,F>, x T(M), chọn phát biểu đúng:
- 77 -
b. tất cả các cách đọc x đều thỏa điều kiện: đọc xong x, M ở tại 1 trạng thái của F
c. trong khi đọc x, M phải ở tại 1 trạng thái của F d. cả 3 phát biểu trên đều sai
14)Cho Automat đẩy xuống không đơn định M=<,Q,,,q0,Z0,F>,x *, tìm phát biểu sai:
a. nếu xT(M) thì khi đọc xong x, M ở tại 1 trạng thái của F b. nếu xNull(M) thì khi đọc xong x, ngăn xếp của M rỗng
c. nếu xNull(M) thì khi đọc xong x, M có thể ở tại 1 trạng thái của F d. nếu xT(M) thì khi đọc xong x, ngăn xếp của M rỗng