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

đồ án tốt nghiệp 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

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 (634.26 KB, 192 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
Trang
1
Luận Tốt Nghiệp KS2-K7
PHẦN 1
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.
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ó.
Trang
2
Luận Tốt Nghiệp KS2-K7
♦ 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
Chng 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.
♦ 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…
Trang
3
Luận Tốt Nghiệp KS2-K7
• …
♦ 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 : 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 chng 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 Σ
Trang
4
Luận Tốt Nghiệp KS2-K7
♦ Ví dụ :
{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ả chûi
trống được gọi là Σ
*
Trang

5
Luận Tốt Nghiệp KS2-K7
♦ Σ
+
: 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ể chû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
♦ 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
Trang
6
Luận Tốt Nghiệp KS2-K7
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.
♦ 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
Trang
7
Luận Tốt Nghiệp KS2-K7
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.
Trang
8
Luận Tốt Nghiệp KS2-K7
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 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à :
Trang
9
Luận Tốt Nghiệp KS2-K7
Đò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
CHNG 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ư :
Trang
10
A
BA cb
a
Luận Tốt Nghiệp KS2-K7
+ 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
Trang
11
Luận Tốt Nghiệp KS2-K7
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 :
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
Trang
12

Luận Tốt Nghiệp KS2-K7
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
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:
Trang
13
B
A
S
Luận Tốt Nghiệp KS2-K7
- 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.
• Giải Thuật
Bước 1 : Loại bỏ luật sinh vô dụng loại 1:
+ Khởi tạo V1={ }

Trang
14
Luận Tốt Nghiệp KS2-K7
+ 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.
Trang
15
Luận Tốt Nghiệp KS2-K7
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
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
Trang
16
Luận Tốt Nghiệp KS2-K7
- 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 :
+ 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
Trang
17
Luận Tốt Nghiệp KS2-K7
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
18
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. 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.
- 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)
Trang

19
Luận Tốt Nghiệp KS2-K7
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)
- 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
Đế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).
Trang
20
Luận Tốt Nghiệp KS2-K7
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
21
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
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.
Trang
22
Luận Tốt Nghiệp KS2-K7
• 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
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.
Trang
23
Bảng Action - Goto
Parser
Chuỗi nhập
Xuất kết quảStack
Luận Tốt Nghiệp KS2-K7
• 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.
Đố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.
Trang
24
Luận Tốt Nghiệp KS2-K7
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
Trang
25

×