61
1 BÀI GIẢNG CHƯƠNG TRÌNH DỊCH Bộ môn khoa học máy tính

Bg chuong trinh dich chuong 3

Embed Size (px)

Citation preview

Page 1: Bg chuong trinh dich chuong 3

1

BÀI GIẢNG

CHƯƠNG TRÌNH DỊCH

Bộ môn khoa học máy tính

Page 2: Bg chuong trinh dich chuong 3

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

Page 3: Bg chuong trinh dich chuong 3

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) ???

Page 4: Bg chuong trinh dich chuong 3

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

Page 5: Bg chuong trinh dich chuong 3

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

Page 6: Bg chuong trinh dich chuong 3

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.

Page 7: Bg chuong trinh dich chuong 3

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.

Page 8: Bg chuong trinh dich chuong 3

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.

Page 9: Bg chuong trinh dich chuong 3

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 đó.

Page 10: Bg chuong trinh dich chuong 3

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

Page 11: Bg chuong trinh dich chuong 3

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

Page 12: Bg chuong trinh dich chuong 3

Trang 12

2. Phân tích top-down

Quá trình phân tích top-down

Page 13: Bg chuong trinh dich chuong 3

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

Page 14: Bg chuong trinh dich chuong 3

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.

Page 15: Bg chuong trinh dich chuong 3

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.

Page 16: Bg chuong trinh dich chuong 3

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 đó.

Page 17: Bg chuong trinh dich chuong 3

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.

Page 18: Bg chuong trinh dich chuong 3

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

Page 19: Bg chuong trinh dich chuong 3

Trang 19

Page 20: Bg chuong trinh dich chuong 3

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.

Page 21: Bg chuong trinh dich chuong 3

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

Page 22: Bg chuong trinh dich chuong 3

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

112

2 3

34

4

T14

Page 23: Bg chuong trinh dich chuong 3

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

Page 24: Bg chuong trinh dich chuong 3

Trang 24

4. Phân tích bảng CYK

i

j

112

2 3

34

4

Page 25: Bg chuong trinh dich chuong 3

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.

Page 26: Bg chuong trinh dich chuong 3

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

Page 27: Bg chuong trinh dich chuong 3

Trang 27

4. Phân tích bảng CYK Thuật toán xây dựng cây phân tích

Page 28: Bg chuong trinh dich chuong 3

Trang 28

4. Phân tích bảng CYK

Ví dụ:

S AA | AS | b

A SA | AS | a

Page 29: Bg chuong trinh dich chuong 3

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

Page 30: Bg chuong trinh dich chuong 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

Page 31: Bg chuong trinh dich chuong 3

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:

Page 32: Bg chuong trinh dich chuong 3

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.

Page 33: Bg chuong trinh dich chuong 3

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.

Page 34: Bg chuong trinh dich chuong 3

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

Page 35: Bg chuong trinh dich chuong 3

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

Page 36: Bg chuong trinh dich chuong 3

Trang 36

5. Phân tích LL

Quá trình phân tích

Page 37: Bg chuong trinh dich chuong 3

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

Page 38: Bg chuong trinh dich chuong 3

Trang 38

5. Phân tích LL

Page 39: Bg chuong trinh dich chuong 3

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)

Page 40: Bg chuong trinh dich chuong 3

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().

Page 41: Bg chuong trinh dich chuong 3

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)

Page 42: Bg chuong trinh dich chuong 3

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

Page 43: Bg chuong trinh dich chuong 3

Trang 43

5. Phân tích LL

Ví dụ: Tính First

Page 44: Bg chuong trinh dich chuong 3

Trang 44

5. Phân tích LL

Tính Follow

Page 45: Bg chuong trinh dich chuong 3

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)

Page 46: Bg chuong trinh dich chuong 3

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.

Page 47: Bg chuong trinh dich chuong 3

Trang 47

5. Phân tích LL

Ví dụ: với văn phạm cho ở trên, ta có bảng:

Page 48: Bg chuong trinh dich chuong 3

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)

Page 49: Bg chuong trinh dich chuong 3

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}

Page 50: Bg chuong trinh dich chuong 3

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}

Page 51: Bg chuong trinh dich chuong 3

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

Page 52: Bg chuong trinh dich chuong 3

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

a

A

Page 53: Bg chuong trinh dich chuong 3

Trang 53

6. Phân tích đệ quy trên xuống

Xây dựng sơ đồ cú pháp A 1 | 2 |…| n

Page 54: Bg chuong trinh dich chuong 3

Trang 54

6. Phân tích đệ quy trên xuống

Xây dựng sơ đồ cú pháp : X1X2…Xn

: {X}

Page 55: Bg chuong trinh dich chuong 3

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

Page 56: Bg chuong trinh dich chuong 3

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)

Page 57: Bg chuong trinh dich chuong 3

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

Page 58: Bg chuong trinh dich chuong 3

Trang 58

6. Phân tích đệ quy trên xuống

Ví dụ:

Procedure S Procedure F;

Procedure B;

Procedure T;

Procedure A;

Page 59: Bg chuong trinh dich chuong 3

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;

Page 60: Bg chuong trinh dich chuong 3

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;

Page 61: Bg chuong trinh dich chuong 3

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;