Chương 3: Phân tích cú pháp
1. Các chiến lược phân tích 2. Phân tích top-down 3. Phân tích bottom-up 4. Phân tích bảng CYK 5. Phân tích LL 6. Phân tích đệ quy trên xuống
Bạn đang xem trước 20 trang tài liệu Chương 3: Phân tích cú pháp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1BÀI GIẢNG
CHƯƠNG TRÌNH DỊCH
Bộ môn khoa học máy tính
Trang 2
Chương 3: Phân tích cú pháp
1. Các chiến lược phân tích
2. Phân tích top-down
3. Phân tích bottom-up
4. Phân tích bảng CYK
5. Phân tích LL
6. Phân tích đệ quy trên xuống
Trang 3
1. Các chiến lược phân tích
Sử dụng văn phạm phi ngữ cảnh (VPPNC) để
biểu diễn cú pháp của NNLT
Cơ sở phân tích cú pháp đối với VPPNC là bài
toán thành viên:
Cho G = (VT, VN, S, P), L(G) = {w VT*: S * w},
xâu vào w
Câu hỏi: wL(G) ???
Trang 4
1. Các chiến lược phân tích
Chiến lược phân tích top-down:
Quá trình xây dựng cây phân tích cú pháp theo lối từ
gốc đến lá.
Xuất phát từ gốc là ký tự bắt đầu, cố gắng áp dụng
các sản xuất để xây dựng một cây có tập các nhãn
của lá từ trái qua phải là xâu vào
Trang 5
1. Các chiến lược phân tích
Chiến lược phân tích bottom-up
Xuất phát từ các lá có nhãn là các ký tự của xâu vào,
ta cố gắng áp dụng các sản xuất để xây dựng các nút
trong.
Nếu xây dựng được một nút gốc là ký tự bắt đầu thì
được cây suy dẫn cho xâu vào
Trang 6
1. Các chiến lược phân tích
Có 2 phương pháp
Phân tích quay lui: trong quá trình xây dựng cây cú
pháp thực hiện thử lần lượt, có bước quay lại để thử
sản xuất khác
Phân tích tất định: trong quá trình xây dựng cây cú
pháp ta luôn lựa chọn đúng sản xuất cần dùng.
Trang 7
2. Phân tích top-down
Input: Văn phạm G=(VT,VN,S,P), một xâu vào x
Output: Cây suy dẫn cho xâu vào x hoặc trả lời
x không được đoán nhận
Thuật toán: đánh số các sản xuất 1, 2, 3…
Bước 1: Xây dựng một cây chỉ có nút S làm gốc, gọi
S là nút hoạt động và ký hiệu cần phân tích là ký
hiệu đầu tiên trên xâu vào.
Trang 8
2. Phân tích top-down
Bước 2:
Nếu nút hoạt động là một kí hiệu không kết thúc A:
Chọn sản xuất đầu tiên có A làm vế trái để tạo ra k con
trực tiếp của A (AX1X2…Xk), sau đó lấy X1 làm nút
hoạt động.
Nếu k = 0 (A) thì nút hoạt động là nút bên phải của
A trên cây.
Trang 9
2. Phân tích top-down
Bước 2:
Nếu nút hoạt động là kí hiệu kết thúc a thì sẽ so sánh
a với kí hiệu cần phân tích:
Trùng nhau: nút hoạt động là nút bên phải của a trên
cây và kí hiệu cần phân tích là kí hiệu tiếp theo trên
xâu vào.
Không trùng: quay lại 1 bước để thử một sản xuất
khác. Nếu tất cả sản xuất đã được thử thì quay lại
bước trước đó.
Trang 10
2. Phân tích top-down
Quá trình dừng lại khi:
Tạo ra cây suy dẫn cho xâu vào
Thử hết khả năng nhưng không xây dựng lên cây suy
dẫn. Tức là xâu không được đoán nhận
Điều kiện dừng: văn phạm không có đệ qui trái
Trang 11
2. Phân tích top-down
Ví dụ: Cho văn phạm sau
S cAd
A ab | a
Xâu vào là cad
Đánh số sản xuất:
(1) : S cAd
(2) : A ab
(3) : A a
Trang 12
2. Phân tích top-down
Quá trình phân tích top-down
Trang 13
3. Phân tích bottom-up
Đây là phương pháp gạt thu gọn (shift Reduce
Parsing).
Sử dụng Stack S dùng để chứa kí hiệu của văn
phạm cần phân tích.
Mỗi bước thực hiện một trong hai hành động gạt
hoặc thu gọn. Luôn thử thu gọn trước khi gạt
Trang 14
3. Phân tích bottom-up
Input: Văn phạm G không có -sản xuất và
A + A, xâu vào x
Output: x có được đoán nhận hay không?
Thuật toán:
Bước 1: Gạt ký tự đầu tiên của xâu x vào Stack S
Bước 2: Lặp
Xét mọi xâu có thể trên đỉnh Stack. Ví dụ: Stack có
abcd d, cd, bcd, abcd.
Trang 15
3. Phân tích bottom-up
Nếu tồn tại A thì thực hiện thu gọn:
Lấy tất cả các ký hiệu của xâu trong Stack.
Đẩy ký hiệu A vào Stack.
Trong trường hợp có nhiều xâu cùng thỏa mãn thì
đánh số để thử lần lượt.
Nếu không thể thu gọn thì gạt ký hiệu tiếp theo trên
xâu vào x vào Stack.
Trang 16
3. Phân tích bottom-up
Nếu đã gạt hết ký hiệu trên x mà trong Stack
không phải còn S thì quay lui lại địa chỉ sau cùng
mà ở đó đã tiến hành thu gọn (khôi phục hiện
trạng xâu vào, Stack tại thời điểm trước khi thu
gọn)
Nếu còn một thu gọn nào khác có thể thì sẽ tiến
hành thử theo thu gọn đó.
Trang 17
3. Phân tích bottom-up
Thuật toán dừng khi đã gạt hết các ký hiệu trên
xâu vào và trong Stack chỉ có một ký hiệu S. Khi
đó ta kết luận xâu vào x được đoán nhận.
Ngược lại, khi thử hết các trường hợp mà trong
Stack không chứa chỉ S thì kết luận xâu x không
được đoán nhận.
Trang 18
3. Phân tích bottom-up
Ví dụ: Cho văn phạm
S aABe
A Abc | b
B d
Xâu vào: abbcde
Trang 19
Trang 20
4. Phân tích bảng CYK
Dạng chuẩn Chomsky
VPPNC ở dạng chuẩn Chomsky nếu mọi sản xuất
có dạng A BC hoặc A a
Mọi văn phạm không chứa - sản xuất thì đều có
thể chuyển về dạng chuẩn Chomsky.
Trang 21
4. Phân tích bảng CYK
Mô tả bảng: mỗi ô trong bảng chứa một tập các
kí hiệu không kết thúc.
Xâu vào x = a1a2…an
Nếu xL(G) S T1n
*ij N i j+i-1T = X V | X a ...a
*1n N 1 nT = X V | X a ...a
Trang 22
4. Phân tích bảng CYK
i - chỉ số cột
đứng trước
j – chỉ số dòng
đứng sau
i
j
1
1
2
2 3
3
4
4
T14
Trang 23
4. Phân tích bảng CYK
Thuật toán xây dựng bảng:
Bước 1: Xây dựng hàng 1 ( j = 1)
Bước 2: Giả thiết đã xây dựng được các hàng 1, 2, 3,
…, j -1. Xây dựng hàng j
Bước 3: Lặp lại bước 2 cho đến khi tính được T1n
i1 N iT = X V | X a P
ij N ik i+k,j-kT = X V | k [1.. j - 1]: B T , C T , X BC P
Trang 24
4. Phân tích bảng CYK
i
j
1
1
2
2 3
3
4
4
Trang 25
4. Phân tích bảng CYK
Ví dụ: Cho văn phạm
S AA | AS | b
A SA | AS | a
Xâu vào abaab.
Trang 26
4. Phân tích bảng CYK
Thuật toán xây dựng cây phân tích
Thủ tục Gen(i, j, A) viết ra dãy sản xuất trong suy dẫn
A * aiai+1…ai+j-1
Gọi thủ tục Gen(1, n, S)
Cây suy dẫn là cây suy dẫn trái nhất
Trang 27
4. Phân tích bảng CYK
Thuật toán xây dựng cây phân tích
Trang 28
4. Phân tích bảng CYK
Ví dụ:
S AA | AS | b
A SA | AS | a
Trang 29
4. Phân tích bảng CYK
Ví dụ:
(1) S AA
(2) S AS
(3) S b
(4) A SA
(5) A AS
(6) A a
Dãy sản xuất: 1 6 4 3 5 6 2 6 3
Trang 30
4. Phân tích bảng CYK
Ví dụ: Dãy sản xuất: 1 6 4 3 5 6 2 6 3
S AA aA aSA
abA abAS abaS
abaAS abaaS abaab
Trang 31
5. Phân tích LL
Cơ sở của phân tích LL(k) dựa trên phương
pháp phân tích top-down và máy ôtômát đẩy
xuống
Mô hình:
Trang 32
5. Phân tích LL
Bảng phân tích M là mảng hai chiều:
Mỗi dòng tương ứng với một kí hiệu không kết thúc
Mỗi cột tương ứng với một kí hiệu kết thúc
Tại ô dòng A, cột a: ghi sản xuất vế trái là A, vế phải
là một xâu có thể suy dẫn ra một dạng câu đứng đầu
là a.
Trang 33
5. Phân tích LL
Thuật toán phân tích LL(1)
Input: bảng phân tích M, xâu vào x
Output: Cây phân tích cho x hoặc lỗi
Các bước thuật toán:
Bước 1: Đẩy lần lượt 2 kí hiệu $, S (kí tự đầu) vào
Stack. Thêm $ vào cuối xâu x. Kí tự đang xét là kí tự
đầu của xâu x.
Trang 34
5. Phân tích LL
Các bước thuật toán:
[Lặp] Bước 2: X là kí hiệu trên đỉnh Stack, a là kí hiệu
đang xét
Nếu X = a = $ Thành công
Nếu X = a $: Lấy X khỏi Stack, kí hiệu đang xét là kí
hiệu tiếp theo trên xâu vào
Nếu X là kí hiệu không kết thúc: Xét ô M[X, a] được
sản xuất X Y1Y2…Yk thì:
• Lấy X khỏi Stack
• Đẩy Yk, …, Y1 vào Stack
Trang 35
5. Phân tích LL
Ví dụ: cho bảng phân tích sau:
Xâu vào a + a*a
Trang 36
5. Phân tích LL
Quá trình phân tích
Trang 37
5. Phân tích LL
Định nghĩa First và Follow
First() là tập các kí hiệu kết thúc bắt đầu các xâu
suy dẫn được từ . Nếu * thì First()
Follow(A) là tập các kí hiệu kết thúc mà có thể đứng
ngay bên phải A trong một dạng câu
Trang 38
5. Phân tích LL
Trang 39
5. Phân tích LL
Tính First của một ký hiệu
(1) Nếu X là ký hiệu kết thúc thì First(X) = {X}
(2) Nếu X là một sản xuất thì First(X)
(3) Nếu X Y1Y2…Yk là một sản xuất:
First(Y1) \{} First(X)
Nếu First(Yj) (j<i) First(Yi)\{} First(X).
Nếu First(Yi) (i = 1, 2, …, k) thì First(X).
Lặp lại các quy tắc trên cho đến khi không thêm
được gì vào First(X)
Trang 40
5. Phân tích LL
Tính First của một xâu = X1X2…Xk
First(X1) \{} First()
Nếu First(Xj) (j<i) First(Yi)\{} First().
Nếu First(Xi) (i = 1, 2, …, k) thì First().
Trang 41
5. Phân tích LL
Tính Follow(A).
(1) Đặt $ vào Follow(A) với A là k hiệu bắt đầu
(2) BA (với ) thì First()\{} Follow(A).
(3) BA (hoặc BA với First()) thì
Follow(B) Follow(A).
Lặp lại các quy tắc trên cho đến khi không
thêm được gì vào Follow(A)
Trang 42
5. Phân tích LL
Ví dụ: Cho văn phạm sau:
E TE’
E’ +TE’ |
T’ *FT’ |
T FT’
F (E) | a
Tính First và Follow của các kí hiệu không kết
thúc
Trang 43
5. Phân tích LL
Ví dụ: Tính First
Trang 44
5. Phân tích LL
Tính Follow
Trang 45
5. Phân tích LL
Định nghĩa văn phạm LL(1)
Một VPPNC là LL(1) khi thỏa 2 điều kiện sau:
Nếu A | là hai sản xuất phân biệt thì
First()First() =
Nếu A * thì First(A) Follow(A) =
Ví dụ: văn phạm ở ví dụ trên là LL(1)
Trang 46
5. Phân tích LL
Thuật toán lập bảng phân tích
1. Đối với mỗi sản xuất A thực hiện bước 2 và 3
2. Đối với mỗi ký hiệu kết thúc a First(), thêm A
vào M[A, a]
3. Nếu First(), thêm A vào M[A, b] với b
Follow(A).
4. Đặt tất cả các vị trí còn lại của bảng là lỗi.
Trang 47
5. Phân tích LL
Ví dụ: với văn phạm cho ở trên, ta có bảng:
Trang 48
5. Phân tích LL
Định nghĩa văn phạm LL(1)
Một VPPNC là LL(1) khi mỗi ô trong bảng phân
tích không chứa quá một sản xuất.
Ví dụ: Văn phạm cho trong ví dụ trên là LL(1)
Trang 49
5. Phân tích LL
Ví dụ:
S A | B
A aA | b
B aB | c
Văn phạm này không là LL(1) vì
First(A) First(B) = {a}
Trang 50
5. Phân tích LL
Ví dụ:
S Aa
A aA |
Văn phạm này không là LL(1) vì
A
First(A) Follow(A) = {a}
Trang 51
6. Phân tích đệ quy trên xuống
Văn phạm cần phân tích phải là LL(1)
Ta thực hiện xây dựng sơ đồ cú pháp cho từng
sản xuất trong văn phạm
Viết từng thủ tục phân tích cho các ký hiệu
không kết thúc của văn phạm
Trang 52
6. Phân tích đệ quy trên xuống
Xây dựng sơ đồ cú pháp
Với a là ký hiệu kết thúc
Với A là ký hiệu không kết thúc
a
A
Trang 53
6. Phân tích đệ quy trên xuống
Xây dựng sơ đồ cú pháp
A 1 | 2 |…| n
Trang 54
6. Phân tích đệ quy trên xuống
Xây dựng sơ đồ cú pháp
: X1X2…Xn
: {X}
Trang 55
6. Phân tích đệ quy trên xuống
Ví dụ: xây dựng sơ đồ cú pháp cho văn phạm
S T A
A + T A |
T F B
B * F B |
F (S) | a
Trang 56
6. Phân tích đệ quy trên xuống
Viết chương trình
Thủ tục getch() đọc một kí hiệu lưu vào biến ch
a
A
If ch=‘a’ then getch()
Else Error
A; //gọi thủ tục phân tích A
If ch in First(1) then T(1)
Else if ch in First(2) then T(2)
….
Else if ch in First(n) then T(n)
Trang 57
6. Phân tích đệ quy trên xuống
Begin T(X1); T(X2); ... T(Xn); End;
While ch in First(X) do T(X)
Chương trình chính Begin
Getch(); S; {S kí tự đầu}
End.
Viết chương trình
Trang 58
6. Phân tích đệ quy trên xuống
Ví dụ:
Procedure S
Procedure F;
Procedure B;
Procedure T;
Procedure A;
Trang 59
6. Phân tích đệ quy trên xuống
Ví dụ:
Procedure S;
Begin
T; A;
End;
Procedure A;
Begin
if ch = ‘+’ then Begin
getch(); T; A;
End;
End;
Trang 60
6. Phân tích đệ quy trên xuống
Ví dụ:
Procedure B
Begin
if ch = ‘*’ then Begin
getch(); F; B;
End;
End;
Procedure T;
Begin
F; B;
End;
Trang 61
6. Phân tích đệ quy trên xuống
Ví dụ:
Procedure F;
Begin
if ch=‘(‘ then Begin
getch(); S;
If ch = ‘)’ then getch()
Else Error;
End
Else if ch=‘a’ then getch()
else Error;
End;