Nguyễn Phương Thái
Bộ môn Khoa học Máy tính
/>
Cú pháp
•
Là khuôn dạng hay cấu trúc của chương trình
•
Không liên quan đến ý nghĩa chương trình
•
Được mô tả bằng văn phạm phi ngữ cảnh
Tại sao chúng ta sử dụng văn phạm phi ngữ cảnh
(VPPNC) cho phân tích cú pháp
•
Cho phép mô tả rõ ràng và dễ hiểu cú pháp một
ngôn ngữ lập trình
•
Dễ sửa đổi và mở rộng ngôn ngữ lập trình
•
Dễ tạo ra các bộ parser
•
Cho phép dịch dựa vào cú pháp
22/10/14
2
Nguyễn Phương Thái - Coltech - Compiler 2009
Văn phạm
Phân loại văn phạm của Chomsky
Cây phân tích, dẫn xuất, và văn phạm nhập nhằng
Ôtômát đẩy xuống
22/10/14
3
Nguyễn Phương Thái - Coltech - Compiler 2009
Một ngôn ngữ L trên bộ chữ Σ là một tập con của Σ*.
Bài toán đối với L:
•
Cho một xâu w, xâu w có thuộc L?
•
Làm thế nào để sinh ra w trong L?
22/10/14
4
Nguyễn Phương Thái - Coltech - Compiler 2009
Thường dùng: văn phạm
•
Là một công cụ mô tả hữu hạn ngôn ngữ rất
hiệu quả
•
Là công cụ có định nghĩa toán học chặt chẽ,
đã được nghiên cứu kỹ
văn phạm = ngữ pháp = cú pháp
22/10/14
5
Nguyễn Phương Thái - Coltech - Compiler 2009
Ví dụ phân tích
văn phạm
22/10/14
6
Nguyễn Phương Thái - Coltech -
Compiler 2009
Định nghĩa
Một văn phạm là một hệ thống G = (
Σ
,
∆
, P, S) trong
đó:
Σ
là tập hữu hạn các ký hiệu, gọi là ký hiệu kết thúc
(terminal)
∆
là tập hữu hạn các ký hiệu, gọi là ký hiệu không kết
thúc (nonterminal)
S
∈∆
gọi là ký hiệu khởi đầu
P là tập hữu hạn các cặp xâu (
α
,
β
) được gọi là các
sản xuất hay luật cú pháp (
α
→
β
)
22/10/14
7
Nguyễn Phương Thái - Coltech - Compiler 2009
Ví dụ:
Σ
= {“bò”, “vàng”, “gặm”, “cỏ”, “non”}
∆
= {<câu>,<chủ ngữ>, <vị ngữ>, <danh ngữ>,
<động từ>, <bổ ngữ>, <danh từ>, <tính từ> }
S =<câu>
P=
<câu>→<chủ ngữ><vị ngữ>;
<chủ ngữ>→<danh ngữ>;
< danh ngữ >→<danh từ><tính từ>;
<vị ngữ>→<động từ> <bổ ngữ>
<bổ ngữ>→<danh ngữ>;
<danh từ>→”bò”|”cỏ”; <tính từ>→”vàng”|”non”; <động
từ>→”gặm”;
22/10/14
8
Nguyễn Phương Thái - Coltech - Compiler 2009
Các qui ước:
Dùng các chữ in hoa A, B, C, D, E hoặc cụm từ trong cặp ngoặc
nhọn (như <chủ ngữ>) để trỏ các ký hiệu không kết thúc;
Dùng các chữ thường a, b, c, d, e và các con số, các phép toán +,
-, *, /, cặp ngoặc đơn để trỏ các ký hiệu kết thúc. Trong một số
trường hợp dùng qui ước là một từ được in đậm (như số và chữ)
hoặc cụm từ trong cặp ngoặc kép (như "bò");
Dùng các chữ in hoa X, Y, Z để trỏ các ký hiệu có thể là kết thúc
hoặc không kết thúc;
Dùng các chữ thường u, v, w, x, y, z để trỏ các xâu ký hiệu cuối;
Dùng các chữ thường Hy lạp
α
,
β
,
χ
để trỏ các xâu gồm các biến
và ký hiệu cuối;
Nếu có các sản xuất cùng vế trái A
→
α
và A
→
β
thì ta viết gộp
lại cho gọn thành A
→
α
|
β
. Các sản xuất có cùng một kí hiệu
không kết thúc vế trái có thể gọi chung bằng tên kí hiệu vế trái. Ví
dụ, sản xuất-A.
22/10/14
9
Nguyễn Phương Thái - Coltech - Compiler 2009
V = (
Σ
∪
∆
)* là một xâu (có thể rỗng) bao gồm cả ký
hiệu không kết thúc và ký hiệu kết thúc;
V* là tập tất cả các xâu V có thể có;
V+ cũng như vậy trừ xâu rỗng;
| | là ký hiệu độ dài xâu (ví dụ |
α
| là độ dài của xâu
α
);
Ký hiệu
ε
là một kí hiệu đặc biệt, chỉ xâu rỗng hoặc
kí hiệu rỗng
22/10/14
10
Nguyễn Phương Thái - Coltech - Compiler 2009
Định nghĩa suy dẫn (derivation): Cho văn phạm G = (
Σ
,
∆
, P,
S) như trên, ta gọi suy dẫn trực tiếp là một quan hệ hai ngôi ký
hiệu
⇒
trên tập V* nếu
αβγ
là một xâu thuộc V* và
β→δ
là
một sản xuất trong P, thì
αβγ
⇒
αδγ
.
Suy dẫn k bước
⇒
k
Xâu
α
suy dẫn xâu
β
:
α
⇒
*
β
Suy dẫn không tầm thường:
⇒
+
22/10/14
11
Nguyễn Phương Thái - Coltech - Compiler 2009
Định nghĩa: Ngôn ngữ của văn phạm G là tập hợp các xâu ký
hiệu kết thúc, ta ký hiệu là L(G), được sinh ra từ S, hoặc được
phân tích (đoán nhận) về S:
L(G) = { w | w
∈
Σ
* và S
⇒
* w }
hoặc:
L(G) = { w | w
∈
Σ
* và w
⇒
* S }
22/10/14
12
Nguyễn Phương Thái - Coltech - Compiler 2009
Định nghĩa: Hai văn phạm G
1
và G
2
(sản sinh hoặc đoán nhận)
là tương đương khi và chỉ khi L(G
1
) = L(G
2
).
22/10/14
13
Nguyễn Phương Thái - Coltech - Compiler 2009
22/10/14
14
Nguyễn Phương Thái - Coltech - Compiler 2009
Cho văn phạm G = (
Σ
,
∆
, P, S), ta gọi nó là văn phạm:
Lớp 0, văn phạm ngữ cấu (phrase - structure) nếu sản xuất có
dạng:
α → β trong đó α ∈ V+, β∈V*
hoặc cũng có thể nói, lớp văn phạm này
không bị ràng buộc gì.
22/10/14
15
Nguyễn Phương Thái - Coltech - Compiler 2009
Lớp 1, văn phạm cảm ngữ cảnh (context - sensitive) nếu sản
xuất có dạng:
α
→
β
thỏa mãn điều kiện |
α
|
≤
|
β
|
22/10/14
16
Nguyễn Phương Thái - Coltech - Compiler 2009
Lớp 2, văn phạm phi ngữ cảnh (context free - viết tắt là
VPPNC) nếu sản xuất có dạng:
A → α trong đó A ∈ ∆, α ∈V*
22/10/14
17
Nguyễn Phương Thái - Coltech - Compiler 2009
Lớp 3, văn phạm chính quy (regular - viết tắt là VPCQ) nếu
sản xuất có dạng:
A
→
a, A
→
Ba trong đó A, B
∈
∆
, a
∈
Σ
hoặc tương tự
A
→
a, A
→
aB với A, B
∈
∆
, a
∈
Σ
22/10/14
18
Nguyễn Phương Thái - Coltech - Compiler 2009
22/10/14
19
Nguyễn Phương Thái - Coltech - Compiler 2009
Ngôn ngữ loại 0 được đoán nhận bởi một máy
Turing;
Ngôn ngữ loại 1 (cảm ngữ cảnh) được đoán nhận bởi
một ôtômát tuyến tính giới nội (sai khác xâu rỗng);
Ngôn ngữ loại 2 (phi ngữ cảnh - viết tắt là NNPNC)
đoán nhận bởi một ôtômát đẩy xuống (không đơn
định);
Ngôn ngữ loại 3 (chính qui - viết tắt là NNCQ) được
đoán nhận bởi một ôtômát hữu hạn (sai khác xâu
rỗng).
22/10/14
20
Nguyễn Phương Thái - Coltech - Compiler 2009
Dạng BNF (Backus - Naur Form): thực chất chỉ là một cách biểu
diễn khác của VPPNC. Quy ước:
Các ký tự viết hoa biểu diễn các ký hiệu không kết thúc
(nonterninal), cũng có thể thay bằng một xâu đặt trong cặp
dấu < > hoặc một từ in nghiêng;
Các ký tự viết chữ nhỏ và dấu toán học biểu diễn các ký hiệu
kết thúc (terninal), cũng có thể thay bằng một xâu đặt trong
cặp dấu nháy kép " " hoặc một từ in đậm;
Ký hiệu
→
hoặc = là ký hiệu chỉ phạm trù cú pháp ở vế trái
được giải thích bởi vế phải;
Ký hiệu | chỉ sự lựa chọn.
22/10/14
21
Nguyễn Phương Thái - Coltech - Compiler 2009
Định nghĩa toán hạng: có thể là một biến (tên), số hoặc một biểu
thức ở trong cặp dấu ngoặc đơn
Viết dưới dạng BNF:
<Toán hạng> = <Tên> | < số > | "(" <Biểu thức> ")"
Hoặc
ToánHạng
→
Tên | số | ( BiểuThức )
22/10/14
22
Nguyễn Phương Thái - Coltech - Compiler 2009
Định nghĩa: Cây phân tích trong một VPPNC G = (
Σ
,
∆
, P, S) :
Mọi nút có một nhãn, là một ký hiệu trong
(
Σ
∪
∆
∪
{
ε
})
Nhãn của gốc là S
Nếu một nút có nhãn X là một nút trong thì X
∈
∆
Nếu nút n có nhãn là X và các nút n
1
, n
2
, , n
k
là các
con của nút n, theo thứ tự từ trái sang phải, và lần
lượt mang các nhãn X
1
,X
2
, X
k
thì X
→
X
1
X
2
…X
k
phải
là một sản xuất trong P
22/10/14
23
Nguyễn Phương Thái - Coltech - Compiler 2009
Ví dụ: Cho VPPNC
G =({a, b}, {S, A}, P,
S)
P gồm: S→ aAS | a, A→
SbA|SS|ba
Kết quả: xâu aabbaa
22/10/14
24
Nguyễn Phương Thái - Coltech -
Compiler 2009
Bắt đầu từ S
Sử dụng dẫn xuất để tạo nên dãy các kí hiệu kết thúc
Với các xâu α, β và γ bất kì và một sản xuất A →β
Một dẫn xuất là αAγ
⇒
αβγ
•
Thay β vào vị trí của A ở vế trái
Thứ tự dẫn xuất tùy ý, có thể chọn bất cứ một kí hiệu
không kết thúc nào để áp dụng sản xuất
Hai thứ tự dẫn xuất thường dùng:
•
Suy dẫn trái: chọn kí hiệu bên trái nhất
•
Suy dẫn phải: chọn kí hiệu bên phải nhất
Ví dụ: Dẫn xuất trái nhất và dẫn xuất phải nhất của cây
cú pháp trên
22/10/14
25
Nguyễn Phương Thái - Coltech - Compiler 2009