Tải bản đầy đủ (.docx) (80 trang)

Nghiên cứu ngôn ngữ hình thức, văn phạm phi ngữ cảnh và automata đẩy xuống

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 (673.99 KB, 80 trang )

LỜI CẢM ƠN
Trước hết, em xin chân thành cảm ơn các thầy cô giáo trong khoa Công
nghệ thông tin Trường ĐH Kỹ thuật – Hậu cần CAND đã trang bị những kiến
thức cơ bản, cần thiết và quý báu để em thực hiện chuyên đề của mình.
Đặc biệt, em xin bày tỏ lòng kính trọng và biết ơn sâu sắc tới thầy Nghiêm
Văn Hưng, giáo viên giảng dạy, và thầy Cao Xuân Trường, người đã tận tình
hướng dẫn, chỉ bảo và tạo mọi điều kiện thuận lợi giúp em trong quá trình thực
hiện chuyên đề.
Mặc dù đã rất cố gắng cùng nhận được sự giúp đỡ tận tâm của thầy giáo
hướng dẫn, xong do trình độ còn hạn chế, tài liệu chưa được phong phú, và nội
dung này khá khó đối với em nên không tránh khỏi những thiếu sót trong quá
trình tiếp nhận kiến thức. Em rất mong nhận được sự quan tâm giúp đỡ, chỉ dẫn
của thầy cô và sự góp ý từ bạn bè để trong thời gian tới em có thể tiếp tục tìm
hiểu và xây dựng chuyên đề một cách hoàn thiện nhất.
Em xin chân thành cảm ơn!


GIỚI THIỆU TỔNG QUAN VỀ CHUYÊN ĐỀ
Tên chuyên đề: Nghiên cứu Ngôn ngữ hình thức, Văn phạm phi ngữ
cảnh và Automata đẩy xuống
Sinh viên thực hiện: Hoàng Văn Thao
Lớp: B3-D2B
Giáo viên hướng dẫn: Thiếu úy Cao Xuân Trường
Tính cấp thiết của chuyên đề:
Lý thuyết ngôn ngữ hình thức và Automata đóng một vai trò rất quan trọng
trong các cơ sở toán học của tin học. Ngôn ngữ hình thức được sử dụng trong
việc xây dựng các ngôn ngữ lập trình, lý thuyết về các chương trình dịch. Các
ngôn ngữ hình thức tạo thành một công cụ mô tả đối với các mô hình tính toán
cả cho dạng thông tin vào - ra lẫn kiểu thao tác. Lý thuyết ngôn ngữ hình thức,
chính vì thực chất của nó là một lĩnh vực khoa học liên ngành; nhu cầu mô tả
hình thức văn phạm được phát sinh trong nhiều ngành khoa học khác nhau từ


ngôn ngữ học đến sinh vật học. Do đó những khía cạnh thích hợp của lý thuyết
ngôn ngữ hình thức sẽ có tầm quan trọng quyết định trong các giáo trình về Lý
thuyết ngôn ngữ hình thức và Automata.
Lĩnh vực mà lý thuyết ngôn ngữ hình thức nghiên cứu là những mẫu hình
(pattern) có cấu trúc bên trong ngôn ngữ hình thức, và đó là những khía cạnh
hoàn toàn mang tính chất có cú pháp. Ngôn ngữ hình thức không còn đơn giản
chỉ là để định nghĩa ngôn ngữ tự nhiên, mà nó vượt ra ngoài khỏi phạm vi đó
và nó cũng là một cách để thể hiện được những quy tắc có cú pháp của ngôn
ngữ tự nhiên.
Mục tiêu của chuyên đề: Nghiên cứu tổng quan về văn phạm hình thức và
các Automata, là những công cụ sinh ngôn ngữ, đồng thời đề cập đến các tính
chất của ngôn ngữ chính quy, ngôn ngữ phi ngữ cảnh. Ngoài ra, cũng giới thiệu
sơ lược về Trình biên dịch, một phần quan trọng của học phần Chương trình
dịch gắn bó chặt chẽ với Lý thuyết ngôn ngữ hình thức và Automata, trong đó
Văn phạm phi ngữ cảnh là cơ sở lý thuyết để xây dựng Bộ phân tích cú pháp, là
thành phần quan trọng nhất trong một Trình biên dịch.
Đối tượng nghiên cứu: Ngôn ngữ hình thức và lý thuyết Automata.
Phạm vi nghiên cứu:



Ngôn ngữ phi ngữ cảnh cùng hai phương tiện để xác định chúng là Văn phạm
phi ngữ cảnh;
Automata đẩy xuống.


Phương pháp nghiên cứu:





Phương pháp nghiên cứu tài liệu;
Phương pháp chuyên gia;
Phương pháp thực nghiệm.
Nội dung nghiên cứu:





Lý thuyết về Ngôn ngữ hình thức, Văn phạm phi ngữ cảnh và Automata đẩy
xuống;
Các tính chất của Ngôn ngữ hình thức, Văn phạm phi ngữ cảnh và Automata đẩy
xuống;
Ứng dụng của Ngôn ngữ hình thức và Automata với trình biên dịch.
Chuyên đề gồm 5 chương:
Chương I: Nhập môn về văn phạm và ngôn ngữ hình thức
1.1 Khái niệm ngôn ngữ
1.2 Văn phạm và ngôn ngữ sinh bởi văn phạm
1.3 Một số tính chất của ngôn ngữ
Chương II: Văn phạm phi ngữ cảnh
2.1 Suy dẫn phi ngữ cảnh
2.2 Biến đổi các Văn phạm phi ngữ cảnh
Chương III: Automata đẩy xuống
3.1 Automata đẩy xuống không tiền định
3.2 Automata đẩy xuống và Văn phạm phi ngữ cảnh
Chương IV: Tổng quan về trình biên dịch
4.1 Ngôn ngữ lập trình
4.2 Trình biên dịch
4.3 Ứng dụng của Văn phạm phi ngữ cảnh và Automata đẩy xuống với

trình biên dịch
Chương V: Demo một bài toán
5.1 Bài toán và cơ sở lý thuyết
5.2 Demo ví dụ về sự tương đương giữa BTCQ và NFAε
Sản phẩm:




Báo cáo chuyên đề;
Chương trình demo cơ bản.


MỤC LỤC


MỤC LỤC HÌNH

MỤC LỤC BẢNG


LỜI NÓI ĐẦU
Ngôn ngữ là phương tiện để giao tiếp, sự giao tiếp có thể hiểu là giao
tiếp giữa con người với nhau, giao tiếp giữa người với máy, hay giao tiếp giữa
máy với máy. Ngôn ngữ để con người có thể giao tiếp với nhau được gọi là
ngôn ngữ tự nhiên, chẳng hạn như tiếng Anh, tiếng Nga, tiếng Việt… là các
ngôn ngữ tự nhiên. Các quy tắc cú pháp của ngôn ngữ tự nhiên nói chung rất
phức tạp nhưng các yêu cầu nghiêm ngặt về ngữ nghĩa thì lại thiếu chặt chẽ,
chẳng hạn cùng một từ hay cùng một câu ta có thể hiểu chúng theo những
nghĩa khác nhau tùy theo từng ngữ cảnh cụ thể. Con người muốn giao tiếp với

máy tính tất nhiên cũng thông qua ngôn ngữ. Để có sự giao tiếp giữa người với
máy hay giữa máy với nhau, cần phải có một ngôn ngữ với các quy tắc cú pháp
chặt chẽ hơn so với các ngôn ngữ tự nhiên, nói cách khác, với một từ hay một
câu thì ngữ nghĩa của chúng phải là duy nhất mà không phụ thuộc vào ngữ
cảnh. Những ngôn ngữ như thế được gọi là ngôn ngữ hình thức. Con người
muốn máy tính thực hiện công việc, phải viết các yêu cầu đưa cho máy bằng
ngôn ngữ máy hiểu được. Việc viết các yêu cầu như thế gọi là lập trình. Ngôn
ngữ dùng để lập trình được gọi là ngôn ngữ lập trình. Các ngôn ngữ lập trình
đều là các ngôn ngữ hình thức.
Cả ngôn ngữ hình thức lẫn ngôn ngữ tự nhiên đều có thể xem như những
tập các từ, tức là các xâu hữu hạn các phần tử của một bộ chữ cái cơ sở nào đó.
Về mặt truyền thống, lý thuyết ngôn ngữ hình thức liên quan đến các đặc tả cú
pháp của ngôn ngữ nhiều hơn là đến những vấn đề ngữ nghĩa. Một đặc tả về
cú pháp của một ngôn ngữ có hữu hạn từ, ít nhất về nguyên tắc, có thể được
cho bằng cách liệt kê các từ. Điều đó không thể áp dụng đối với các ngôn ngữ
có vô hạn từ. Nhiệm vụ chính của lý thuyết ngôn ngữ hình thức là nghiên cứu
các cách đặc tả hữu hạn của các ngôn ngữ vô hạn.
Lý thuyết ngôn ngữ hình thức và ôtômat đóng một vai trò rất quan trọng
trong các cơ sở toán học của tin học. Ngôn ngữ hình thức được sử dụng trong
việc xây dựng các ngôn ngữ lập trình, lý thuyết về các chương trình dịch. Các
ngôn ngữ hình thức tạo thành một công cụ mô tả đối với các mô hình tính toán
cả cho dạng thông tin vào-ra lẫn kiểu thao tác. Lý thuyết ngôn ngữ hình thức,
chính vì thực chất của nó là một lĩnh vực khoa học liên ngành; nhu cầu mô tả
hình thức văn phạm được phát sinh trong nhiều ngành khoa học khác nhau từ
ngôn ngữ học đến sinh vật học.
Báo cáo này nhằm trình bày về văn phạm hình thức và ôtômat đẩy xuống,
là những công cụ sinh ngôn ngữ, đồng thời đề cập đến các tính chất của ngôn
ngữ chính quy, ngôn ngữ phi ngữ cảnh, ngôn ngữ đệ quy và ngôn ngữ đệ quy
đếm được. Ngoài ra cũng giới thiệu sơ lược về trình biên dịch, một phần quan
trọng của học phần Chương trình dịch/.

Chuyên đề gồm 8 phần chính:
Lời mở đầu: Giới thiệu về chuyên đề
6


Chương I: Nhập môn về văn phạm và ngôn ngữ hình thức
Chương II: Văn phạm phi ngữ cảnh
Chương III: Automata đẩy xuống
Chương IV: Tổng quan về trình biên dịch
Chương V: Giới thiệu về chương trình Demo
Kết luận: Đưa ra một số đánh giá tổng quan về kết quả nghiên cứu, nêu ra
hướng phát triển trong thời gian tới.
Tài liệu tham khảo: Đưa ra các tài liệu đã được trích dẫn, tham khảo khi
thực hiện chuyên đề.

7


1

NHẬP MÔN VỀ VĂN PHẠM VÀ NGÔN NGỮ HÌNH THỨC

1.1. Khái niệm ngôn ngữ
1.1.1. Các khái niệm cơ bản
1.1.1.1. Bảng chữ cái
Theo tài liệu [3], tác giả: Phan Đình Diệu, có viết “Một dãy hữu hạn hay
vô hạn các phần tử, kí hiệu Σ được gọi là một bảng chữ cái trong đó mỗi phần
tử a ∈ Σ được gọi là một kí hiệu (một chữ cái).”.
Từ đó ta có Định nghĩa I.1.
Định nghĩa I.1

Tập Σ khác rỗng gồm hữu hạn hay vô hạn các ký hiệu được gọi là bảng
chữ cái. Mỗi phần tử a∈ Σ được gọi là một chữ cái hay một ký hiệu.
Thí dụ 1.1:
Dưới đây là các bảng chữ cái:
∑ = {a, b, c, …, x, y, z},
Δ = {α, β, γ, δ, ε, η, ϕ, κ, µ, χ, ν, π, θ, ρ, σ, τ, ω,ξ, ψ},
Г = {0, 1},
W = {if, then, else, a, b, c, d, e, f, +, −, ∗, /, =, ≠}.
1.1.1.2. Từ
Định nghĩa I.2
Giả sử có bảng chữ cái Σ = {a1, a2, …, am}, một dãy các chữ cái α = ai1
ai2 … ait, với aij ∈ Σ (1 ≤ j ≤ t) được gọi là một từ hay một xâu trên bảng chữ
cái Σ.
Tổng số vị trí của các ký hiệu xuất hiện trong xâu α được gọi là độ dài của
từ α và ký hiệu là | α |. Như vậy, một từ trên bảng chữ cái Σ là một xâu hữu hạn
gồm một số lớn hơn hay bằng không các chữ cái của Σ, trong đó một chữ cái có
thể xuất hiện nhiều lần.
Xâu không có chữ cái nào được gọi là từ rỗng và được ký hiệu là ε. Rõ
ràng từ rỗng là từ thuộc mọi bảng chữ cái. Hai từ α = a1a2…an và β = b1b2…
bm được gọi là bằng nhau, và được ký hiệu là α = β, nếu n = m và ai = bi với
mọi i = 1, 2, …, n.
Nếu α là một từ trên bảng chữ cái Σ, và Σ ⊆ Δ thì α cũng là từ trên bảng
*,
chữ cái Δ. Tập mọi từ trên bảng chữ cái Σ được ký hiệu là Σ còn tập mọi từ
+
+
*
khác rỗng trên bảng chữ cái Σ được ký hiệu là Σ . Như vậy Σ = Σ \ {ε} và
8



*
+
*
+
Σ = Σ ∪ {ε}. Dễ thấy rằng các tập Σ và Σ là vô hạn.
*
Về cấu trúc đại số thì Σ là một vị nhóm tự do sinh bởi Σ với đơn vị là từ
+
rỗng ε, còn Σ là một nửa nhóm tự do sinh bởi Σ. Có thể chứng minh được rằng
*
+
các tập Σ và Σ là vô hạn đếm được.
Thí dụ 1.2:
Ta có ε , 0, 01, 101, 1010, 110011 là các từ trên bảng chữ cái Г = {0,1}.
Các xâu ε, beautiful, happy, holiday là các từ trên bảng chữ cái Σ = {a, b, c, …,
z}.
1.1.1.3. Ngôn ngữ
Định nghĩa I.3
*
Cho bảng chữ cái Σ, mỗt tập con L ⊆ Σ được gọi là một ngôn ngữ hình
thức (hay ngôn ngữ) trên bảng chữ cái Σ.
Tập rỗng, ký hiệu ∅, là một ngôn ngữ không gồm một từ nào và được gọi
là ngôn ngữ rỗng. Vậy ngôn ngữ rỗng là ngôn ngữ trên mọi bảng chữ cái.
Chú ý rằng ngôn ngữ rỗng: L = ∅ là khác với ngôn ngữ chỉ gồm một từ
rỗng: L = {ε}.
Thí dụ 1.3:
*
+
• Σ là ngôn ngữ gồm tất cả các từ trên Σ còn Σ là ngôn ngữ gồm tất cả

các từ khác từ trống trên Σ.
• L = { ε, 0, 1, 01, 10, 00, 11, 011,100} là một ngôn ngữ trên bảng chữ cái
Г = {0, 1}.
• L = {a, b, c, aa, ab, ac, abc} là ngôn ngữ trên bảng chữ cái Σ = {a, b, c}.
n n
• L1 = {ε, a, b, abb, aab, aaa, bbb, abab}, L2 = {a b | n∈ N} là hai ngôn
ngữ trên bảng chữ Σ = {a, b}, L1 là ngôn ngữ hữu hạn trong khi L2 là ngôn
ngữ vô hạn. Mỗi từ thuộc ngôn ngữ L2 có số chữ cái a bằng số chữ cái b với a
và b không xen kẽ, a nằm ở phía trái và b ở phía phải của từ.
1.1.2. Các phép toán trên các từ
1.1.2.1. Phép nhân ghép
Theo tài liệu [5], tác giả: Nguyễn Văn Định, có viết “Tích ghép (hay nhân
ghép) của hai từ α = a1a2…am và từ β = b1b2…bn trên bảng chữ cái Σ,
là từ γ = a1a2…amb1b2…bn trên bảng chữ cái Σ.
Kí hiệu phép nhân ghép là γ = α.β (hay γ = αβ).”
9


Từ đó ta có Định nghĩa I.4.
Định nghĩa I.4
Tích ghép (hay nhân ghép) của hai từ α = a1a2…am và từ β = b1b2…
bn trên bảng chữ cái Σ, là từ γ = a1a2…amb1b2…bn trên bảng chữ cái Σ.
Kí hiệu phép nhân ghép là γ = α.β (hay γ = αβ).
Thí dụ 1.4:
Trên bảng chữ cái W = {if, then, else, a, b, c, d, e, f, +, −, ∗, /, =, ≠}, ta có
các từ α = if a+b=c then c∗d=e và β = else c/d=f, còn αβ là từ: if a+b=c then
c∗d=e else c/d=f.
Cho Σ = {a, b, c}, khi đó: Từ ω = abcbcb chứa 2 vị trí của bcb, đó là
a*bcb*cb và abc*bcb*, φ = bcb là một từ con của ω. Từ ω chứa một vị trí
của ký hiệu a, đó là *a*bcbcb.

Từ ω = 010111001 trên bảng chữ cái {0, 1} có độ dài 9, trong đó 0101 là
tiền tố và 11001 là hậu tố của ω.
1.1.2.2. Phép lấy từ ngược
Theo tài liệu [5], tác giả: Nguyễn Văn Định, có viết “Giả sử có từ khác
rỗng ω = a1a2 …am trên bảng chữ cái Σ, khi đó từ am am-1… a2a1 được gọi
R
^
là từ ngược (hay từ soi gương) của từ ω, và được ký hiệu là ω , hay ω .
R
Khi ω = ε ta quy ước ε = ε.”
Từ đó ta có Định nghĩa I.5.
Định nghĩa I.5
Giả sử có từ khác rỗng ω = a1a2 …am trên bảng chữ cái Σ, khi đó từ am
am-1… a2 a1 được gọi là từ ngược (hay từ soi gương) của từ ω, và được ký hiệu
R,
^
là ω hay ω .
Khi ω = ε ta quy ước εR = ε.
Thí dụ 1.5:
Cho các từ α = 100110 và β = aabb trên bảng chữ cái {0,1,a,b}, theo định
nghĩa ta có:
R
RR
R
α = 011001 và (α ) = (011001) = 100110 = α.
R
RR
R
β = bbaa và (β ) = (bbaa) = aabb = β.
Cho các từ happy và oto trên bảng chữ cái ∑ = {a, b, c, …x, y, z}, khi đó ta

10


R
R
R
có: (happy) = yppah và (oto) = oto. Ngoài ra ta có: | (happy) | = | yppah| = |
happy | = 3.
1.1.2.3. Phép chia từ
Là phép toán ngắt bỏ phần đầu hay phần cuối của một từ. Ta có các
định nghĩa sau:


Phép chia trái của từ α cho từ β (hay thương bên trái của α và β) cho kết quả là
phần còn lại của từ α sau khi ngắt bỏ phần đầu β trong từ α, và được ký hiệu là
β\



α

Phép chia phải của từ α cho từ γ (hay thương bên phải của α và γ) cho kết
quả là phần còn lại của từ α sau khi ngắt bỏ phần cuối γ trong từ α, và được
αγ
ký hiệu là /
1.1.3. Các phép toán trên ngôn ngữ.
Các họ ngôn ngữ cụ thể thường được đặc trưng một cách tiện lợi qua các
phép toán xác định trên ngôn ngữ, họ đó gồm các ngôn ngữ nhận được bằng
việc tổ hợp từ một số ngôn ngữ cho trước bởi một số phép toán nào đó. Vì mỗi
ngôn ngữ là một tập hợp nên ta có các phép toán đại số tập hợp như là phép

giao, phép hợp, phép hiệu, phép lấy bù trên các ngôn ngữ. Chẳng hạn, với L1
và L2 là hai ngôn ngữ trên bảng chữ cái Σ thì ta cũng có các ngôn ngữ mới sau
*
đây trên bảng chữ cái Σ: L1 ∪ L2, L1 ∩ L2, L1.L2, Σ \ L1.
1.1.3.1. Phép hợp
Theo tài liệu [9], tác giả: Nguyễn Quốc Thắng – Nguyễn Lâm Tùng, có
viết “Tập các từ {x | x ∈ L1 hoặc x ∈ L2 } được gọi là hợp của hai ngôn ngữ L1
và L2, ký hiệu L1∪ L2.”.
Từ đó ta có Định nghĩa I.6.
Định nghĩa I.6
Hợp của hai ngôn ngữ L1 và L2 trên bảng chữ cái ∑, ký hiệu L1∪ L2, là
một ngôn ngữ trên bảng chũ cái ∑, đó là tập từ:
L = {ω ∈ Σ* | ω ∈ L1 hoặc ω ∈ L2 }
Định nghĩa phép hợp có thể mở rộng cho một số hữu hạn các ngôn ngữ,
tức là hợp của các ngôn ngữ L1, L2, …, Ln trên bảng chữ cái Σ, là tập từ:
n

U L = { ω ∈∑ *| ω = L
i =1

i

ω ∈ L2

i



11


}


1.1.3.2. Phép giao
Định nghĩa I.7
Giao của hai ngôn ngữ L1 và L2 trên bảng chữ cái ∑, ký hiệu L1∩ L2, là
một ngôn ngữ trên bảng chữ cái ∑, đó là tập từ:
L = {ω ∈ Σ* | ω ∈ L1 và ω ∈ L2 }
Định nghĩa phép giao có thể mở rộng cho một số hữu hạn các ngôn ngữ,
tức là giao của các ngôn ngữ L1, L2, …, Ln trên bảng chữ cái Σ, là tập từ:
n

I

i =1

Li =
{ω ∈ Σ* | ω ∈ Li, với mọi i, 1 ≤ i ≤ n }

1.1.3.3. Phép lấy phần bù
Định nghĩa I.8
Ngôn ngữ phần bù của ngôn ngữ L trên bảng chữ cái Σ, ký hiệu CΣL
(hay đơn giản là CL, nếu không gây nhầm lẫn), là một ngôn ngữ trên bảng chữ
cái ∑, đó là tập từ: CΣL = {ω ∈ Σ* | ω ∉ L }.
Thí dụ 1.6:
Cho ngôn ngữ L1 = {ε, 0, 01}, L2 = {ε, 01, 10} trên bảng chữ cái Σ = {0,
1}, khi đó ta có: L1∪ L2 = {ε, 0, 01, 10}, L1 ∩ L2 = {ε, 01}.
Cho ngôn ngữ L = {ω ∈ ∑*, với | ω | là một số chẵn }, khi đó ta có: CΣL =
+,
{ω ∈ ∑ với | ω | là một số lẻ}.

1.1.3.4. Phép nhân ghép
Định nghĩa I.9
Cho hai ngôn ngữ L1 trên bảng chữ Σ1 và L2 trên bảng chữ Σ2. Nhân
ghép hay tích của hai ngôn ngữ L1 và L2 là một ngôn ngữ trên bảng chữ Σ1
∪ Σ2, ký hiệu L1L2, đuợc xác định bởi: L1L2 = {αβ | α∈L1 và β∈L2}.
Thí dụ 1.7:
Đây là một phản ví dụ để chỉ ra rằng phép nhân ghép không có tính phân
phối đối với phép giao. Phép hợp, phép giao không có tính phân phối đối với
phép nhân ghép. Xét các ngôn ngữ L1 = {0, 01}, L2 = {01, 10}, L3 = {0} trên
bảng chữ cái Σ = {0, 1}.
Có thể kiểm tra được rằng phép nhân ghép không có tính phân phối đối với
phép giao: Ta có: L2 ∩ L3 = ∅, do đó: L1(L2 ∩ L3) = ∅,
Mặt khác, ta có L1L2 = {001, 010, 0101, 0110} và L1L3 = {00, 010}, do
12


đó: (L1L2) ∩ (L1L3) = {010}. Vậy L1(L2 ∩ L3) ≠ (L1L2) ∩ (L1L3), tức là
phép nhân ghép không có tính phân phối đối với phép giao.
Kiểm tra tính phân phối của phép hợp, phép giao đối với phép nhân ghép:
Ta có: L2L3 = {010, 100}, do đó: L1 ∪ (L2L3) = {0, 01, 010, 100},
Mặt khác ta cũng có L1 ∪ L2 = {0, 01, 10} và L1 ∪ L3 = {0, 01}, do đó:
(L1 ∪ L2)(L1 ∪ L3) = {00, 001, 010, 0101, 100, 1001}. Vậy L1 ∪ (L2L3)
≠ (L1 ∪ L2)(L1 ∪ L3), tức là phép hợp không có tính phân phối đối với phép
nhân ghép. Tương tự, đối với phép giao, ta có: L2L3 = {010, 100}, do đó: L1
∩ (L2L3) = ∅.
Mặt khác L1 ∩ L2 = {01}, L1 ∩ L3 = {0}, do đó: (L1 ∩ L2)(L1 ∩ L3) =
{010}. Vậy L1 ∩ (L2L3) ≠ (L1 ∩ L2)(L1 ∩ L3). Tức là phép giao không có
tính phân phối đối với phép nhân ghép. Vì phép ghép ngôn ngữ có tính kết hợp
n
nên ký hiệu L được dùng với mọi ngôn ngữ L và số tự nhiên n theo nghĩa

quen thuộc sau:
{ ε } khi n = 0,

Ln =  L khi n = 1,
 Ln −1 L khi n > 1.


1.1.3.5. Phép lặp
Định nghĩa I.10
Cho ngôn ngữ L trên bảng chữ cái Σ, khi đó:




{ε }

∪ L ∪ L2 ∪ ..... ∪ Ln ∪ .... = U Ln
n =1

Tập từ
được gọi là ngôn ngữ lặp cắt của ngôn
*
ngữ L, ký hiệu là L . Vậy ngôn ngữ lặp của L là tập hợp lũy thừa của L:


UL
L*=

n


n =1



L ∪ L2 ∪ ... ∪ Ln ∪ ... = U Ln



n =1

Tập từ
được gọi là ngôn ngữ lặp cắt của ngôn ngữ L, ký
+
hiệu là L , Vậy ngôn ngữ lặp cắt của L là hợp của mọi lũy thừa dương của L:


UL
L+=

n

n =1

Thí dụ 1.8:
+ Xét ngôn ngữ L = {0, 1} trên bảng chữ Σ = {0, 1}. Ta có:
13


2
L = {00, 01, 10, 11}, tập hợp các xâu nhị phân độ dài 2;

3
L = {000, 001, 010, 011, 100, 101, 110, 111}, tập hợp các xâu nhị phân
n
*
độ dài 3. Tương tự, L là tập hợp các xâu nhị phân độ dài n. Vì vậy, L là tập
hợp tất cả các xâu nhị phân.
+ Xét hai ngôn ngữ trên bảng chữ Σ = {a}:
L1 = {a
L2 = {a

2n

| n ≥ 1},

5n+3

| n ≥ 0}.

2 +
5 * 3
Khi đó, ta có L1 = {a } , L2 = {a } {a }.
1.1.3.6. Phép lấy ngôn ngữ ngược
Định nghĩa I.11
Cho ngôn ngữ L trên bảng chữ cái Σ, khi đó ngôn ngữ ngược của L là
R
^
một ngôn ngữ trên bảng chữ cái ∑, được ký hiệu là L hay L , là tập từ:
R
R
L = {ω ∈ Σ* / ω ∈ L}

Thí dụ 1.9:
Cho L = {ε, ab, abc, cbaa} là một ngôn ngữ trên bảng chữ cái Σ = {a, b, c},
R
khi đó L = {ε, ba, cba, aabc} là ngôn ngữ ngược của L.
1.1.3.7. Phép chia ngôn ngữ
Định nghĩa I.12
Cho ngôn ngữ X và Y trên bảng chữ cái Σ, khi đó thương bên trái của
X,
ngôn ngữ X cho ngôn ngữ Y là một ngôn ngữ trên ∑, được ký hiệu là Y \

tập từ:
Y\

X

= {z ∈ Σ* / x ∈ X, y ∈ Y mà x = yz}

Cho ngôn ngữ X và Y trên bảng chữ cái Σ, khi đó thương bên phải của ngôn
X
ngữ X cho ngôn ngữ Y là một ngôn ngữ trên ∑, được ký hiệu là /Y, là tập từ:
X

/ Y = {z ∈ Σ* / x ∈ X, y ∈ Y mà x = zy}

1.2. Văn phạm và ngôn ngữ sinh bởi văn phạm
Ta có thể hình dung một văn phạm như một “thiết bị tự động” mà nó có
khả năng sinh ra một tập hợp các từ trên một bảng chữ cái cho trước. Mỗi từ
14



được sinh ra sau một số hữu hạn bước thực hiện các quy tắc của văn phạm.
Việc xác định một ngôn ngữ trên bảng chữ cái cho trước có thể được thực
hiện bằng một trong các cách thức sau:


Cách 1. Đối với mỗi từ thuộc ngôn ngữ đã cho, ta có thể chọn một quy cách
hoạt động của “thiết bị tự động” để sau một số hữu hạn bước làm việc nó dừng
và sinh ra chính từ đó.



Cách 2. “Thiết bị tự động” có khả năng lần lượt sinh ra tất cả các từ trong ngôn
ngữ đã cho.



Cách 3. Với mỗi từ ω cho trước, “thiết bị tự động” có thể cho biết từ đó có
thuộc ngôn ngữ đã cho hay không.
Trong lý thuyết văn phạm, người ta đã chứng minh được rằng ba cách
thức trên là tương đương nhau hay văn phạm làm việc theo các cách trên là
tương đương nhau. Vì vậy, ở đây ta quan tâm đến cách thứ nhất, tức là ta xét
văn phạm như là một “thiết bị tự động” sinh ra các từ. Vì lẽ đó mà người ta còn
gọi các “thiết bị tự động” đó là văn phạm sinh.
1.2.1. Định nghĩa văn phạm
Theo tài liệu [2], tác giả: Trần Văn Lộc, có viết: “Văn phạm G là 1 bộ sắp
thứ tự gồm 4 thành phần: G = < Σ,



, S, P >…”


Từ đó ta có Định nghĩa I.13.
Định nghĩa I.13
Văn phạm G là 1 bộ sắp thứ tự gồm 4 thành phần: G = < Σ,
trong đó:




, S, P >,

Σ là một bảng chữ cái, gọi là bảng chữ cái cơ bản (hay bảng chữ cái kết thúc),
mỗi phần tử của nó được gọi là một ký hiệu kết thúc hay ký hiệu cơ bản;






là một bảng chữ cái,
∩ Σ = ∅, gọi là bảng ký hiệu phụ (hay báng chữ
cái không kết thúc), mỗi phần tử của nó được gọi là một ký hiệu không kết
thúc hay ký hiệu phụ.




S∈
được gọi là ký hiệu xuất phát hay tiên đề;
P là tập hợp các quy tắc sinh có dạng α→β, α được gọi là vế trái và β được gọi

∆ *
là vế phải của quy tắc này, với α, β ∈ (Σ ∪ ) và trong α chứa ít nhất một
ký hiệu không kết thúc.



P = {α→β | α = α’Aα’’, với A ∈ Δ, α’, α’’, β ∈ (Σ ∪




)

*

}

Chẳng hạn, với Σ = {0,1},
= {S, A, B} thì các quy tắc S → 0S1A,
0AB → 1A1B, A → ε,… là các quy tắc hợp lệ vì vế trái luôn chứa ít nhất 1
15




ký hiệu phụ thuộc . Nhưng các quy tắc dạng 0 → A, 01 → 0B,… là các
quy tắc không hợp lệ.
Thí dụ 1.10:
Các bộ bốn sau là các văn phạm:
• G1 = <{0,1},{S},S,{S→0S1,S→ε}>,

• G2 = <{a, b}, {S, A}, S, {S→Ab, A→aAb, A→ε}>,
• G3 = <{a, b, c}, {S, A, B, C}, S, {S→ABC, A→aA, B→bB, C→cC,
A→a, B→b, C→c}>
Chú ý: Nếu các quy tắc có vế trái giống nhau có thể viết gọn lại: hai quy
tắc α→ β, α→ γ có thể được viết là α→ β | γ. Chẳng hạn, như trong văn phạm
G1 ở thí dụ 1.10, ta có thể viết hai quy tắc của nó dưới dạng S→0S1 | ε.
1.2.2. Ngôn ngữ sinh bởi văn phạm
Định nghĩa I.14
∆ *
, S, P > và η, ω∈(Σ ∪ ) . Ta nói ω được
G
suy dẫn trực tiếp từ η trong G, ký hiệu η├ ω hay ngắn gọn là η├ ω (nếu
∆ *
không sợ nhầm lẫn), nếu tồn tại quy tắc α→β∈P và γ, δ∈(Σ ∪ ) sao cho
η = γαδ, ω = γβδ.

Cho văn phạm G = < Σ,



Điều này có nghĩa là nếu η nhận vế trái α của quy tắc α→β như là từ con
thì ta thay α bằng β để được từ mới ω.
∆ *
, S, P > và η, ω∈(Σ ∪ ) . Ta nói ω được
G
suy dẫn từ η trong G, ký hiệu η╞ ω hay ngắn gọn là η╞ ω (nếu không sợ
∆ *
nhầm lẫn), nếu η = ω hoặc tồn tại một dãy D = ω0, ω1,…, ωk∈(Σ ∪ )
sao cho ω0 = η, ω k = ω và ωi-1├ ωi, với i = 1, 2,..., k.


Cho văn phạm G = < Σ,



Dãy D = ω0, ω1, …, ωk được gọi là một dẫn xuất của ω từ η trong G và
số k được gọi là độ dài của dẫn xuất này. Nếu ω0 = S và ωk ∈ Σ* thì dãy D gọi
là dẫn xuất đầy đủ.
Nếu ωi được suy dẫn trực tiếp từ ωi-1 bằng việc áp dụng một quy tắc p
nào đó trong G thì ta nói quy tắc p được áp dụng ở bước thứ i.


Cho văn phạm G = < Σ, , S, P >. Từ ω∈Σ* được gọi là sinh bởi văn
phạm G nếu tồn tại suy dẫn S╞ ω. Ngôn ngữ sinh bởi văn phạm G, ký hiệu
L(G), là tập hợp tất cả các từ sinh bởi văn phạm G:
16


*
G
L(G) = {ω∈Σ | S ╞ ω}.


Hai văn phạm G1 = < Σ1, 1, S1, P1 > và G2 = < Σ2,
được gọi là tương đương nếu L(G1) = L(G2).



2, S2,P2 >

Thí dụ 1.11:

Xét văn phạm G1 trong thí dụ 1.11 Từ ω = 00001111 được suy dẫn từ S
bằng dãy dẫn xuất độ dài 5: S├ 0S1├ 00S11├ 000S111├ 0000S1111 ├
4 4
00001111 (có thể viết ngắn gọn là ω = 0 1 ). Bằng việc sử dụng n lần (n ≥ 0)
n n
n n
quy tắc 1 rồi quy tắc 2, ta có: S╞ 0 1 . Do đó L(G1) = {0 1 | n ≥ 0}.
Xét văn phạm G2 trong thí dụ 1.10 Sử dụng quy tắc 1, rồi n lần (n ≥ 0)
n n
n n+1
quy tắc 2, sau đó quy tắc 3 để kết thúc, ta có: S├ Ab╞ a Ab b├ a b
.
n n+1
Do đó L(G2) = {a b
| n ≥ 0}.
Dễ dàng thấy rằng: L(G4) = {tôi ăn cơm, anh ăn cơm, chị ăn cơm, tôi ăn
phở, anh ăn phở, chị ăn phở, tôi uống sữa, anh uống sữa, chị uống sữa, tôi
uống café, anh uống café, chị uống café}.
Ta có thể biểu diễn việc dẫn xuất từ <câu> đến một từ trong L(G4),
chẳng hạn “tôi ăn cơm” bằng một cây gọi là cây dẫn xuất hay cây phân tích
cú pháp như dưới đây. Tất nhiên, theo quan điểm phân tích cú pháp thực tế,
việc xem xét các quy tắc theo hướng ngược lại là từ phải qua trái. Điều đó có
nghĩa là cây dưới đây được xử lý từ dưới lên trên chứ không phải là từ trên
xuống dưới. (Hình 1.1).

Hình 1.1 Cây dẫn xuất cho ví dụ
1.2.3. Phân loại văn phạm theo Chomsky
Theo tài liệu [8], tác giả: Trần Văn Ban, có viết “Trong định nghĩa của văn
phạm G = (VN, ∑, P, S); VN là tập các biến, ∑ là tập chữ cái và S ∈VN. Để tiện
17



lợi cho việc nghiên cứu và khảo sát các ngôn ngữ được sinh ra bởi văn phạm,
chúng ta tìm cách phân loại chúng. Muốn phân loại được các ngôn ngữ, chúng
ta phải dựa vào các dạng khác nhau của các qui tắc dẫn xuất. Chomsky đã chia
các qui tắc dẫn xuất của văn phạm G thành bốn loại …”
Dựa vào đặc điểm của tập quy tắc mà người ta chia các văn phạm thành
các nhóm khác nhau. Noam Chomsky (Institute Professor, Massachusetts
Institute of Technology. Born December 7, 1928 Philadelphia, Pennsylvania,
USA) đã phân loại văn phạm thành bốn nhóm:


Nhóm 0: Văn phạm không hạn chế (hay văn phạm ngữ cấu, văn phạm tổng
quát),



Nhóm 1: Văn phạm cảm ngữ cảnh,



Nhóm 2: Văn phạm phi ngữ cảnh,



Nhóm 3: Văn phạm chính quy.
Dưới đây là các định nghĩa cho các nhóm văn phạm nói trên.
Định nghĩa I.15



Văn phạm G = < Σ, , S, P > mà không có một ràng buộc nào đối với
các quy tắc của nó được gọi là văn phạm tổng quát hay văn phạm không hạn
chế.
Như vậy, các quy tắc trong văn phạm nhóm 0 có dạng: α→β, với α =
∆ *
α’Aα’’, A ∈ Δ, α’, α’’, β ∈ (Σ ∪ ) .Các quy tắc của văn phạm nhóm 0
được gọi là quy tắc không hạn chế. Ngôn ngữ do văn phạm nhóm 0 sinh ra
được gọi là ngôn ngữ tổng quát.
Văn phạm G = < Σ,



, S, P > mà các quy tắc của nó đều có dạng:
∆ *
α→β, với α = α’Aα’’, A ∈ Δ, α’, α’’, β ∈ (Σ ∪ ) , và | α | ≤ | β |, được gọi
là văn phạm nhóm 1hay văn phạm cảm ngữ cảnh.
Các quy tắc trong văn phạm nhóm 1 được gọi là quy tắc cảm ngữ cảnh.
Ngôn ngữ do văn phạm cảm ngữ cảnh sinh ra được gọi là ngôn ngữ cảm ngữ
cảnh.
Các văn phạm mà các quy tắc của chúng có dạng trên, đồng thời chứa
thêm quy tắc rỗng S→ε, cũng được xếp vào lớp văn phạm nhóm 1.
Thí dụ 1.12:
Cho văn phạm: G1 = <{1}, {S, A, B}, S, P1 >, với P1 = {S→ε, S→1A,
2n
A→1B, B→1A, A→1}. Khi đó, G1 là văn phạm chính quy và L(G1) = {1 |
2n
2n
n ≥ 0}. Thật vậy, sử dụng quy tắc 1, ta có S├ 1 , (ε = 1 , với n = 0), sử
18



dụng quy tắc 2, rồi n-1 lần (n ≥ 1) liên tiếp cặp quy tắc 3 và 4, cuối cùng là quy
tắc 5, ta có:
S├ 1A ├ 11B ├ 111A ├ … ╞ 1(1

2n-2
2n-2
2n
)A ├ 1(1
)1 = 1 .

19


1.3. Một số tính chất của ngôn ngữ
1.3.1. Một số tính chất của văn phạm và dẫn xuất
Định lý I.1
Với mọi văn phạm G = < Σ,


< Σ’,



, S, P >, luôn tồn tại một văn phạm G’ =

’, S’, P’ > tương đương với văn phạm G, tức là L(G) = L(G’).

Chứng minh:
Giả sử có văn phạm G = < Σ,


Σ’,





, S, P >, ta xây dựng văn phạm G’ = <

’, S’, P’ >, trong đó:

• Σ’ = Σ, và với mỗi a ∈ Σ, ta bổ xung một ký hiệu
là đối ngẫu của a, đặt Г = {




’ =



a

a

∉Σ∪



và gọi


| a ∈ Σ}

∪Г

• S’ = S
a

P’ = P1 ∪ P2, với P1 = { → a | ∀a ∈ Σ}, P2 = {α → β | ∀α→β ∈ P},
α và β là các xâu α và β đã được thay các ký hiệu thuộc Σ bằng các ký hiệu đối
ngẫu của nó. Dễ thấy rằng L(G) = L(G’), thật vậy ta sẽ chứng minh hai bao hàm
thức:
G
a./ Chứng minh L(G) ⊆ L(G’): Lấy bất kỳ ω ∈ L(G), khi đó ta có S╞ ω,
G
G
G
tức là ta có một dãy suy dẫn trực tiếp trong G: S = ω0├ ω1├ … ├ ωk =
G
ω, với dãy suy dẫn này, ta thay mọi quy tắc trong các suy dẫn ωi ├ ωi+1, ( 0
≤ i ≤ k-1), bởi các quy tắc tương ứng trong P1 và P2, ta nhận được dãy các
G’
G’
G’
suy dẫn trong G’: S = ω’0├
ω’1 ├ … ├
ω’m = ω, do đó ta có
G’
S╞ ω , tức là ω ∈ L(G’). Vậy L(G) ⊆ L(G’).
G’

b./ Chứng minh L(G’) ⊆ L(G): Lấy bất kỳ ω ∈ L(G’), khi đó ta có S╞ ω,
G’
G’
G’
tức là ta có một dãy suy dẫn trong G’: S = ω’0├ ω’1 ├ … ├ ω’k = ω,
G’
trong các suy dẫn ωi├ ωi+1, ( 0 ≤ i ≤ k-1), ta thay mọi kí hiệu a ∈ Г bởi
các ký hiệu tương ứng a ∈ Σ1, khi đó mọi quy tắc đều thuộc P, ta nhận được
G
G
G
dãy các suy dẫn trưc tiếp trong G: S = ω0├ ω1├ … ├ ωk = ω, ta có
20


G
S╞ ω, tức là ω ∈ L(G). Vậy L(G’) ⊆ L(G).
Định lý I.2 (Hợp thành các suy dẫn)
Cho hệ viết lai W=(V, P) và cho u1,…, un, v1,…, vn là các xâu trong V*. Bây
giờ nếu u1*v1,…, un*vn, thì ta có u1…un *v1…vn.
Ta thừa nhận định lý trên (không cần chứng minh).
1.3.2. Tính đóng của lớp ngôn ngữ sinh bởi văn phạm
Định lý I.3
Lớp ngôn ngữ sinh bởi văn phạm là đóng đối với phép hợp (∪), phép giao
(∩) và phép nhân ghép ngôn ngữ (.)
Chứng minh:
Trước hết, ta sẽ chứng minh lớp ngôn ngữ sinh bởi văn phạm là đóng đối
với phép hợp, việc chứng minh tính đóng của lớp ngôn ngữ sinh bởi văn
phạm đối với các phép giao và phép nhân ngôn ngữ là hoàn toàn tương tự.
Giả sử L1, L2 là các ngôn ngữ được sinh bởi văn phạm G1= <Σ1,






1,

S1, P1>, G2 = <Σ2, 2, S2, P2>, tức là L1 = L(G1), L2 = L(G2). Ta
chứng minh tồn tại văn phạm G sao cho L(G) = L1∪ L2.
Xây dựng văn phạm G sinh ra ngôn ngữ L1∪ L2 như sau: G = <Σ,
S, P>, với:



,

Σ = Σ1∪ Σ2


Δ = Δ1∪ 2 ∪{S}
P = P1∪ P2 ∪ {S→S1, S→S2}
Ta sẽ chứng minh L(G) = L1∪ L2 bằng cách chứng minh hai bao hàm
thức:
a./ Chứng minh L(G) ⊆ L1∪ L2: Giả sử ω ∈ L(G), khi đó tồn tại một
G
suy dẫn trong văn phạm G: S ╞ ω, trong đó ω ∈ Σ* = (Σ1∪ Σ2)*. Do cách
xây dựng tập quy tắc P, nên trong suy dẫn S╞ ω, có hai khả năng:
G
G1
• hoặc S├ S1╞

ω, vậy ω là kết quả của suy dẫn S1╞ ω trong G1, do
đó ω ∈ L(G1). (a)
G
G2
• hoặc S├ S2╞
ω, vậy ω là kết quả của suy dẫn S2╞ ω trong G2, do
đó ω ∈ L(G2). (b)
21


Từ (a) và (b), ta thấy ω ∈ L1∪ L2, hay L(G) ⊆ L1∪ L2
b./ Chứng minh L1∪L2 ⊆ L(G): Giả sử ω∈ L1∪L2, khi đó ta cũng có
hai khả năng: ω ∈ L1 hoặc ω ∈ L2 :
G1
• Nếu ω ∈ L1 = L(G1), khi đó ta có suy dẫn S1╞
ω trong G1, do đó ta
G
G1
cũng có suy dẫn S ├ S1 ╞
ω là một suy dẫn trong G (vì theo cách xây
dựng G, mọi quy tắc và mọi ký hiệu trong G1 cũng đều thuộc G), như vậy
ω ∈ L(G).
G2
• Nếu ω ∈ L2 = L(G2), khi đó ta có suy dẫn S2╞
ω trong G2, do đó ta
G
G2
cũng có suy dẫn S ├ S2 ╞
ω là một suy dẫn trong G (vì theo cách xây
dựng G, mọi quy tắc và mọi ký hiệu trong G2 cũng đều thuộc G), như vậy

ω ∈ L(G).
Vậy ta luôn luôn có ω ∈ L(G), do đó: L1∪L2 ⊆ L(G). Tức là ta đã chứng
minh được rằng L(G) = L1∪ L2.
Tương tự, để chứng minh tính đóng của lớp ngôn ngữ sinh bởi văn
phạm đối với phép nhân ghép ngôn ngữ, ta xây dựng văn phạm G = <Σ,
S, P> sao cho L(G) = L(G1). L(G2) như sau:



,

Σ = Σ1∪ Σ2


Δ = Δ1∪ 2 ∪{S}
P = P1∪ P2 ∪{S→S1S2}. Khi đó L(G) = L(G1).L(G2)
Để chứng minh tính đóng của lớp ngôn ngữ sinh bởi văn phạm đối với
phép giao, ta xây dựng văn phạm G = <Σ,
∩ L(G2) như sau:



, S, P> sao cho L(G) = L(G1)

Σ = Σ1 ∩ Σ2


Δ = Δ1∪ 2 ∪ Г1 ∪ Г2 ∪{S}
Trong đó: Г1 = {
trong


∑1

, còn Г2= {

b

P=

a

|b

| a ∈ Σ1} là tập các ký hiệu đối ngẫu của các ký hiệu
∈∑ 2

} là tập các ký hiệu đối ngẫu của

p1 ∪ p2 ∪

{S

→ S1S2

22

}

∪ P ' ∪ P"


∑2

.


Trong đó

p1

là tập hợp các quy tắc nhận được từ

P1

đều được thay đổi bởi ký hiệu đối ngẫu tương ứng của nó

23

, mà mọi ký hiệu a
a ∈ Γ1 , P2

∈ ∑1


CHƯƠNG 2. VĂN PHẠM PHI NGỮ CẢNH
2.1. Suy dẫn phi ngữ cảnh
2.1.1. Các thí dụ về văn phạm phi ngữ cảnh
Theo tài liệu [4], tác giả: Nguyễn Thị Trúc Viên, có viết:
“Một văn phạm G = (V, T, S, P) được gọi là phi ngữ cảnh (context free)
nếu mọi luật sinh trong P có dạng
A → x,

trong đó A ∈ V còn x ∈ (V ∪T)*.”
Từ đó ta có Định nghĩa II.1.
Định nghĩa II.1
Văn phạm phi ngữ cảnh là một văn phạm G = (∑, ∆, P, S) mà mọi sản xuất
(hay quy tắc) của nó đều có dạng:
A→α, trong đó A∈∆ và α∈(∑∪∆)*
Trước hết ta hãy xem một số thí dụ về văn phạm phi ngữ cảnh.
Thí dụ 2.1:
Trong các sách văn phạm tiếng Việt ta gặp một số các quy tắc thành lập
câu như sau:
Một câu (có thể) có dạng chủ ngữ vị ngữ
Một chủ ngữ (có thể) là một danh từ
Một chủ ngữ (có thể) là một đại từ
Một vị ngữ (có thể) là một động từ
Một danh từ (có thể) là mèo
Một danh từ (có thể) là bò
Một đại từ (có thể) là tôi
Một đại từ (có thể) là nó
Một động từ (có thể) là ăn
Một động từ (có thể) là nằm
Một động từ (có thể) là uống
Từ các quy tắc còn rất ít ỏi trên, ta có thể đã thành lập một số câu như sau:
Tôi nằm
Nó ăn
Bò uống
24


Mèo nằm
Trong các quy luật trên thì các từ gạch dưới đơn như chủ ngữ, động từ... là

các phạm trù cú pháp biểu diễn cho một cấu trúc con của một câu. Còn các từ
gạch dưới kép như tôi, mèo... là các từ Việt (hay ký hiệu) trực tiếp có mặt trong
các câu. Nếu ta biểu diễn một cách ngắn gọn các phạm trù cú pháp câu, chủ ngữ,
vị ngữ, danh từ, đại từ, động từ lần lượt là U, C, V, D, Đ, G thì ta có thể trình
bày lại các quy tắc trên một cách súc tích hơn như sau:
U
C
V
D
D
Đ
Đ
G
G
G

















CV
Đ
G
mèo

tôi

ăn
nằm
uống

Và đó chính là các sản xuất trong văn phạm phi ngữ cảnh, trong đó U, C,
V, D, Đ, G là các ký hiệu không kết thúc, còn “mèo”, “bò”, “tôi”, “nó”, “ăn”,
“nằm”, “uống” là các ký hiệu kết thúc.
Thí dụ 2.2:
Trong các ngôn ngữ lập trình, với ký pháp BNF (backus-nuaur form), ta có
thể định nghĩa một định danh sau:
<định danh> ::= <chữ cái> │<định danh> <chữ cái>│<định danh> số>
<chữ cái>::= A │B│C│...│Z
<con số>::=0│1│2│3│4│5│6│7│8│9
Đó cũng chính là các quy tắc phi ngữ cảnh, trong đó ::= có nghĩa như →,
các kí hiệu không kết thúc là <định danh>, <chữ cái>, <con số> và các kí hiệu
kết thúc là A,B,C,... Z,1,2,...,9.
Thí dụ 2.3:
25



×