Các lớp văn phạm Văn phạm LLk - văn phạm cho phép xây dựng các bộ phân tích làm việc tất định nếu bộ phân tích này được phép nhìn k ký hiệu vào nằm ngay ở bên phải của vị trí vào hiện
Trang 1Bài giảng 5 – Các phương
pháp phân tích hiệu quả
Nguyễn Phương Thái
Bộ môn Khoa học Máy tính
http://www.coltech.vnu.vn/~thainp/
Trang 2Phân tích Top-Down, Bottom-up
Ưu điểm:
Nhược điểm:
Trang 3Tìm đường
Trang 4Phân tích hiệu quả (tất định)
Hi sinh (nhược điểm):
Ưu điểm:
Trang 5Đặc điểm phân tích tất định
định
kết thúc để xác định luật duy nhất
Trang 6Các lớp văn phạm
Văn phạm LL(k) - văn phạm cho phép xây
dựng các bộ phân tích làm việc tất định nếu
bộ phân tích này được phép nhìn k ký hiệu vào nằm ngay ở bên phải của vị trí vào hiện thời
Văn phạm LR(k) - văn phạm cho phép xây
dựng các bộ phân tích làm việc tất định nếu
bộ phân tích này được phép nhìn k ký hiệu vào nằm vượt quá vị trí vào hiện thời
Trang 7Phân tích LL
Trang 8Chương trình điều khiển
X ký hiệu đỉnh ngăn xếp, a ký hiệu vào hiện tại
Nếu X = a = $: dừng và tuyên bố thành công (cả xâu vào lẫn ngăn xếp đều rỗng)
Nếu X = a ≠ $: lấy X khỏi ngăn xếp, dịch con trỏ vào sang ký hiệu vào tiếp theo (đã khai triển đến lá khớp với xâu vào)
Nếu X là một biến: xét ô M [X, a] Nếu:
Nếu M[X, a] = {X → UVW} thay X đang nằm trên đỉnh ngăn xếp bằng WVU (U sẽ nằm trên đỉnh) (thực hiện một phép mở rộng cây)
Nếu M[X, a] = lỗi (vị trí lỗi), gọi hàm khôi phục
lỗi.
Trang 9Thuật toán
Đặt con trỏ ip chỉ đến ký tự đầu tiên của xâu w$
repeat
Giả sử X là ký hiệu đỉnh của ngăn xếp và a là ký hiệu vào tiếp theo;
if X là một ký hiệu kết thúc hoặc $ then
if X = a then
pop X từ đỉnh ngăn xếp và loại bỏ a khỏi xâu vào else
ERROR( );
else { X không phải là ký hiệu kết thúc }
if M[X, a] = X → Y1Y2 Yk then begin
pop X từ ngăn xếp;
push Yk,Yk-1, Y1 vào ngăn xếp, với Y1 ở đỉnh;
đưa ra sản xuất X → Y1Y2 Yk end
else
ERROR( );
until X = $; { ngăn xếp rỗng }
Trang 10Tìm đường
Trang 11Ví dụ
Trang 1212
Trang 13Ví dụ
Trang 15Tính First và Follow
được bảng M[A, a]
Trang 16ký hiệu bên phải nhất trong một số dạng câu thì ta thêm $ vào FOLLOW(A).
Trang 17α
Trang 19Lặp cho đến khi không còn thêm:
Nếu X là ký hiệu kết thúc thì FIRST(X) = {X};
Nếu X→ε là một sản xuất thì thêm ε vào
FIRST(X);
Nếu X→Y1Y2 Yk là một sản xuất:
Nếu với một i nào đó thì ε có trong mọi FIRST(Y1), FIRST(Y2), FIRST(Yi-1) (nghĩa là Y1Y2 Yi-1 ⇒ * ε ) thì ta thêm mọi ký hiệu kết thúc có trong
FIRST(Yi) vào FIRST(X).
Nếu i = k (tức là ε có trong mọi FIRST(Yi) với i =
1, 2, , k) thì thêm ε vào FIRST(X).
Trang 21Tính FOLLOW(A)
Lặp cho đến khi không thể thêm gì vào tập FOLLOW:
Đặt $ vào FOLLOW(A), với A là ký hiệu bắt đầu (đỉnh cây con), $ là ký hiệu đánh dấu kết thúc xâu vào
(chú ý là A không nhất thiết phải trùng với S do ta
đang tính FOLLOW cho cây con);
Nếu có một sản xuất dạng B → α A β (với β ≠ ε ), thì
mọi phần tử thuộc FIRST( β ) trừ ε đều được cho vào FOLLOW(A);
Nếu có một sản xuất dạng B → α A (hoặc một sản xuất
B → α A β với FIRST( β ) chứa ε , nghĩa là β ⇒ * ε ), thì
mọi phần tử của FOLLOW(B) cũng cho vào
FOLLOW(A).
Trang 27 Mỗi khi bộ phân tích gặp A ở trên đỉnh của
ngăn xếp và a là ký hiệu vào hiện tại thì bộ phân tích sẽ mở rộng A bằng α (bảng M[A, a]
= A→α)
Rắc rối: khi α=ε hoặc α⇒*ε Mở rộng A bằng
α nếu:
ký hiệu vào hiện tại thuộc FOLLOW(A), hoặc
ký hiệu vào hiện tại là $ và $ thuộc FOLLOW(A).
Trang 29Thuật toán 5.2
1. Đối với mỗi sản xuất A→α, thực hiện bước 2
và bước 3
2. Đối với mỗi ký hiệu kết thúc a thuộc
FIRST(α), thêm A→α vào ô M[A, a]
3. Nếu ε thuộc FIRST(α), thêm A→α vào M[A,
b] đối với mỗi b thuộc FOLLOW(A) Nếu ε
thuộc FIRST(α) và $ là thuộc FOLLOW(A), thêm A→α vào M[A, $]
4. Đặt tất cả các vị trí chưa được định nghĩa
còn lại của bảng là lỗi
Trang 30Ví dụ
Luật E → TE’ :
FIRST(TE') = FIRST(T) = {(, a}
Cả hai ô M[E, (] và M[E, a] đều được đặt là
E→TE’ (theo mục 2, thuật toán 5.2)
FIRST(+TE’) = { + }
Ô M[E', +] được đặt là E'→+TE'
Trang 33Văn phạm LL(1)
Khi áp dụng thuật toán 5.2 cho một số văn phạm, có thể có một số vị trí trong bảng
phân tích có trên một giá trị (tức là số sản
xuất nhiều hơn 1) Ví dụ, nếu văn phạm G là
đệ quy trái hoặc nhập nhằng thì ít nhất phải
có một vị trí trong bảng như vậy
Định nghĩa 5.3: Văn phạm LL(1) là các văn
phạm xây dựng được bảng phân tích theo
thuật toán 5.2 có các ô chỉ được định nghĩa nhiều nhất là một lần
Văn phạm LL(1) không bị nhập nhằng và
không có đệ quy trái
Trang 34Điều kiện để một VP là LL(1)
Nếu A→α | β là hai sản xuất phân biệt của G thì các điều kiện sau phải thỏa mãn:
1. Không có một ký hiệu kết thúc a nào mà cả α
và β có thể suy dẫn các xâu bắt đầu bằng a
2. Nhiều nhất là chỉ một trong α hoặc β có thể suy dẫn ra xâu rỗng
3. Nếu β⇒* ε thì α không suy dẫn được một
xâu nào bắt đầu bằng một ký hiệu kết thúc b
thuộc FOLLOW(A)
Trang 35Điều kiện để một VP là LL(1)
biểu thức dưới đây:
FIRST(α ) ⊕ FOLLOW(A) ∩ FIRST (β) ⊕
FOLLOW(A) = ∅
dựa vào định nghĩa 5.3 kiểm tra.
Trang 36Khôi phục lỗi
Một lỗi sẽ được phát hiện trong quá trình phân tích tất định khi:
không đúng với ký hiệu vào tiếp theo;
với biến A ở trên đỉnh ngăn xếp và ký
điền dấu hiệu báo lỗi (error).
Trang 37Chiến lược khôi phục lỗi
Thường theo kiểu trừng phạt: bỏ qua các ký hiệu trên xâu vào cho đến khi xuất hiện một
từ tố thuộc tập từ khoá đã được xác định
trước (gọi là tập từ khoá đồng bộ)
Tính hiệu quả của phương pháp này phụ
thuộc vào việc chọn tập đồng bộ Các tập này được chọn sao cho bộ phân tích vượt qua
được lỗi nhanh chóng
Trang 38Chọn tập đồng bộ synch(A)
1 Khởi đầu: đưa FOLLOW(A) vào synch(A) Nếu khi có lỗi chúng ta bỏ qua các từ tố cho đến khi một phần tử của FOLLOW(A) xuất hiện và lấy A khỏi ngăn xếp, lúc này quá trình phân tích có thể tiếp tục.
2 Tăng cường: thêm các từ khoá bắt đầu các câu lệnh vào các tập
đồng bộ của các ký hiệu không kết thúc sinh ra các biểu thức.
3 Thêm các ký hiệu trong FIRST(A) nhằm có thể tiếp tục phân tích
theo A nếu một ký hiệu trong FIRST(A) xuất hiện ở đầu vào.
4 Nếu một ký hiệu không kết thúc có thể sinh ra một xâu rỗng thì sản xuất suy dẫn ra có thể được sử dụng như ngầm định Dùng để giảm
số lượng các ký hiệu không kết thúc phải xem xét trong lúc khắc
phục lỗi.
5 Nếu một ký hiệu kết thúc nằm trên đỉnh ngăn xếp không đúng: loại
bỏ ký hiệu kết thúc này, đưa ra một thông báo và tiếp tục phân tích Phương pháp này tạo nên tập đồng bộ của một từ tố có chứa tất cả các từ tố khác.
Trang 39Ví dụ:
synch = {+, *, ), $ }
Trang 40Ví dụ:
Xâu vào:
) a * + a
Trang 41Bài tập
1 Cho một văn phạm với các luật sản xuất như sau:
E → aEbE | bEaE | ε
Văn phạm này có là văn phạm LL(1) không? Tại sao?
2 Cho một văn phạm với các luật sản xuất như sau: