Tải bản đầy đủ (.doc) (145 trang)

ngôn ngữ hình thức và automata

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (688.24 KB, 145 trang )

Luận Tốt Nghiệp KS2-K7
LỜI NÓI ĐẦU
Môn học ngôn ngữ hình thức và automata có rất nhiều ứng dụng trong lĩnh vực khoa học
máy tính như xây dựng các trình biên dịch, nhận dạng và chuyển đổi giữa các ngôn ngữ khác
nhau… Do đó mà môn học này là một môn học bắt buộc cho các sinh viên ngành CNTT trong các
trường đại học.
Để giúp cho các sinh viên có điều kiện học tốt và thực hành các bài tập của môn học này, luận văn
này đi sâu vào việc mô phỏng lại hoạt động của các giải thuật trong phần ngôn ngữ phi ngữ cảnh
đặc biệt là các giải thuật phân tích cú pháp Earley và CYK.
Sinh viên có thể khai thác cơ sở lý thuyết của môn học thông qua hệ thống Help của chương trình.
Xin cám ơn thầy Hồ Văn Quân đã tận tình hướng dẫn và giúp đỡ tôi hoàn thành bản luận văn tốt
nghiệp như yêu cầu của đề bài.
Sinh Viên Thực Hiện
Thái Thuần Thạch
PHẦN 1
Trang 1
Luận Tốt Nghiệp KS2-K7
GIỚI THIỆU
1. GIỚI THIỆU ĐỀ TÀI
Yêu cầu của đề tài là :
“Xây dựng bộ công cụ thực hiện một số giải thuật trong môn học ngôn ngữ hình thức và
Automata.” Ngoài các giải thuật biến đổi văn phạm, tập trung vào nghiên cứu và hiện thực hai giải
thuật phân tích cú pháp CYK và Earley, Đánh giá số bước phân tích của mỗi giải thuật.
Aùp dụng nhận dạng một câu nhập thuộc ngôn ngữ tự nhiên (Tiếng Anh)
2. MỤC ĐÍCH & Ý NGHĨA
Hiện nay, ở nước ta việc áp dụng giảng dạy các môn học thông qua các mô hình giảng dạy
thiết kế trên máy tính còn gặp nhiều khó khăn, một trong những nguyên nhân là thiếu các phần
mềm hỗ trợ việc học và giảng dạy.
Luận văn này ra đời không nằm ngoài mục đích giúp sinh viên nghành CNTT có một công
cụ để hỗ trợ thêm cho việc học môn học “Ngôn Ngữ Hình Thức & Automata” . Bộ công cụ này
cho phép sinh thấy rõ cách thức hoạt động của một số giải thuật của phần ngôn ngữ phi ngữ cảnh,


cũng như thấy được ứng dụng của các giải thuật phân tích cú pháp.
3. NỘI DUNG CHÍNH CỦA LUẬN VĂN TỐT NGHIỆP
Nội dung của luận văn được chia làm 8 phần, cụ thể như sau:
♦ Phần 1 : Là phần giới thiệu về đề tài, cùng ý nghĩa và tầm quan trọng của nó.
♦ Phần 2 : Đây là phần tìm hiểu về cơ sở lý thuyết có liên quan, trong phần 2 này được chia làm
4 chương với các chủ đề tìm hiểu khác nhau cụ thể là :
Chương 1 : Một số khái niệm cơ bản của môn học
Mục đích của chương này là giúp cho người đọc làm quen với một số khái niệm về
Ngôn ngữ Hình thức & Automat như chuỗi, ngôn ngữ và văn phạm chính qui, ngôn
ngữ và văn phạm PNC, cây dẫn xuất… để có thể dễ dàng đọc tiếp những phần
sau.Tuy nhiên, người đọc có thể bỏ qua chương này nếu đã nắm được các khái niệm
trên.
Chương 2 :Các giải thuật biến đổi văn phạm PNC & các dạng chuẩn
Trong chương này tập trung tìm hiểu các giải thuật biến đổi văn phạm PNC như :
Loại bỏ các luật sinh rỗng, đơn vị, vô dụng cũng như chuyển đổi một văn phạm
PNC bất kỳ về hai dạng chuẩn Chomsky và Greibach, đây là phần lý thuết cơ bản
làm nền tảng cho việc thực hiện giải thuật phân tích cú pháp CYK sau này.
Chương 3 : Trình bày Một số giải thuật và công cụ phân tích cú pháp thông dụng bao gồm
phương pháp từ trên xuống (top -down) và từ dưới lên (bootom -up) mục đích là
giúp cho người đọc có sơ sở để so sánh với hai giải thuật phân tích cú pháp tổng
quát CYK và Earley
Chuơng 4 : Giải thuật phân tích cú pháp Earley và CYK, đây là phần chính của luận văn,
trong chương này chú trọng đến việc tìm hiểu về giải thuật để phân tích cú pháp và
tạo chuỗi dẫn xuất cho câu nhập, cũng như so sánh độ phức tạp của hai giải thuật
này với các giải thuật ở chương 3.
Trang 2
Luận Tốt Nghiệp KS2-K7
♦ Phần 3 : Tìm hiểu lý thuyết về phần mềm hỗ trợ học tập và giảng dạy, cách thức để thiết kế
và lựa chọn mô hình giảng dạy tốt.
♦ Phần 4 : Tập trung phân tích và thiết kế cho mô hình vừa chọn, phần này dựa trên các lý thuyết

đã tìm hiểu ở phần 2 và mô hình giảng dạy để đưa ra
• Lựa chọn ngôn ngữ lập trình
• Cấu trúc dữ liệu cho các giải thuật sử dụng trong chương trình
• Cách thức nhập liệu, cấu trúc file lưu trữ
• Cách trình bày dữ liệu xuất
• Các lưu đồ thuật toán, tính toán độ phức tạp…
• …
♦ Phần 5 : So sánh độ phức tạp giữa hai giải thuật phân tích cú pháp CYK và Earley, trong phần
này đưa ra các giả thiết để thực hiện tính độ phức tạp cho hai giải thuật trên bằng chương trình
cũng như đưa ra những minh họa bằng ví dụ thực tế (với các đồ thị minh họa)
♦ Phần 6 : Aùp dụng nhận dạng ngôn ngữ tự nhiên, trong phần này sẽ trình bày các vấn đề liên
quan đến việc nhận dạng một câu nhập (Tiếng Anh) và cách thức xây dựng bộ từ điển token.
♦ Phần 7 : Thiết kế Help : đây cũng là một phần quan trọng của một chương trình trợ giúp học
tập, trong phần này chú trọng tìm hiểu thiết kế một hệ thống Help. Đặc biệt là thiết kế hệ thống
Help cho chương trình thông qua công cụ Windows Help Designer Pro (down load từ
)
♦ Phần 8 : Giới thiệu chuơng trình kết quả.
♦ Phần 9 : Phụ lục - Mã chương trình
♦ Phần 10 : Giới thiệu các tài liệu tham khảo
PHẦN 2 :
CƠ SỞ LÝ THUYẾT LIÊN QUAN
CHƯƠNG 1
MỘT SỐ KHÁI NIỆM CƠ BẢN
Trong chương này chúng ta sẽ tìm hiểu một số khái niệm và định nghĩa cơ bản liên quan
đến môn học như : bảng chữ cái, chuỗi, ngôn ngữ, văn phạm, cây dẫn xuất…, tuy nhiên sinh viên
có thể bỏ qua chương này nếu đã nắm bắt được các khái niệm trên.
1. BẢNG CHỮ CÁI
♦ Là một tập hữu hạn không trống các ký hiệu (symbol) tập này thường được ký hiệu bằng Σ
♦ Ví dụ :
Trang 3

Luận Tốt Nghiệp KS2-K7
{A,B,C,...,Z} : Bảng chữ cái chữ La Tinh
{0,1,2,....9} : Bảng chữ số thập phân
2. CHUỖI
♦ Cho Σ là bảng chữ cái (alphabet), một từ w trên Σ là một chuỗi hữu hạn các chữ cái.
Ví dụ:
w=aabba, v=aaabbb là các từ trên bảng chữ cái Σ={a,b}
♦ Chuỗi rỗng cũng là một từ trên bảng chữ cái Σ ký hiệu là λ
♦ Kết nối chuỗi (concatenation) : Cho hai chuỗi u,v trên bảng chữ cái Σ, kết nối giữa hai chuỗi u,v
ký hiệu là uv là một từ trên bảng chữ cái Σ bao gồm các ký hiệu thuộc u theo sau là các ký hiệu
thuộc v.
Ví dụ:
Σ ={a,b,1,2}
u=aabb
v=1122
uv=aabb1122
♦ Đảo một chuỗi : là chuỗi nhận được bằng cách viết các ký hiệu theo thứ tự ngược lại.
Ví dụ : v=1122 thì v
R
=2211
♦ Tiếp đầu ngữ (prefix) và tiếp vĩ ngữ (suffix) của một chuỗi : Nêu w=uv thì u được gọi là tiếp
đầu ngữ và v được gọi là tiếp vĩ ngữ của w
♦ Chiều dài của một chuỗi : Chiều dài của một chuỗi w được ký hiệu là |w| hay là l(w) là số ký
hiệu có trong chuỗi.
♦ Với mọi chuỗi u,v trên Σ ta có:
|uv|=|u|+|v|
|uv|=|vu|
♦ Lũy thừa của một chuỗi: nêu w là một chuỗi thì w
n
là một chuỗi có được bằng cách kết nối

chuỗi w với chính nó n lần, trường hợp đặc biệt
w
0

♦ Σ
*
: Nếu Σ là một bảng chữ cái thì tập tất cả các chuỗi trên Σ kể cả chuởi trống được gọi là Σ
*
♦ Σ
+
: Nếu Σ là một bảng chữ cái thì tập tất cả các chuỗi trên Σ không kể chuởi trống được gọi là
Σ
+
3. NGÔN NGỮ
♦ Bất kỳ một tập L nào trên bảng chữ cái Σ, hay tập con L của Σ
*
được gọi là một ngôn ngữ.
Ví dụ :
Cho Σ={a,b} thì Σ
*
={λ,a,b,aa,ab,ba,aaa,aab,...}
Tập {a,aa,aab} là một ngôn ngữ trên ∑
Tập L={a
n
b
n
: n≥0} cũng là một ngôn ngữ trên tập ∑
♦ Vì ngôn ngữ là một tập hợp các chuỗi nên hội (union), giao (intersection) và hiệu (diference)
của hai ngôn ngữ dễ dàng xác định ngay lập tức.
♦ Bù của một ngôn ngữ : Bù của một ngôn ngữ L trên bảng chữ cái ∑ được ký hiệu là

L =∑
*
-L
Trang 4
Luận Tốt Nghiệp KS2-K7
♦ Cho L
1
và L
2
là hai ngôn ngữ trên bảng chữ cái ∑:
+

L
1
L
2 :
Là một ngôn ngữ trên ∑ chứa các chuỗi có được bằng cách nối bất kỳ một chuỗi của ngôn
ngữ L
1
với một chuỗi bất kỳ của ngôn ngữ thuộc L
2
L
1
L
2
={w: w=uv, u∈L
1
, v∈L
2
}

+ L
n
: Lũy thừa của một ngôn ngữ bao gồm L nối với chính n lần với trường hợp đặc biệt :
L
0
={λ}
L
n
=L
n-1
L với n≥0
♦ Bao đóng -sao của một ngôn ngữ L được ký hiệu là L
*
với :
L
*
=L
0
∪L
1
∪L
2
...
♦ Bao đóng -dương của một ngôn ngữ L được ký hiệu là L
+
với :
L
+
=L
1

∪L
2
...
4.VĂN PHẠM CHÍNH QUI VÀ NGÔN NGỮ CHÍNH QUI
4.1- Văn phạm Chính Qui
Để nguyên cứu một ngôn ngữ, chúng ta cần một cơ chế để mô tả nó. Ngôn ngữ hàng ngày
thường không chính xác (vì có thể hiểu theo nhiều nghĩa tùy vào hoàn cảnh của từng người và bối
cảnh sảy ra), cú pháp thì nhập nhằng không rõ ràng (câu có thể không xác định được ý nghĩa chính
xác), vì vậy chúng ta sẽ tìm hiểu một vài cơ chế định nghĩa ngôn ngữ rất hiệu quả trong các trường
hợp khác nhau đó là định nghĩa ngôn ngữ thông qua văn phạm.
♦ Định Nghĩa
Một văn phạm G được xác định như là một bộ bốn :
G=(V,T,S,P)
Trong đó:
+ V là một tập hữu hạn các đối tượng được gọi là các biến (variable)
+ T là một tập hữu hạn các đối tượng được gọi là các ký hiệu kết thúc (terminal symbol)
+ S

V là một ký hiệu đặt biệt được gọi là biến khởi đầu.
+ P là tập hữu hạn các luật sinh (Production)
♦ Văn phạm tuyến tính Phải và Trái
+ Một văn phạm G=(V,T,S,P) được gọi là tuyến tính - phải nếu tất cả các luật sinh có dạng :
X  xB,
X x
Trong đó : A,B ∈ V, x ∈ T* .
+ Mộtvăn phạm được gọi là tuyến tính trái nếu tất cả các luật sinh có dạng :
X Bx,
X x
+ Một văn phạm gọi là chính qui là văn phạm mà hoặc là tuyến tính trái hoặc tuyến tính phải.
Các luật sinh là trái tim của văn phạm, chúng chỉ ra làm thế nào văn phạm biến đổi một chuỗi

thành một chuỗi khác, và thông qua cách này chúng (các luật sinh) định nghĩa một ngôn ngữ liên
kết với văn phạm.
♦ Chúng ta nói rằng w dẫn xuất ra z ký hiệu w=
*
>z hay z được dẫn xuất ra từ w. Các chuỗi lần
lượt được dẫn xuất bằng cách áp dụng các luật sinh của văn phạm trong một thứ tự tùy ý nếu :
w
1
=>w
2
=>...=>w
n
chúng ta nói w
1
dẫn xuất ra w
n
và viết w
1
=
*
> w
2.
Trang 5
Luận Tốt Nghiệp KS2-K7
♦ Dấu * chỉ ra rằng một số bước bất kỳ nào đó (kể cả không) có thể được áp dụng để dẫn xuất ra
w
n
từ w
1
♦ Để chỉ ra ít nhất một luật sinh áp dụng chúng ta phải viết : w

1
=
+
>w
n
4.2- Ngôn Ngữ Chính Qui
Một ngôn ngữ gọi là chính qui nếu tồn tại một automat hữu hạn chấp nhận nó. Vì vậy mỗi
ngôn ngữ chính qui có thể được mô tả bằng một dfa hay một nfa nào đó, như vậy để trình bày một
ngôn ngữ chính qui có thể mô tả nó như là một dfa hay nfa.
Ngôn ngữ L là chính qui nếu và chỉ nếu tồn tại một văn phạm chính qui G sao cho L=L(G).
4.3- Biểu Thức Chính Qui
Một cách để biểu diễn ngôn ngữ chính qui là thông qua khái niện biểu thức chính qui. Khái
niệm về biểu thức chính qui bao gồm sự kết hợp các chuỗi kí hiệu của một bảng chữ các ∑ nào đó,
các dấu ngoặc ( ) và các phép toán + , . và *. Ví dụ r=(a|b)*a
♦ Định nghĩa
Cho

là một bảng chữ cái. Thì:
+

,
λ
và a
∈∑
tất cả đều là những biểu thức chính qui. Những cái này được gọi là những biểu
thức chính qui nguyên thủy.
+ Nếu r
1
và r
2

là những biểu thức chính qui, thì r
1
+r
2,
r
1.
r
2
, và(r
1
) cũng vậy.
+ Mộät chuỗi là một biểu thức chính quy nếu và chỉ nếu nó có thể được dẫn xuất từ các biểu thức
chính qui nguyên thủy bằng một số lần hữu hạn áp dụng các qui tắc trong (2).
♦ Ngôn ngữ L(r) được biểu thị bỡi biểu thức chính qui bất kỳ và được định nghĩa bởi các qui tắc
sau:
+ ∅ là một biểu thức chính qui biểu thị tập trống.
+ λ là một biểu thức chính qui biểu thị tập {λ}
+ Đối với mọi a ∈∑, a là biểu thức chính qui biểu thị cho ngôn ngữ {a}.
Nếu r
1
và r
2
những biểu thức chính qui thì :
+ L(r
1
+r
2
) = L(r
1
) ∪L(r

2
)
+ L(r
1.
r
2
) = L(r
1
).L(r
2
)
+ L((r
1
)) = L(r
1
)
+ L(r
1
*
) = (L(r
1
))
*
5. NGÔN NGỮ PHI NGỮ CẢNH
Trong thực tế hàng ngày không phải tất cả các ngôn ngữ điều là chính qui. Trong khi ngôn
ngữ chính qui hiệu quả trong việc mô tả một vài mẫu đơn giản do đó người ta không cần chú ý quá
nhiều đến các ngôn ngữ chính qui vì có nhiều sự hạn chế của nó đối với ngôn ngữ lập trình.
Ví dụ: Nếu trong L={a
n
b

n
: n≥0}, chúng ta thay thế dấu ngoặc trái cho a và dấu ngoặc phải cho b
thì chuỗi các dấu ngoặc chẳng hạn như (( )) và ((( ))) là thuộc L nhưng (( ) thì không mà trong một
ngôn ngữ lập trình thì thường xuyên gặp những cấu trúc lồng nhau như vậy. Do đó ta thấy một vài
thuộc tính của ngôn ngữ lập trình yêu cầu một cái gì đó bên ngoài ngôn ngữ chính qui, để bao trùm
những vấn đề này ta phải mở rộng ngôn ngữ dẫn đến việc nguyên cứu ngôn ngữ và văn phạm
phi ngữ cảnh.
5.1- Văn Phạm Phi Ngữ Cảnh
Các luật sinh trong văn phạm chính qui thì bị giới hạn theo 2 cách : Vế phải là một biến
đơn, trong khi đó vế phải có một dạng đặc biệt. Để tạo ra văn phạm mạnh hơn, chúng ta phải nới
Trang 6
Luận Tốt Nghiệp KS2-K7
lỏng một vài giới hạn như vậy, bằng cách duy trì giới hạn trên vế trái nhưng cho phép bất kỳ cái gì
trên vế phải khi đó chúng ta nhận được một văn phạm phi ngữ cảnh.
♦ Định Nghĩa
Một văn phạm G =(V,T,S,P) được gọi là phi ngữ cảnh nếu mọi luật sinh trong P có dạng :
A-->x
trong đó A

V còn x

(V

T)
*
.
Một ngôn ngữ được gọi là phi ngữ cảnh nếu và chỉ nếu có một văn phạm phi ngữ cảnh G sao cho
L= L(G).
5.2- Dẫn Xuất Trái Nhất Và Phải Nhất
Trong văn phạm phi ngữ cảnh mà không tuyến tính, một dẫn xuất có thể bao gồm nhiều

dạng câu với nhiều hơn một biến, trong trường hợp như vậy chúng có có một sự chọn lựa về thứ tự
biến nào được thay thế.
Một dẫn xuất được gọi là trái nhất nếu trong mỗi bước biến bên trái nhất được thay thế. nếu trong
mỗi bước biến bên phải nhất được thay thế thì gọi dẫn xuất trái nhất.
5.3 - Cây Dẫn Xuất
Một cách thứ hai để trình bày các dẫn xuất, độc lập với thứ tự trong đó các luật sinh được
áp dụng là bằng cây dẫn xuất. Một cây dẫn xuất là một cây có thứ tự trong đó các nốt được gán
nhãn với vế trái của luật sinh còn các con của các nốt biểu diễn bằng vế phải tương ứng của nó
Ví dụ : A--> abABc thì cây dẫn xuất là :
Định Nghĩa
Cho G=(V,T,S,P) là một văn phạm phi ngữ cảnh. Một cây có thứ tự là một cây dẫn xuất cho G nếu
và chỉ nếu có các tính chất sau:
+ Gốc được gán nhãn là S
+ Mỗi lá có một nhãn lấy từ tập (T

{
λ
})
+ Mỗi nốt bên trong không phải là lá có một nhãn lấy từ V.
+ Nếu nỗi nốt có nhãn A

V, và các con của nó được gán nhãn (từ trái sang phải) a
1
, a
2....
a
n
thì P
phải chứa một luật sinh có dạng
A--> a

1
, a
2....
a
n
+ Một lá được gán nhãn
λ
không có anh chị e, tức là một nốt với một con được gán nhãn
λ
có thể
không có con nào khác.
Ngoài ra còn có một số khái niệm khác chưa được nêu ra ở đây, các bạn có thể tìm hiểu thêm trong
“An Introduction To Formal Languages And Automata” của Peter Linz
Trang 7
A
BA cb
a
Luận Tốt Nghiệp KS2-K7
CHUƠNG 2
MỘT SỐ GIẢI THUẬT BIẾN ĐỔI VĂN PHẠM PNC VÀ CÁC
DẠNG CHUẨN
Trong phần này, chúng ta đi sâu vào việc tìm hiểu một số giải thuật biến đổi văn phạm phi
ngữ cảnh như :
+ Loại bỏ các luật sinh rỗng
+ Loại bỏ các luật sinh vô dụng
+ Loại bỏ các luật sinh đơn vị
+ Chuyển văn phạm bất kỳ về dạng chuẩn Chomsky
+ Chuyển văn phạm bất kỳ về dạng chuẩn Greibach
Việc loại bỏ các luật sinh trên rất quang trọng làm tiền đề để có thể biến đổi tập văn phạm của
ngôn ngữ phi ngữ cảnh về các dạng chuẩn quan trọng như dạng chuẩn Chomsky, dạng chuẩn

Greibach. Từ đó giúp cho việc thực hiện một giải thuật phân tích cú pháp như CYK.
I- CÁC GIẢI THUẬT BIẾN ĐỔI VĂN PHẠM
1) LOẠI BỎ CÁC LUẬT SINH RỖNG (λ)
Bất kỳ luật sinh nào của văn phạm phi ngữ cảnh có dạng A -->
λ
được gọi là luật sinh
λ
,
và bất kỳ biến A nào mà đối với nó dẫn xuất A--
*
>
λ
là có thể thì A gọi là khả trống.
Nhập :
- Một văn phạm phi ngữ cảnh G =(V,T,S,P) với :
+ V : Các kí hiệu không kết thúc.
+ T : Các kí hiệu kết thúc.
+ S : Biến khởi đầu
+ P : Tập các luật sinh
Xuất :
- Một văn phạm G^=( V,T,S,P^) với tập luật sinh P^ không có tập luật sinh rỗng.
• Giải Thuật
Bước 1: Duyệt qua tất cả các luật sinh trong P, nếu có luật sinh nào có dạng
A->λ thì cho A vào tập Vn
Bước 2 : Lặp lại bước sau cho đến khi nào không thêm được biến vào Vn được nữa :
+ Nếu trong P có tồn tại : B---> A
1
A
2
A

3
... A
n
với A
1
A
2
A
3
... A
n
∈ Vn thì cho B vào Vn
Bước 3: Sau khi đã có tập Vn, xét mọi luật sinh trong P có dạng :
A---> x
1
x
2
... x
m
với m≥1 và x
i
∈ (V∪ T)
Đối với mỗi luật sinh như vậy của P, đặt vào P^ luật sinh đó cũng như những luật sinh bằng cách
thay thế các biến khả trống (∈ Vn) bằng λ trong mọi tổ hợp có thể có, ngoại trừ tất cả x
i
(i=1,2...)
là khả trống thì không đặt luật sinh A->λ vào trong P^
Ví dụ:
Cho văn phạm G =({S,A,B,C,D},{a, b,d,λ},{S},P) và các luật sinh trong P như sau :
Trang 8

Luận Tốt Nghiệp KS2-K7
S ---> ABaC
A ---> BC
B ---> b | λ
C ---> D | λ
D ---> d
Áp dụng giải thuật trên ta có :
- Đầu tiên Vn={}
Bước 1: Các luật sinh trực tiếp sinh B--->λ, C--->λ do đó Vn={B,C}
Bước 2: Các luật sinh gián tiếp dẫn xuất ra rỗng là A--->BC do đó thêm A vào tập Vn =>
Vn={B,C,A}
Bước 3 : Xây dựng các tổ hợp cho mỗi luật sinh bằng cách thay thế λ cho những biến ở vế phải
thuộc Vn, ta được luật P^:
S ---> ABaC | BaC | AaC | ABa | aC | Ba | Aa | a
B ---> b
C ---> D
A ---> BC | C | B
2) LOẠI BỎ CÁC LUẬT SINH ĐƠN VỊ
Bất kỳ luật sinh của văn phạm phi ngữ cảnh có dạng A ---> B trong đó A,B thuộc V
thì được gọi là luật sinh đơn vị.
• Nhập :
- Một văn phạm phi ngữ cảnh G =(V,T,S,P) với :
+ V : Các kí hiệu không kết thúc.
+ T : Các kí hiệu kết thúc.
+ S : Biến khởi đầu
+ P : Tập các luật sinh
• Xuất :
- Một văn phạm G^=( V,T,S,P^) với tập luật sinh P^ không có tập luật sinh đơn vị.
• Giải Thuật
Bước 1 : Đặt vào P^ các luật sinh không đơn vị của P

Bước 2 : Đối với mỗi luật sinh trong P có dạng A---> B (A ≠ B), thì đối với mỗi biến A tìm tất cả
các biến B sao cho A--*> B Điều này có thể thực hiện được bằng cách vẽ đồ thị phụ thuộc cho G.
Bước 3 : Xét tất cả các biến A và B thỏa mãn ở bước 2 , chúng ta sẽ thêm vào P^ các luật sinh
sau :
A ---> y
1
| y
2
| y
3
| ...|y
n
Trong đó B ---> y
1
| y
2
| y
3
| ...|y
n
là các luật sinh không đơn vị của B. Hay nói cách khác đặt các vế
phải của các luật sinh không đơn vị của B ở trong P vào làm các vế phải của các luật sinh của A
trong p^
Kết quả G^ sẽ tương đương với G mà P^ không chứa các luật sinh đơn vị
Ghi chú :
Nếu muốn trong P^ không chứa luật sinh rỗng
λ
thì trước tiên ta phải loại bỏ luật sinh
λ
trước.

Ví dụ:
Cho văn phạm G =({S,A,B},{a,b,c},{S},P) và các luật sinh trong P như sau :
S ---> Aa | B
B ---> A | bb
Trang 9
Luận Tốt Nghiệp KS2-K7
A ---> a | bc | B
Áp dụng giải thuật trên ta có :
- Bước 1: Đặt vào P^ các luật sinh không đơn vị :
S ---> Aa
B ---> bb
A ---> a | bc
- Bước 2: Từ các tập luật sinh đơn vị trên tìm ra được các tập luật sinh dẫn xuất A--*>B như sau :
S ---> B
S ---> A
A ---> B
B ---> A
+ Đồ thị phụ thuộc:
- Bước 3 : Xét tất cả các luật sinh thõa mãn bước 2 ta thêm vào các luật sinh sau vào P^
S ---> B <==> S ---> bb
S ---> A <==> S ---> a | bc
A ---> B <==> A ---> bb
B ---> A <==> S ---> a | bc
Vậy trong P^ :
S ---> Aa | bb | a | bc
B ---> bb | a | bc
A ---> a | bc | bb
Không có luật sinh đơn vị nào
3) LOẠI BỎ CÁC LUẬT SINH VÔ DỤNG
Một mong muốn cố định là loại bỏ ra khỏi văn phạm những luật sinh mà không bao giờ

đóng góp gì trong bất kỳ dẫn xuất nào. Chẳng hạn trong văn phạm sau toàn bộ tập luật sinh của nó
là :
S ---> aSb | λ | A
A ---> aA
Luật sinh S ---> A rõ ràng không đóng một vai trò nào, vì A không thể được biến đổi thành
các ký hiệu kết thúc. Trong khi A có thể xuất hiện trong một chuỗi được dẫn xuất từ S, cái này có
thể không bao giờ dẫn đến câu. Việc loại bỏ luật sinh này không làm ảnh hưởng đến ngôn ngữ và
là một sự đơn giản hóa theo bất kỳ định nghĩa nào.
• Nhập :
- Một văn phạm phi ngữ cảnh G =(V,T,S,P) với :
+ V : Các kí hiệu không kết thúc.
+ T : Các kí hiệu kết thúc.
+ S : Biến khởi đầu
+ P : Tập các luật sinh
• Xuất :
- Một văn phạm G^=(V^,T^,S,P^) với tập luật sinh P^ không có tập luật sinh vô dụng.
Trang 10
B
A
S
Luận Tốt Nghiệp KS2-K7
• Giải Thuật
Bước 1 : Loại bỏ luật sinh vô dụng loại 1:
+ Khởi tạo V1={ }
+ Lặp lại các bước sau cho đến khi không còn biến nào được thêm vào V1.
Đối với mỗi A∈ V mà có luật sinh
A--> x
1
x
2

...x
n
với x
i
∈ T* ∪ V1 thi thên A vào V1
+ lấy P1 là tất cả các luật trong P mà có các kí hiệu thuộc (V ∪ T)*
Bước 2 : Để loại bỏ các luật sinh vô dụng loại 2 ta dựa vào văn phạm G1 (có tập luật sinh P1) vừa
có ở trên và vẽ đồ thị phụ thuộc cho nó, sau đó tìm các biến mà không đạt tới được từ S. Loại bỏ
các biến này và các luật sinh liên quan đến nó ra khỏi G1 ta được văn phạm kết quả G^
II- CÁC DẠNG CHUẨN
1) DẠNG CHUẨN CHOMSKY
Một VPPNC là thuộc dạng chuẩn Chomsky nếu mọi luật sinh có dạng A-->BC
hoặc A-->a với A,B,C

V, còn a

T
Định lý : Bất kỳ VPPNC nào G=(V,T,S,P) với
λ


L(G) điều có một văn phạm tương đương
G^=(V^,T,S,P^) trong dạng chuẩn Chom sky
• Nhập :
- Một văn phạm phi ngữ cảnh G =(V,T,S,P) với :
+ V : Các kí hiệu không kết thúc.
+ T : Các kí hiệu kết thúc.
+ S : Biến khởi đầu
+ P : Tập các luật sinh
• Xuất :

- Một văn phạm G^=( V^,T^,S^,P^) với tập luật sinh P^ thuộc dạng chuẩn Chomsky
• Giải Thuật
Bước 1: Loại bỏ các luật sinh:
- Rỗng
- Đơn Vị
- Vô dụng
Bước 2: Đặt các luật sinh A-->a vào trong P^
Bước 3: Đối với các luật sinh A-->x
1
x
2
...x
n
với n ≥ 2, x
i


(V∪T) thì thay các kí hiệu kết thúc,
chẳng hạn x
k
=a, bằng các biến đại diện mới B
a
tạo thành các luật sinh trung gia A--> C
1
C
2
...C
n
.
Bước 4: Ưùng với mỗi biến B

a
đặt vào trong P ^ các luật sinh B
a
-->a.
Bước 5: Sau khi thực hiện xong bước 3, ứng với mỗi luật sinh A--> C
1
C
2
...C
n
.
mà n=2 thì đặt nó vào trong P^. Ngược lại ứng với n ≥ 2 ta giới thiệu các biến mới D
1,
D
2
,.... và đưa
vào P các luật sinh sau:
A --> C
1
D
1
D
2
--> D
1
D
2
. .
. .
D

n-2
---> C
n-1
C
n
Ví dụ : Hãy biến đổi văn phạm sau sang dạng chuẩn Chomsky
S a | Aba
Trang 11
Luận Tốt Nghiệp KS2-K7
A aab
B b | Ac
- Theo bước 1, ta đặt các luật sinh sau vào trong P^
S a,
B b
- Theo bước 2, ta đưa ra các biến mới và thay thế các luật sinh còn lại trở thành như sau:
S ABB
a
A B
a
B
a
B
b
B Ab
c
B
a
 a
B
b

 b
B
c
 c
- Theo bước 3 & 4, ta đặt vào P^ các luật sinh sau:
B Ab
c
B
a
 a
B
b
 b
B
c
 c
- Còn đối với các luật sinh
S ABB
a
A B
a
B
a
B
b
ta biến đổi và đưa vào P^ các luật sinh tương ứng sau:
S AD
1
D
1

 Bb
a
A B
a
D
2
D
2
 B
a
B
b
- Tóm lại ta được văn phạm ở dạng chuẩn Chomsky tương đương như sau:
S a | AD
1
D
1
 Bb
a
A B
a
D
2
D
2
 B
a
B
b
B b | Ab

c
B
a
 a
B
b
 b
B
c
 c
2) DẠNG CHUẨN GREIBACH
Một VPPNC là thuộc dạng chuẩn Greibach nếu mọi luật sinh có dạng A-->ax
trong đó x

V*, còn a

T
Định lý : Bất kỳ VPPNC nào G=(V,T,S,P) với
λ


L(G) điều có một văn phạm tương đương
G^=(V^,T,S,P^) trong dạng chuẩn Greibach.
• Nhập :
- Một văn phạm phi ngữ cảnh G =(V,T,S,P) với :
+ V : Các kí hiệu không kết thúc.
+ T : Các kí hiệu kết thúc.
+ S : Biến khởi đầu
+ P : Tập các luật sinh
• Xuất :

Trang 12
Luận Tốt Nghiệp KS2-K7
+ Một văn phạm G^=( V^,T,S,P^) với tập luật sinh P^ thuộc dạng chuẩn Greibach
Giải Thuật
Bước 1: Loại bỏ các luật sinh:
- Rỗng
- Đơn Vị - Vô dụng
Bước 2: Đánh số thứ tự các biến chẳng hạn là A
1,
A
2
...
Bước 3:Viết lại văn phạm sao cho tất cả các luật sinh có một trong các dạng sau:
A
i
---> A
j
x
j
với j > i
Z
i
---> A
j
x
j
với j ≥ i
A
i
---> ax

i
Trong đó a

T và x
i


(V ∪ T)*, còn Z
i
là các biến mới khi sử dụng khi loại bỏ đệ qui trái.
Bước 4: sau khi thực hiện bước 3 tất cả các luật sinh của A
n
phải có dạng
A
n
---> ax
n
Thay thế A
n
vào trong các xuất hiện của nó ở vị trí đầu tiên trên các vế phải của luật sinh A
n-1
bằng
các vế phải của nó. Dễ dàng thấy luật sinh A
n-1
có dạng
A
n-1
---> ax
n-1
tương tự làm theo kiểu này thay thế A

n
và A
n-1
vào các xuất hiện của chúng ở vị trí đầu tiên trên
các vế phải của luật sinh A
n-2
bằng các vế phải tương ứng của chúng. Thực hiện lần lượt cho đến
A
1
Bước 5: Thay thế A
1
A
2
...A
n
trong các xuất hiện của nó ở vị trí đầu tiên các vế phải của các luật
sinh Z
n
(nếu có) bằng các vế phải tương ứng của chúng.
Bước 6: Thay thế các ký hiệu kết thúc, chẳng hạn a, nằm bên vế phải của các luật sinh mà không ở
vị trí đầu tiên bằng các biến đại diện, chẳng hạn B
a
đồng thời thêm vào các luật sinh mới B
a
---> a.
Ví dụ:
Biến đổi văn phạm sau thành dạng chuẩn Greibach
S SBb |Ab
A Sb | Ba
B Sa | b

- Đầu tiên, ta áp dụng bước 1 đánh số thứ tự cho các biến, chẳng hạn theo thứ tự là S, A, B ta có
được văn phạm sau :
S
0
 S
0
B
2
b | A
1
b
A
1
 S
0
b | B
2
a
B
2
 S
0
a | b
- Tiếp tục thực hiện bước 2, xét các luật sinh của S
0
ta thấy luật sinh S
0
 S
0
A

1
b chưa thỏa mãn
bước 2. Loại bỏ đệ qui trái cho S
0
, ta có :
S
0
 S
0
B
2
b | A
1
b
 S
0
 A
1
b | A
1
bZ
1
(1)
Z
1
 B
2
b | B
2
bZ

1
(2)
Đến đây các luật sinh của S
0
đã thỏa mãn bước 2
- Xét tiếp các luật sinh của A
1
, ta thấy luật sinh A
1
 S
0
b là chưa thỏa mãn. Thực hiện thay thế S
0
từ (1), ta có :
A
1
 S
0
b | B
2
a
Trang 13
Luận Tốt Nghiệp KS2-K7
 A
1
 A
1
bb | A
1
bZ

1
b | B
2
a
- Đến đây xuất hiện đệ qui trái của A
1
, thực hiện việc loại bỏ đệ qui trái, ta có :
A
1
 A
1
bb | A
1
bZ
1
b | B
2
a
 A
1
 B
2
a | B
2
aZ
2
(3)
Z
2
 bb | bZ

1
b | bbZ
2
| bZ
1
bZ
2
(4)
Đến đây tất cả các luật sinh của A
1
đã thỏa mãn bước 2.
- Xét tiếp các luật sinh của B
2
, ta thấy luật sinh B
2
 S
0
a là chưa thỏa mãn bước 2, thực hiện tương
tự như trên, ta có quá trình thực hiện như sau :
B
2
 S
0
a | b (thay thế S
0
từ (1) )
 B
2
 A
1

ba | A
1
bZ
1
a | b (thay thế A
1
từ (3) )
 B
2
 B
2
aba | B
2
aZ
2
ba | B
2
abZ
1
a | B
2
aZ
2
bZ
1
a | b (loại bỏ đệ qui trái)
 B
2
 b | bZ
3

(5)
Z
3
 aba | aZ
2
ba | abZ
1
a | aZ
2
bZ
1
a | abaZ
3
| aZ
2
baZ
3
| abZ
1
aZ
3
| aZ
2
bZ
1
aZ
3
(6)
Đến đây các luật sinh của các biến S
0

, A
1
, B
2
điều thỏa mãn bước 2, và các ký hiệu đi đầu các vế
phải của các luật sinh B
2
đều là ký tự kết thúc. Aùp dụng bước 3 thay ngược trở lại B
2
vào các luật
sinh của A
1
(nếu có) và thay B
2
, A
1
vào các luật sinh của S
0
(nếu có) ta có :
A
1
 B
2
a | B
2a
Z
2
(thay thế B
2
từ (5) )

 A
1
 ba | bZ
3
a | baZ
2
| bZ
3
aZ
2
(7)
Tương tự :
S
0
 A
1
b | A
1
bZ
1
(thay thế A
1
từ (7) )
 S
0
 bab | bZ
3
ab | baZ
2
b | bZ

3
aZ
2
b | babZ
1
| bZ
3
abZ
1
| baZ
2
bZ
1
|
bZ
3
aZ
2
bZ
1
(8)
Đến đây các ký hiệu đi đầu của các luật sinh của S
0
, A
1
, B
2
đều là ký tự kết thúc, vì thế các luật
sinh này đã gần có dạng chuẩn Greibach.
- Aùp dụng bước 4, thay thế S

0
, A
1
, B
2
vào các luật sinh của Z
i
ta có :
Z
1
 B
2
b | B
2
bZ
1
(thay thế B
2
từ (5) )
 Z
1
 bb | bZ
3
b | bbZ
1
| bZ
3
bZ
1
(9)

Đến đây ta có văn phạm “gần” có dạng Greibach tương tương với văn phạm ban đầu như sau :
S
0
 bab | bZ
3
ab | baZ
2
b | bZ
3
aZ
2
b | babZ
1
| bZ
3
abZ
1
| baZ
2
bZ
1
|
bZ
3
aZ
2
bZ
1
(8)
Z

1
 bb | bZ
3
b | bbZ
1
| bZ
3
bZ
1
(9)
A
1
 ba | bZ
3
a | baZ
2
| bZ
3
aZ
2
(7)
Z
2
 bb | bZ
1
b | bbZ
2
| bZ
1
bZ

2
(4)
B
2
 b | bZ
3
(5)
Z
3
 aba | aZ
2
ba | abZ
1
a | aZ
2
bZ
1
a | abaZ
3
| aZ
2
baZ
3
| abZ
1
aZ
3
| aZ
2
bZ

1
aZ
3
(6)
- Aùp dụng bước 5, biến đổi văn phạm này thành văn phạm có dạng chuẩn Greibach tương đương
như sau :
S
0
 bXY | bZ
3
XY | bXZ
2
Y | bZ
3
XZ
2
Y | bXYZ
1
| bZ
3
XYZ
1
| bXZ
2
YZ
1
| bZ
3
XZ
2

YZ
1
Z
1
 bY | bZ
3
Y | bYZ
1
| bZ
3
YZ
1

A
1
 bX | bZ
3
X | bXZ
2
| bZ
3
XZ
2
Z
2
 bY | bZ
1
Y | bYZ
2
| bZ

1
YZ
2

B
2
 b | bZ
3

Z
3
 aYX | aZ
2
YX | aYZ
1
X | aZ
2
YZ
1
X | aYXZ
3
| aZ
2
YXZ
3
| aYZ
1
aXZ
3
| aZ

2
YZ
1
XZ
3
X  a
Y  b
Trang 14
Luận Tốt Nghiệp KS2-K7
Đến đây để đơn giản ta có thể loại bỏ các chỉ số của các biến S
0
, A
1
, B
2
và sắp xếp lại thứ tự của
các luật sinh ta được văn phạm kết quả cuối cùng như sau :
S  bXY | bZ
3
XY | bXZ
2
Y | bZ
3
XZ
2
Y | bXYZ
1
| bZ
3
XYZ

1
| bXZ
2
YZ
1
| bZ
3
XZ
2
YZ
1
A  bX | bZ
3
X | bXZ
2
| bZ
3
XZ
2
B
2
 b | bZ
3

Z
1
 bY | bZ
3
Y | bYZ
1

| bZ
3
YZ
1

Z
2
 bY | bZ
1
Y | bYZ
2
| bZ
1
YZ
2

Z
3
 aYX | aZ
2
YX | aYZ
1
X | aZ
2
YZ
1
X | aYXZ
3
| aZ
2

YXZ
3
|
aYZ
1
aXZ
3
| aZ
2
YZ
1
XZ
3
X  a
Y  b
CHƯƠNG 3
CÁC GIẢI THUẬT VÀ CÔNG CỤ PHÂN TÍCH CÚ PHÁP THÔNG DỤNG
I- GIỚI THIỆU
Hiện nay, đã có nhiều công cụ và giải thuật phân tích cú pháp, các giải thuật này có thể theo
phương pháp từ trên xuống hay từ dưới lên và có thể xử lý được lớp văn phạm phi ngữ cảnh tổng
quát hay là lớp con của nó (một tập văn phạm nhỏ của tập văn phạm phi ngữ cảnh tổng quát).
Việc tìm hiểu các giải thuật và công cụ hiện có giúp chúng ta có một cái nhìn tổng thể về việc phân
tích cú pháp cũng như có điều kiện để so sánh ưu nhược điển của từng giải thuật, hơn nữa nó giúp
tìm ra những cách giải quyết thích hợp trong vấn đề phân tích cú pháp. Sau đây chúng ta sẽ đi vào
tìm hiểu một số giải thuật và công cụ phân tích cú pháp thông dụng.
II- CÁC GIẢI THUẬT
Trong phần này tập trung tìm hiểu các giải thuật phân tích cú pháp sau :
- Giải thuật phân tích cú pháp LL.
- Giải thuật phân tích cú pháp LR.
- Giải thuật Chart Parsing.

1- Giải Thuật Phân Tích Cú Pháp LL
Giải thuật này là tiêu biểu cho phương pháp phân tích cú pháp từ trên xuống, giải thuật chỉ áp dụng
cho một tập các văn phạm hạn chế có tính chất đặt biệt gọi là LL. sau đây là cấu trúc dữ liệu chính
và hoạt động của giải thuật :
• Cấu trúc dữ liệu gồm :
+ Bộ đệm nhập chứa chuỗi nhập cần phân tích.
+ Parser : Điều khiển các hành vi của bộ phân tích.
+ Stack : Chứa các ký hiệu văn phạm trong quá trình phân tích.
+ Bảng phân tích LL
Trang 15
Luận Tốt Nghiệp KS2-K7
Hình 1 : Hoạt động của bộ phân tích cú pháp LL
Nhập :
- Văn phạm G
- Chuỗi nhập w
Xuất :
- Nếu G là văn phạm LL và w thuộc L(G) thì tạo ra dẫn xuất trái của w, ngược lại sẽ báo lỗi.
Giải Thuật :
Gọi S là ký hiệu mục tiêu của G, $ là ký hiệu kết thúc chuỗi nhập và đánh dấu stack rỗng.
Đầu tiên xây dựng bảng phân tích M cho văn phạm G, nó có dạng là một ma trận M. Trị của phần
tử M[A,a] có thể là một luật sinh mà A là vế trái, hoặc trị của phần tử này là error. Trong đó A là
ký hiệu không kết thúc, a là ký hiệu kết thúc hay ký hiệu đánh dấu kết thúc chuỗi nhập $.
Khi bộ phân tích bắt đầu hoạt động, stack chỉ chứa ký hiệu đánh dấu stack rỗng $ ở đáy stack và ký
hiệu mục tiêu S trên đỉnh.
Gọi X là ký hiệu trên đỉnh stack, a là ký hiệu trong chuỗi nhập được đọc hiện tại thi hành vi của bộ
phân tích hoạt động như sau:
• Nếu X=a=$, nghĩa là stack rỗng và chuỗi nhập được duyệt hết, thì giải thuật kết thúc và parser
thông báo quá trình phân tích chuỗi nhập thành công.
• Nếu X=a và a khác $ thì bộ phân tích sẽ đẩy X ra khỏi stack, dịch đầu đọc
đến ký hiệu nhập kế tiếp.

• Nếu X là một ký hiệu không kết thúc, thì bộ phân tích sẽ xét phần tử M[X,a] trong bảng phân
tích M. Trị của phần tử này có thể là một luật sinh mà X là vế trái hoặc trị của phần tử này
error. nếu M[X,a] = luật sinh X-->α thì giải thuật sẽ đẩy X ra khỏi stack và thêm α vào stack
sao cho ký hiệu đầu tiên của α nằm trên đỉnh stack. Luật sinh X --> α được xuất ra như một
phần của cây dẫn xuất mà bộ phân tích tìm thấy.
• Trường hợp M[X,a] là error thì bộ phân tích sẽ gọi một thủ tục xử lý lỗi thích hợp. Khi đó
chuỗi nhập không phải là câu hợp lệ của văn phạm.
Đối với văn phạm phi ngữ cảnh bất kỳ thì một phần tử của bảng phân tích có thể là đa trị. Giải
thuật parsing LL chỉ có thể áp dụng được với những văn phạm phi ngữ cảnh nào mà phần tử của
bảng phân tích tương ứng là đơn trị. đó chính là văn phạm LL đã đề cập ở trên. Dễ dàng một văn
phạm vi phạm điều kiện 1 và điều kiện 2 thì không phải là văn phạm LL , do đó giài thuật parsing
LL không thể áp dụng cho loại văn phạm trên.
Cách thức xây dựng bảng phân tích M có thể tham khảo thêm trong (Compilers - trang 190)
2- Giải Thuật Phân Tích Cú Pháp LR
Trang 16
Bảng phân tích LL
Parser
Chuỗi nhập
Xuất kết quảStack
Luận Tốt Nghiệp KS2-K7
Giải thuật này là tiêu biểu cho họ giải tthuật phân tích cú pháp từ dưới lên. Giải thuật áp dụng được
trên các tập văn phạm hạn chế có tính chất đặc biệt gọi là văn phạm LR.
Sau đây là cấu trúc dữ liệu chính và hoạt động của giải thuật :
Hình 2 : Hoạt động của bộ phân tích LR
• Bộ đệm nhập chứa chuỗi nhập cần phân tích với $ là ký hiệu đánh dấu kết thúc chuỗi nhập.
• Parser : điều khiển các hành vi của bộ phân tích.
• Stack chứa các ký hiệu văn phạm và các trạng thái xuất hiện trong quá trình phân tích, nội dung
của nó có dạng : s
0
X

1
s
1
X
2
s
2
... X
m
s
m
với s
m
nằm trên đỉnh stack. X
i
được gọi là ký hiệu văn
phạm, s
i
là trạng thái.
• Bảng Action-Goto của giải thuật phân tích cú pháp LR, nó có dạng là một ma trận với hai phần
riêng biệt action và goto.
• Phần từ action[s
m
,a] có thể chứa một trong 4 giá trị sau :
+ Shift s, với s là trạng thái.
+ Reduce α, với α là vế phải của luật sinh A --> α
+ Accept
+ Error
• Phần tử goto[s
m

,X] : có giá trị là một trạng thái s
i
nào đó, trong đó X là ký hiệu không kết thúc.
Hoạt động của Giải thuật
Nhập : Văn phạm G và chuỗi nhập w
Xuất : Nếu G là văn phạm LR và chuỗi thuộc L(G) thì tạo ra dẫn xuất cho w, ngược lại thì báo lỗi.
Giải thuật
Đầu tiên xây dựng bảng action - goto của văn phạm.
Khi giải thuật bắt đầu hoạt động, stack chỉ chứa trạng thái s
0
, bộ đệm nhập chứa chuỗi w $ (với $
nằm ở cuối bộ đệm). Gọi s là trạng thái trên đỉnh stack và a là ký hiệu nhập đang xét. Hoạt động
của giải thuật tùy thuộc vào giá trị của action[s,a] như sau :
• Nếu action[s,a] = shift s
i
: Đẩy a vào stack, sau đó là s
i
, chuyển ký hiệu kế tiếp trong chuỗi nhập
thành ký nhập sẽ xét.
• Nếu action[s,a] = reduce A  α , đặt | α | là chiều dài của α, đẩy 2*|α | ký hiệu ra khỏi stack,
đẩy A vào stack và sau đó đẩy trạng thái cho bỡi goto[s
i
,A] vào trong stack. Luật sinh A  α được
xuất ra như một phần của cây dẫn xuất.
• Nếu action[s,a] =accept : Kết thúc giải thuật và quá trình phân tích chuỗi nhập đã thành công.
• Nếu action[s,a] = error : Bộ phân tích sẽ gọi một thủ tục xử lý lỗi thích hợp. khi đó chuỗi nhập
không phải là câu hợp lệ của văn phạm.
Trang 17
Bảng Action - Goto
Parser

Chuỗi nhập
Xuất kết quảStack
Luận Tốt Nghiệp KS2-K7
Đối với một văn phạm phi ngữ cảnh tổng quát thì một phần tử của bảng action có thể là đa
trị . Giải thuật phân tích LR chỉ có thể áp dụng được với những tập văn phạm phi ngữ cảnh nào mà
một phần tử của bảng action-goto là đơn trị. Đó là văn phạm LR đã đề cập ở trên. Cách thức xây
dựng bảng action - goto xin xem thêm trong (Compilers - trang 221)
Về hiệu quả của giải thuật phân tích cú pháp LR : dễ dàng thấy độ phức tạp của giải thuật tuyến
tính theo kích thước chuỗi nhập.
Thông thường khó xác định giải thuật phân tích cú pháp LL hay LR áp dụng được với lớp văn
phạm lớn hơn, nhưng theo (Compilers-V. Aho) thì lớp văn phạm có thể phân tích bằng giải thuật
LR chứa lớp văn phạm có thể phân tích bằng giải thuật LL.
Ta cũng nhận xét tại một thời điểm trong quá trình phân tích thì giải thuật phân tích cú pháp LL chỉ
làm việc với một luật sinh mà thôi, còn giải thuật phân tích cú pháp LR có thể làm việc với nhiều
luật sinh cùng một lúc. Chính vì vậy mà giải thuật LR có khả năng phân tích tập văn phạm phức
tạp hơn giải thuật LL.
3- Giải Thuật Chart Pasing
Char pasing là một giải thuật phân tích cú pháp trên tập văn phạm phi ngữ cảnh tổng quát.
Nó có tính chất rất đặc biệt : trung hòa giữa phương pháp phân tích từ trên xuống và phương pháp
từ dưới lên. Điều đó có nghĩa là nó vừa có khả phân tích cú pháp từ trên xuống và vừa có khả năng
phân tích cú pháp từ dưới lên. sau đây là mô tả hoạt động của giải thuật:
Gọi chiều dài của chuỗi nhập là n, ta xét việc xây dựng cây dẫn xuất cho chuỗi nhập trên một sơ đồ
(chart)
Với chuỗi nhập có chiều dài n thì sơ đồ có n+1 đỉnh (vertex). Các đỉnh được đánh số từ 0 đến n.
Giữa hai đỉnh bất kỳ có thể có nhiều cung (edge), mỗi cung được biểu diễn bằng một bộ :
(<start-vertex>, <end-vertex>, <edge-lable>)
trong đó :
+ <start-vertex> : Một số tự nhiên chỉ ra đỉnh bắt đầu của cung.
+ <end-vertex> : Một số tự nhiên chỉ ra đỉnh kết thúc của cung.
+ <edge-vertex> : Đó là một luật có dấu chấm (dotted-rule). Luật có dấu chấm là luật sinh

của văn phạm có thêm dấu chấm trong luật tại một vị trí nào đó. Ví dụ :
A--> XYZ
==> A-->.XYZ
A-->X.YZ
A-->XY.Z
A-->XYZ.
Ví dụ : (1,1, S--> .AB) là một cung bắt đầu từ đỉnh 1, kết thúc cũng đỉnh 1 và luật sinh có dấu
chấm tương ứng là S--> .AB
Ta gọi một cung mà luật sinh có dấu chấm cuối cùng là một cung chết (inactive-edge), ngược lại ta
có một cung sống (active-adge).
Chart Parsing thực hiện tuân theo các qui tắc sau :
• Quy tắc cơ bản (Fundamental rule)
Trang 18
1
S --> .AB
Hình vẽ cung (1,1, S-->.AB)
Luận Tốt Nghiệp KS2-K7
Nếu sơ đồ chứa hai cung (i,j,A-->w
1
.Bw
2
) và (j, k, B--> w
3
.) trong đó A,B là các ký hiệu
không kết thúc , w
1
, w
2,
w
3

là chuỗi các ký hiệu kết thúc và không kết thúc (cũng có thể là
rỗng) thì ta thêm cung (i,k, A--> w
1
B.w
2
) vào trong sơ đồ.
• Khởi tạo (Initialization)
Khởi tạo là quá trình tạo ra các cung mà luật sinh có dấu chấm dạng :
A--> a.
Trong đó A là ký hiệu không kết thúc còn a là ký hiệu kết thúc.
Với mọi i > 0 , i≤ n thì khi khỡi tạo ta phải tìm một cung có <start-vertex> =i-1, <end-
vertex>=i và luật sinh có dấu chấm là A --> a. với a là ký hiệu thứ i trong chuỗi nhập, ngược
lại chắc chắn chuỗi nhập không phải là một câu hợp lệ của văn phạm đang xét.
• Qui tắc từ dưới lên cho chart parsing (bottom-up rule)
Nếu thêm cung (i,j,C--> w
1
.) vào sơ đồ thì với mỗi luật sinh B --> Cw
2
ta phải thêm cung
(i,i, B-->.Cw
2
) vào sơ đồ.
• Qui tắc từ trên xuống cho chart parsing (top-down rule)
- Khi khỡi tạo : với mỗi luật sinh S --> α thêm cung (0,0,S-->.α) vào sơ đồ, trong đó S là
ký hiệu mục tiêu của văn phạm.
- Nếu thêm cung (i,j, C--> w
1
.Bw
2
) vào sơ đồ thì với mỗi luật sinh B --> w, phải thêm cung

(j,j, B --> .w) vào sơ đồ.
Ví dụ: Minh họa cho qui tắc khỡi tạo của giải thuật chart parsing, chúng ta xét văn phạm sau :
S  NP VP
VP  IV
VP  IV PP
VP  TV NP
VP  TV NP VP
VP  TN NP PP
NP  Det N
NP  Det N PP
PP  P NP
với các từ vựng sau :
Từ Vựng Từ Loại
the Det
her Det
her NP
they NP
on P
see TV
report N
report IV
nurses NP
nurses N
Xét chuỗi nhập :” they see her report on the nurses”. Aùp dụng qui tắc khỡi tạo cho kết quả là sơ
đồ sau :

Trang 19
N  nurses.
N  nurses.
Det  the.

P  on.
N  report.
IV  report.
N  her.
Det  her.
TV  see.
NP  they.
Luận Tốt Nghiệp KS2-K7
III- CÔNG CỤ PHÂN TÍCH CÚ PHÁP YACC
1- Tổng Quan
Trong phần này chúng ta sẽ trình bày một bộ sinh phân tích cú pháp LARL được gọi là
Yacc. Yacc sinh ra mã đích dưới dạng ngôn ngữ C từ đó xây dựng bảng phân tích LARL và phân
tích một chuỗi nhập theo văn phạm LR(1). Yacc thường được sử dụng để xây dựng các bộ phân
tích cú pháp cho các ngôn ngữ lập trình và hiện nay Yacc là một lệnh của hệ điều hành UNIX.
2- Mô Tả Bộ Phân Tích Cú Pháp Yacc
Dưới đây là sơ đồ mô tả quá trình xây dựng bộ phân tích cú pháp từ file đặc tả Yacc :
Tập tin nhập cho Yacc là translate.y là sự đặc tả văn phạm trong ngôn ngữ Yacc. Sau khi chúng ta
tạo ra tập tin translate.y, chúng ta sẽ dùng Yacc compiler để chuyển file translate.y sang tập tin
y.tab.c (đây là tập tin với mã nguồn là ngôn ngữ C). Đây chính là bộ phân tích cú pháp cùng với
một số hàm mà người sử dụng định nghĩa trong tập tin đặc tả.
Sau khi có tập tin y.tab.c sẽ được biên dịch để tạo ra file thực thi a.out.
3- Cấu Trúc File Đặc Tả Yacc
File đặc tả có dạng tổng quát như sau :
Declarations
%%
Translation rules
%%
C-routine codes
• Phần khai báo : Khai báo các ký hiệu để sử dụng trong phần thứ 2 và thứ 3, có hai dạng khai
báo

+ Khai báo dạng C được bọc giữa hai ký hiệu %{ và %}. Các khai báo trong phần này được
đưa nguyên vào trong paser được sinh ra.
Trang 20
a.out
C Compiler
Yacc Compiler
Tập tin đặc tả
Yacc.translate.y
y.tab.c
Chuỗi Token Dẫn xuất
a.out
y.tab.c
Luận Tốt Nghiệp KS2-K7
+ Các khai báo của Yacc dùng để khai báo các token được sử dụng trong file văn phạm
hoặc khai báo độ ưu tiên, kết hợp trái, phải của các token.
• Phần các luật sinh : Mỗi luật sinh trong Yacc là một luật sinh kết hợp với các hành động ngữ
nghĩa. Các hành động ngữ nghĩa phải để ở cuối luật, mỗi luật sinh của Yacc có dạng tổng quát
như sau :
<LHS>: <alt 1> {semantic action 1}
| <alt 2> {semantic action 2}
………………………
| <alt n> {semantic action n}
Mỗi hành động ngữ nghĩa là các phát biểu C. Hành động ngữ nghĩa của luật sẽ được thực thi
khi tác vụ reduce được thực hiện trên luật đó. Do Yacc xây dựng bộ phân tích cú pháp theo
văn phạm LR(1) nên các hành động ngữ nghĩa phải để cuối luật sinh.
• Phần C-routine codes : Phần này bao gồm các đoạn mã chương trình C mà chúng ta có thể khai
báo các đoạn chương trình con để xây dựng bộ xử lý lỗi, bộ phân tích từ vựng (Yac không xây
dựng bộ phân tích từ vựng) hay các đoạn chương trình mà chúng ta có thể sử dụng trong các
hành động ngữ nghĩa.
4- Sử Dụng Yacc Với Các Văn Phạm Không Tường Minh

Đối với văn phạm không tường minh thì bộ phân tích sẽ tạo ra bảng phân tích với các ô có
nhiều giá trị (multiple entry). Do đó trong quá trình phân tích sẽ có sư đụng độ. Yacc sẽ báo cáo
các đụng độ này khi nó sảy ra. Ngoài ra, Yacc còn có khả năng giải quyết một số đụng độ bằng
cách sử dụng hai qui tắc sau :
+ Đụng độ do một phần tử trong bảng có 2 giá trị là reduce (reduce /reduce) được giải
quyết bằng cách thực hiện tác vụ reduce trên luật sinh được liệt kê trước trong file đặc
tả văn phạm.
+ Đụng độ do một phần tử trong bảng có hai giá trị, một là reduce và một là shift được giải
quyết bằng cách hực thi tác vụ shift. Quy tắc này xử lý tốt trong trường hợp không tường
minh trong cấu trúc if -then -else / if then :
if_stmt :
IF expr THEN stmt
| IF expr THEN stmt ELSE stmt
Vì các qui tắc trên có thể không phải luôn luôn là điều mà người sử dụng mong muốn, cho
nên Yacc cung cấp một cơ chế tổng quát để giải quyết đụng độ shift/reduce bằng cách cho
phép người sử dụng có thể gán độ ưu tiên và kết hợp trái/phải hoặc không có kết hợp trong
phần khai báo.
4- Khắc Vụ Lỗi Trong Yacc
Khắc phục lỗi trong Yacc có thể được thực hiện bằng cách sử dụng các luật sinh khắc phục
lỗi. Trước tiên, người sử dụng phải chọn những ký hiệu không kết thúc chính yếu (major
nonterminal) nào sẽ có thủ tục khắc phục lỗi kèm theo. Sau đó người sử dụng phải thêm vào văn
phạm các luật sinh khắc phục lỗi, các luật sinh này có dạng A  error α với A là ký hiệu không
kết thúc chính yếu, error là một token được hỗ trợ sẵn trong Yacc và α là chuỗi các ký hiệu văn
phạm. Yacc sẽ sinh ra bộ phân tích cú pháp dưới dạng đặc tả như vậy và xử lý các luật sinh trên
như các luật sinh thông thường.

Trang 21
Luận Tốt Nghiệp KS2-K7
CHƯƠNG 4
GIẢI THUẬT PHÂN TÍCH CÚ PHÁP EARLEY VÀ CYK

I- GIẢI THUẬT PHÂN TÍCH CÚ PHÁP EARLEY
1.1 Giới Thiệu
Văn phạm phi ngữ cảnh được sử dụng rộng rãi trong việc mô tả cú pháp của ngôn ngữ lập
trình và ngôn ngữ tự nhiên. Các giải thuật phân tích cú pháp cho các văn phạm phi ngữ cảnh đã và
đang đóng một vai trò rất lớn trong việc thực hiện các chương trình dịch cho ngôn ngữ lập trình và
các chương trình xử lý ngôn ngữ tự nhiên.
Earley đã đưa ra một giài thuật phân tích cú pháp cho văn phạm phi ngữ cảnh. Đây là một
giải thuật thuộc loại phân tích cú pháp từ trên xuống và xây dựng các dẫn xuất trái nhất của chuỗi
ký hiệu nhập, giải thuật này hiệu quả hơn giải thuật CYK và chúng ta cũng không đưa văn phạm về
một dạng chuẩn nào như giải thuật CYK.
Trang 22
Luận Tốt Nghiệp KS2-K7
1.2 Mô Tả Sơ Lượt Giải Thuật Earley
Ý tưởng cơ bản của giải thuật như sau :
 Cho G=(N,∑, P,S) là một văn phạm phi ngữ cảnh.
 w=a
1
a
2
… a
n
là một chuổi nhập trên ∑
*
 Một thực thể của văn phạm G là luật sinh của G có dạng :
[A X
1
X
2
… X
k

. X
k+1
… X
m
, i]
Dấu chấm nằm giữa X
k
và X
k+1
là một ký hiệu không có trong N và ∑ và i đại diện cho tập thực thể
chứa luật trên
 Với mỗi số nguyên j (0 ≤ j ≤ n), chúng ta sẽ xây dựng một danh sách các tập thực thể I
j
mà mỗi
I
j
chứa các thực thể :
• [A α . β , i] là ở trong I
j
(0 ≤ i ≤ j) nếu và chỉ nếu tồn tại γ và δ sao cho chúng ta có
S =
*
> γAδ và γ =
*
> a
1
…a
i
và α =
*

> a
i+1
… a
j
. Ý nghĩa của thực thể trên là : chúng ta đã
nhìn thấy chuỗi nhập dẫn xuất từ α đến vị trí j và đang chờ chuổi tiếp theo được dẫn
xuất từ β.
• Nếu A ∈ thì thực thể của nó là [A . ,i]
 Sau khi hình thành danh sách I
0
, I
1
, … I
n
cho chuổi nhập w, chúng ta kết luận w là một chuỗi
thuộc ngôn ngữ L(G) nếu và chỉ nếu trong I
n
có chứa ít nhất một thực thể có dạng [S α . ,0]
1.3 Giải Thuật Phân Tích Cú Pháp Của Earley
 Nhập :Văn phạm phi ngữ cảnh G=(N,∑,P,S) và chuổi nhập w= a
1
a
2
… a
n
thuộc ∑
*

 Xuất : Danh sách các tập thực thể : I
0

, I
1
, … I
n
Giải Thuật :
• Đầu tiên chúng ta xây dựng tập I
0
như sau :
(1) Nếu S α là một luật sinh trong P thì ta cho [S.α , 0] vào trong I
0
, sau đó thực hiện
bước (2) và (3) cho đến khi nào không thể thêm tập thực thể mới vào trong I
0
được nữa.
(2) Nếu [B γ . , 0] thuộc I
0
(chú ý : γ có thể là ∈) thì cho vào I
0
[A αB . β , 0] cho tất cả
các thực thể có dạng [A α . Bβ , 0] có trong I
0
(3) Nếu [A α . Bβ ,0] là một thực thể trong I
0
thì ta cho vào I
0
tất cả các luật sinh trong P có
dạng B γ các thực thể [B .γ ,0]
• Xây giờ chúng ta xây dựng I
j
sau khi đã có I

0,
I
1,
… I
j-1
(4) Với mỗi thực thể trong I
j-1
có dạng [B α . aβ ,i] (với a=a
j
) cho tập thực thể [B α a . β ,i]
vào trong I
j
Thực hiện bước (5) và (6) sau cho đến khi không còn tập thực thể mới được thêm vào :
(5) Nếu [A α . , i] là một thực thể trong I
j
, kiểm tra xem trong tập I
i
các thực thể có dạng
[B α . Aβ , k] với mỗi tập thực thể tìm được như vậy ta cho vào I
j
[B α A . β , k]
(6) Nếu [A α . Bβ, i] là một thực thể trong I
j
, tìm trong P tất cả các luật sinh có dạng B γ ta
thêm [B .γ , j] vào I
j
• Kết thúc giải thuật khi j=n
Trang 23
Luận Tốt Nghiệp KS2-K7
Như vậy : Từ ý tưởng của giải thuật trên để dễ nhớ và dễ trình bày về sau ta có thể đặt tên cho

từng tác vụ trong giải thuậtï như sau :
 (4) : Scan.
 (5) : Complete.
 (6) : Predict.
Và có thể mô tả sơ lượt giải thuật như sau, sau khi đã tạo được tập I
0
:
Giải thuật Earley chỉ dựa vào các thực thể trong tập trạng thái để quyết định tác vụ nào trong ba
tác vụ nói trên sẽ thực hiện.
• Nếu trạng thái là trạng thái không kết thúc và ký hiệu sau dấu chấm là ký hiệu không kết thúc
thì ta thực hiện tác vụ predict trên trạng thái đó bằng cách :
+ Tìm trên tập văn phạm P các luật sinh có ký hiệu vế trái trùng với kí hiệu nằm bên phải
dấu chấm của luật có dấu chấm đang xét sau đó thực hiện :
+ Thêm vào các thực thể mới vào cuối trạng thái I
i
, mỗi trạng thái mới gồm có :
- Luật sinh mà ta mới tìm được với dấu chấm nằm ở vị trí bắt đầu bên phải của luật
sinh
- Con trỏ (pointer) được đặt hàng i (trạng thái mới này sẽ không được thêm vào tập
trạng thái nếu nó đã có trong tập trạng thái)
• Nếu trạng thái là trạng thái không kết thúc, ký hiệu nằm sau dấu chấm là ký hiệu kết thúc trùng
với ký hiệu nhập đang xét thì ta thực hiện tác vụ Scan;
+ Scan đưa vào tập trạng thái I
i+1
một trạng thái giống với trạng thái cũ nhưng dấu chấm
trong luật tương ứng dịch qua phải một ký hiệu
• Nếu trạng thái là trạng thái kết thúc và chuỗi ký hiệu nhìn trước trùng với k ký hiệu nhập bắt
đầu từ vị trí i trong chuỗi nhập thì ta thực hiện tác vụ Complete:
+ Complete là tìm trong tập trạng thái I
f

(với f là pointer của thực thể đang xét ) các thực
thể có ký hiệu nằm bên phải của dấu chấm trùng với ký hiệu vế trái của thực thể có dấu
chấm đang xét, thêm các thực thể mới tìm được vào cuối trạng thái I
i
với dấu chấm dịch
qua phải một ký hiệu.
Ví dụ : Cho một văn phạm G với các luật sinh :
(1) E T+E
(2) E T
(3) T F*T
(4) T F
(5) F (E)
(6) F a
Với chuỗi nhập : w = (a+a)*a
• Đầu tiên chúng ta xây dựng tập thực thể I
0
: Cho vào I
0
các thực thể
[E  .T+E , 0] (01)
[E .T, 0] (02)
- Xét (01) áp dụng luật (3) của giải thuật ta cho vào I
0
các thực thể:
[T .F*T, 0] (03)
Trang 24
Luận Tốt Nghiệp KS2-K7
[T .F , 0 ] (04)
- Xét (02) áp dụng luật (3) của giải thuật ta cũng có được hai thực thể (03) và (04) nhưng hai thực
thể này đã tồn tại trong I

0
rồi nên ta không thêm vào.
- Xéùt (03) áp dụng luật (3) của giải thuật ta thêm vào I
0
các thực thể :
[F . (E) , 0] (05)
[F . a , 0] (06)
- Xét (04) áp dụng luật (3) của giải thuật ta cũng có được hai thực thể (05) và (06) nhưng hai thực
thể này đã tồn tại trong I
0
rồi nên ta không thêm vào. Và bây giờ không có thực thể nào được thêm
vào I
0
nữa.
I
0
[E  .T+E , 0] (01)
[E .T, 0] (02)
[T .F*T, 0] (03)
[T .F , 0 ] (04)
[F . (E) , 0] (05)
[F . a , 0] (06)
• Xây dựng I
1
từ I
0
- Vì a
1
= ( nên ta theo luật (4) ta cho vào I
1

thực thể
[F  (. E ) , 0] (11)
- Aùp dụng luật (6) trên luật (11) ta thêm vào I
1
các thực thể sau :
[E .T, 1] (12)
[T .F*T, 1] (13)
[T .F , 1] (14)
[F . (E) , 1] (15)
[F . a , 1] (16)
- Bây giờ không còn thực thể nào được thêm vào nữa
• Xây dựng I
2
:
- Do a
2
= a do đó theo luật (4) ta theo vào I
2

[F  a . , 1] (21)
- Aùp dụng luật (5) cho tập thực thể (21) ta thêm vào tập I
2
các thực thể :
[T F . *T , 1] (22)
[T F . , 1] (23)
- Aùp dụng luật (5) cho tập thực (23) vì trong I
1
có thực thể .T do đó ta thêm vào I
2
các luật :

[E T . +E , 1] (24)
[E T . , 1] (25)
- Tương tự như trên ta thêm vào I
2
luật sinh
[F  (E . ) , 0] (26)
Bây giờ không còn tập luật sinh nào được thêm vào I
2
nữa.
• Tương tự ta tính các thực thể I
3
, I
4
, ... I
7
ta được kết quả :
I
0
I
1
I
2
Trang 25
[F  (. E ) , 0]
[E .T, 1]
[T .F*T, 1]
[T .F , 1]
[F . (E) , 1]
[F . a , 1]
[F  a ., 1]

[T F . *T, 1]
[T F ., 1]
[E T . + E , 1]
[E T. , 1]
[F (E .) , 0]
[E  .T+E , 0]
[E .T, 0]
[T .F*T, 0]
[T .F , 0 ]
[F . (E) , 0]
[F . a , 0]

×