620 likes | 1.16k Views
BÀI GIẢNG CHƯƠNG TRÌNH DỊCH. Bộ môn khoa học máy tính. Chương 3: Phân tích cú pháp. Các chiến lược phân tích Phân tích top-down Phân tích bottom-up Phân tích bảng CYK Phân tích LL Phân tích đệ quy trên xuống. 1. Các chiến lược phân tích.
E N D
BÀI GIẢNGCHƯƠNG TRÌNH DỊCH Bộ môn khoa học máy tính
Chương 3: Phân tích cú pháp • Các chiến lược phân tích • Phân tích top-down • Phân tích bottom-up • Phân tích bảng CYK • Phân tích LL • Phân tích đệ quy trên xuống
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) ???
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
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
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.
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.
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.
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 đó.
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
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
2. Phân tích top-down • Quá trình phân tích top-down
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
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.
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.
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 đó.
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.
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
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.
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
4. Phân tích bảng CYK • i - chỉ số cột đứng trước • j – chỉ số dòng đứng sau T14
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
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.
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
4. Phân tích bảng CYK • Thuật toán xây dựng cây phân tích
4. Phân tích bảng CYK • Ví dụ: • S AA | AS | b • A SA | AS | a
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
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
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:
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.
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.
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
5. Phân tích LL • Ví dụ: cho bảng phân tích sau: • Xâu vào a + a*a
5. Phân tích LL • Quá trình phân tích
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
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)
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().
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)
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
5. Phân tích LL • Ví dụ: Tính First
5. Phân tích LL • Tính Follow
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)
5. Phân tích LL • Thuật toán lập bảng phân tích • Đối với mỗi sản xuất A thực hiện bước 2 và 3 • Đối với mỗi ký hiệu kết thúc a First(), thêm A vào M[A, a] • Nếu First(), thêm A vào M[A, b] với b Follow(A). • Đặt tất cả các vị trí còn lại của bảng là lỗi.
5. Phân tích LL • Ví dụ: với văn phạm cho ở trên, ta có bảng:
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)
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}
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}