Xuất xứ của văn phạm phi ngữ cảnh là sự mô tả thông qua các ngôn ngữ tự nhiên. Ta có thể viết các quy tắc cú pháp để diễn tả câu “An là sinh viên giỏi“ như sau :
< câu đơn > < chủ ngữ > < vị ngữ >
< chủ ngữ > < danh từ >
< vị ngữ > < động từ > < bổ ngữ >
< bổ ngữ > < danh từ > < tính từ >
< danh từ > An
< danh từ > sinh viên
< động từ > là
< tính từ > giỏi
Các từ trong dấu móc nhọn như < câu đơn >, < chủ ngữ >, < vị ngữ >, ... là các phạm trù cú pháp, cho ta vai trò của các bộ phận hợp thành câu. Ta thấy một câu sinh ra qua các bước triển khai dần dần theo các quy tắc cú pháp. Đây cũng chính là dạng của các luật sinh trong văn phạm phi ngữ cảnh. Và như vậy, văn phạm phi ngữ cảnh cũng có thể chọn làm mô hình cho các văn phạm của các ngôn ngữ tự nhiên.
Tuy nhiên, trong khoa học máy tính, với nhu cầu biểu diễn các ngôn ngữ lập trình, văn phạm phi ngữ cảnh CFG còn được thiết kế thành một dạng tương đương gọi là văn phạm BNF (Backus - Naur Form). Đây cũng là văn phạm CFG với những thay đổi nhỏ về dạng thức và một số ký hiệu viết tắt mà các nhà khoa học máy tính thường ứng dụng trong việc diễn tả cú pháp của các ngôn ngữ lập trình cấp cao (như ALGOL, PASCAL, ... ). Trong dạng thức của văn phạm BNF, ký hiệu ::= được dùng thay cho ký hiệu . Chẳng hạn, để định nghĩa một biểu thức số học (expression) bao gồm các danh biểu (identifier) tham gia vào các phép toán +, * hoặc biểu thức con lồng trong dấu ngoặc đơn , ta viết :
<expression> ::= <expression> + <expression>
<expression> ::= <expression> * <expression>
<expression> ::= ( <expression> )
<expression> ::= <identifier>
Việc nghiên cứu các văn phạm phi ngữ cảnh đã tạo nên một cơ sở lý luận vững chắc cho việc biểu diễn ngôn ngữ lập trình, việc tìm kiếm các giải thuật phân tích cú pháp vận dụng trong chương trình dịch và cho nhiều ứng dụng khác về xử lý chuỗi. Chẳng hạn, nó rất hữu ích trong việc mô tả các biểu thức số học với nhiều dấu ngoặc lồng nhau hoặc cấu trúc khối trong ngôn ngữ lập trình mà biểu thức chính quy không thể đặc tả.
Định nghĩa
Văn phạm phi ngữ cảnh là một tập hợp hữu hạn các biến (còn gọi là các ký hiệu chưa kết thúc), mỗi biến biểu diễn một ngôn ngữ. Ngôn ngữ được biểu diễn bởi các biến được mô tả một cách đệ quy theo thuật ngữ của một khái niệm khác gọi là ký hiệu kết thúc. Quy tắc quan hệ giữa các biến gọi là luật sinh. Mỗi luật sinh có dạng một biến ở vế trái sinh ra một chuỗi có thể gồm biến lẫn các ký hiệu kết thúc trong văn phạm.
Văn phạm phi ngữ cảnh (CFG) là một hệ thống gồm bốn thành phần, ký hiệu là văn phạm G (V, T, P, S), trong đó :
. V là tập hữu hạn các biến (hay ký tự chưa kết thúc)
. T là tập hữu hạn các ký tự kết thúc, V T =
. P là tập hữu hạn các luật sinh mà mỗi luật sinh có dạng A với A là biến và là chuỗi các ký hiệu (V T)*
. S là một biến đặc biệt gọi là ký hiệu bắt đầu văn phạm.
Thí dụ 5.1 : Văn phạm G ({S, A, B}, {a, b}, P, S ), trong đó P gồm các luật sinh sau:
S ® AB
A ® aA
A ® a
B ® bB
B ® b
Quy ước ký hiệu:
- Các chữ in hoa A, B, C, D, E, ... và S ký hiệu các biến (S thường được dùng làm ký hiệu bắt đầu ).
- Các chữ nhỏ a, b, c, d, e, ...; các chữ số và một số ký hiệu khác ký hiệu cho các ký hiệu kết thúc.
- Các chữ in hoa X, Y, Z là các ký hiệu có thể là ký hiệu kết thúc hoặc biến.
- Các chữ Hi-lạp , , , ... biểu diễn cho chuỗi các ký hiệu kết thúc và biến.
Ta sẽ biểu diễn văn phạm một cách tóm tắt bằng cách chỉ liệt kê các luật sinh của nó. Nếu A ® 1, A ® 2 , ... , A ® k là các luật sinh của biến A trong văn phạm nào đó, ta sẽ ghi ngắn gọn là A ® 1 | 2 | ... | k
Thí dụ 5.2 : Văn phạm trong Thí dụ 5.1 trên có thể viết gọn là :
S ® AB
A ® aA a
B ® bB b
Câu hỏi :
?
Bạn nghĩ gì về lớp ngôn ngữ có thể được sinh bởi văn phạm trong ví dụ trên ? Cơ chế nào có thể được sử dụng cho văn phạm để phát sinh ngôn ngữ ?
Dẫn xuất và ngôn ngữ
Dẫn xuất: Để định nghĩa ngôn ngữ sinh bởi văn phạm CFG G (V, T, P, S), ta dẫn nhập khái niệm dẫn xuất. Trước hết ta giới thiệu hai quan hệ G và *G giữa hai chuỗi trong tập (V T)*. Nếu A là một luật sinh trong văn phạm và , là hai chuỗi bất kỳ trong tập (V T)* thì A G , hay ta còn nói luật sinh A áp dụng vào chuỗi A để thu được chuỗi , nghĩa là A sinh trực tiếp trong văn phạm G. Hai chuỗi gọi là quan hệ nhau bởi G nếu chuỗi thứ hai thu được từ chuỗi thứ nhất bằng cách áp dụng một luật sinh nào đó.
Giả sử 1, 2, ..., m là các chuỗi thuộc (V T)* với m 1 và :
1 G 2, 2 G 3, …, m -1 G m
thì ta nói 1*G m hay 1 dẫn xuất ra m trong văn phạm G.
Như vậy, *G là bao đóng phản xạ và bắc cầu của G. Nói cách khác, *G nếu được dẫn ra từ bằng không hoặc nhiều hơn các luật sinh của P. Chú ý rằng *G với mọi chuỗi .
Thông thường nếu không có nhầm lẫn ta sẽ dùng các ký hiệu và * thay cho ký hiệu G và *G. Nếu dẫn ra bằng i bước dẫn xuất thì ta ký hiệu i .
Ngôn ngữ sinh bởi văn phạm phi ngữ cảnh
Cho văn phạm CFG G(V, T, P, S), ta định nghĩa :
L(G) = {ww T * và S *G w}
Nghĩa là, một chuỗi thuộc L(G) nếu:
1) Chuỗi gồm toàn ký hiệu kết thúc.
2) Chuỗi được dẫn ra từ ký hiệu bắt đầu S.
Ta gọi L là ngôn ngữ phi ngữ cảnh (CFL) nếu nó là L(G) với một CFG G nào đó. Chuỗi gồm các ký hiệu kết thúc và các biến, được gọi là một dạng câu sinh từ G nếu S *. Hai văn phạm G1, G2 được gọi là tương đương nếu L(G1) = L(G2)
Thí dụ 5.3 : Xét văn phạm G (V, T, P, S), trong đó :
V = {S}, T = {a, b}, P = {S ® aSb, S ® ab}.
Bằng cách áp dụng luật sinh thứ nhất n -1 lần và luật sinh thứ hai 1 lần, ta có:
S Þ aSb Þ aaSbb Þ a3Sb3 Þ ... Þ an-1bn-1 Þ anbn
Vậy, L(G) chứa các chuỗi có dạng anbn, hay L(G) = {anbn n 1}.
Cây dẫn xuất
Để dễ hình dung sự phát sinh ra các chuỗi trong văn phạm phi ngữ cảnh, ta thường diễn tả một chuỗi dẫn xuất qua hình ảnh một cây. Một cách hình thức, ta định nghĩa như sau:
Định nghĩa : Cho văn phạm G (V, T, P, S). Cây dẫn xuất (hay cây phân tích cú pháp) của G được định nghĩa như sau :
i) Mỗi nút (đỉnh) có một nhãn, là một ký hiệu (V T {})
ii) Nút gốc có nhãn là ký hiệu bắt đầu S.
iii) Nếu nút trung gian có nhãn A thì A V
iv) Nếu nút n có nhãn A và các đỉnh n1, n2, ..., nk là con của n theo thứ tự từ trái sang phải có nhãn lần lượt là X1, X2, ..., Xk thì A X1X2 ... Xk là một luật sinh trong tập luật sinh P.
v) Nếu nút n có nhãn là từ rỗng thì n phải là nút lá và là nút con duy nhất của nút cha của nó.
Thí dụ 5.4 : Xét văn phạm G ({S, A}, {a, b}, P, S), trong đó P gồm:
S ® aAS | a
A ® SbA | SS | ba
Một cây dẫn xuất từ văn phạm có dạng như hình 5.1 sau :
Ta thấy, nút 1 có nhãn S và các con của nó lần lượt là a, A, S (chú ý S aAS là một luật sinh). Tương tự, nút 3 có nhãn A và các con của nó là S, b, A (từ luật sinh A SbA). Nút 4, 5 có cùng nhãn S và có nút con nhãn a (luật sinh S a). Cuối cùng nút 7 có nhãn A và có các nút con b, a (luật sinh A ba).
Trên cây dẫn xuất, nếu ta đọc các lá theo thứ tự từ “trái sang phải“ thì ta có một dạng câu trong G. Ta gọi chuỗi này là chuỗi sinh bởi cây dẫn xuất.
![]() |
Hình 5.1 - Cây dẫn xuất từ văn phạm
Một cây con (subtree) của cây dẫn xuất có nút gốc nhãn là A còn được gọi là A-cây con (hoặc A-cây). Cây con cũng giống như cây dẫn xuất, chỉ khác là nhãn của nút gốc không nhất thiết phải là ký hiệu bắt đầu S.
Thí dụ 5.5 :Xét văn phạm và cây dẫn xuất trong Hình 5.1. Đọc các lá theo thứ tự từ trái sang phải ta có chuỗi aabbaa, trong trường hợp này tất cả các lá đều là ký hiệu kết thúc, nhưng nói chung cũng không bắt buộc như thế, lá có thể có nhãn là hoặc biến. Ta thấy dẫn xuất S * aabbaa bằng chuỗi dẫn xuất :
S Þ aAS Þ aSbAS Þ aabAS Þ aabbaS Þ aabbaa
A-cây có nút đỉnh là 3 tạo ra chuỗi con abba theo chuỗi dẫn xuất :
S Þ SbAÞ abA Þ abba
Câu hỏi :
?
Các cây dẫn xuất được sinh từ những chuỗi dẫn xuất khác nhau cho cùng một chuỗi nhập có là những cây dẫn xuất khác nhau không ?
Quan hệ giữa dẫn xuất và cây dẫn xuất
ĐỊNH LÝ 5.1 : Nếu G (V, T, P, S) là một văn phạm phi ngữ cảnh thì S * nếu và chỉ nếu có cây dẫn xuất trong văn phạm sinh ra .














