Thông tin tài liệu
Bài Phân tích cú pháp tiền định Phân tích tiền định • Tư tưởng giải thuật phân tích cú pháp xuống quay lui • Bắt đầu từ gốc, phát triển xuống nút cấp • Chọn sản xuất thử xem có phù hợp với xâu vào khơng • Quay lui lựa chọn dẫn đến ký hiệu sinh văn phạm khơng phù hợp ký hiệu xét • Có thể tránh quay lui? • Cho sản xuất A | phân tích cú pháp cần chọn • Làm nào? • Cho ký hiệu không kết thúc A ký hiệu xem trước t, sản xuất A chắn sinh xâu bắt đầu t? Phân tích tiền định • Nếu có hai sản xuất: A , ta mong muốn có phương pháp rõ ràng để chọn sản xuất cần thiết • Định nghĩa: • Với xâu chứa ký hiệu kết thúc không kết thúc, x FIRST() từ suy dẫn x (x chứa ký hiệu) • Nếu FIRST() FIRST() khơng chứa ký hiệu chung ta biết phải chọn A hay A xem trước ký hiệu Phân tích tiền định • Tính FIRST(X): • Nếu X ký hiệu kết thúc FIRST(X)={X} • Nếu X sản xuất thêm vào FIRST(X) • Nếu X ký hiệu không kết thúc XY1Y2 Yn sản xuất , • Thêm FIRST(Y1) vào FIRST(X) • Thêm FIRST(Yi+1) vào FIRST(X) FIRST(Y1), FIRST(Yj) chứa • Tính FIRST() tương tự bước thứ ba tính FIRST(X) Phân tích tiền định • Nếu ta có sản xuất để chọn A với = Þ*? Ký hiệu ký hiệu sinh dạng câu chứa A? • Có thể mở rộng A ta biết tồn dạng câu mà ký hiệu xét xuất sau A, nghĩa ký hiệu xét thuộc FOLLOW(A) • Định nghĩa: • Với A ký hiệu khơng kết thúc, xFOLLOW(A) S suy dẫn Ax, |x| = x = (khi ) Tính FOLLOW • FOLLOW(S) chứa (EOF) • Với sản xuất dạng AB, ký hiệu FIRST() trừ tham gia vào FOLLOW(B) • Với sản xuất dạng AB AB FIRST() chứa , FOLLOW(B) chứa ký hiệu FOLLOW(A) (hoặc $) Phân tích tiền định • Với khái niệm • FIRST • FOLLOW • Ta xây dựng phân tích cú pháp mà khơng địi hỏi quay lui • Chỉ xây dựng phân tích cú pháp cho văn phạm đặc biệt • Loại văn phạm bao gồm văn phạm số ngôn ngữ lập trình đơn giản, chẳng hạn KPL,PL/0, PÁSCAL-S Bảng phân tích tiền định • Dùng cho sinh phân tích cú pháp • Đầu vào giải thuật: văn phạm G xâu w • Căn • Ký hiệu xét • Ký hiệu đỉnh stack • Quyết định • • • • Thay ký hiệu không kết thúc Chuyển trỏ sang ký hiệu tiếp Chấp nhận xâu Thông báo lỗi Bộ phân tích cú pháp tiền định Vào: Văn phạm phi ngữ cảnh LL(1) G Xâu w Các thành phần • • • • Stack Bảng phân tích Băng vào Chương trình phân tích Mơ tả thành phần • Băng vào chứa xâu cần phân tích, kết thúc $ (EOF) • Stack giống stack D2 phân tích cú pháp top down quay lui, # đáy stack Ban đầu S đỉnh stack, ký hiệu # • Bảng phân tích M[A,a] với A ký hiệu văn phạm, a ký hiệu kết thúc $ Hoạt động phân tích cú pháp • Nếu stack cịn lại # (đáy), đầu đọc $ (EOF), dừng đoán nhận xâu • If X=a (ký hiệu kết thúc xét xâu vào) khơng $ , xóa X đỉnh stack , chuyển đầu đọc sang ô • Nếu X ký hiệu khơng kết thúc, PTCP tra bảng phân tích cú pháp M, tìm ô M[X,a], thay ký hiệu đỉnh stack (X) vế phải sản xuất (nếu có) Nếu ô rỗng -> ERROR, gọi thủ tục thông báo lỗi Bảng phân tích LL(1) • Dùng cho sinh phân tích cú pháp • Căn • Ký hiệu xét • Ký hiệu đỉnh stack • Quyết định • Thay ký hiệu khơng kết thúc • Chuyển trỏ sang ký hiệu tiếp • Chấp nhận xâu 12 Giải thuật xây dựng bảng phân tích Với sản xuất A văn phạm G, thực bước Với ký hiệu kết thúc a FIRST() , thêm A vào M[A,a] If thuộc FIRST(), thêm A vào M[A,b] với b thuộc FOLLOW(A) If thuộc FIRST() , $ thuộc FOLLOW(A), thêm A vào M[A,$] Các ô M(a,a) với a ký hiệu kết thúc, thêm hành động “đẩy” M[#,$] =“nhận” Các ô cịn lại đánh dấu “lỗi” Ví dụ • Văn phạm: ETE' E'+TE'| TFT' T'*FT'| F(E)|id FIRST(+TE’) = {+} FOLLOW(E') = {$, )} FIRST(*FT’) = {*} FOLLOW(T') = {+, $, )} FIRST((E)) = {(} FIRST(id) = {id} Văn phạm LL(1) xây dựng phân tích tiền định 14 Bảng phân tích FIRST(E) = {(, id} FIRST(+TE’) = {+} + E E' T T' F + * ( ) id # * ( ETE' E'+TE' FOLLOW(E') = {$, )} ) E' TFT' T' id ETE' T'*FT' $ E' TFT' T' F(E) T' Fid Đẩy Đẩy Đẩy Đẩy Đẩy Nhận 15 Phân tích xâu vào id*id sử dụng bảng phân tích stack Bước Stack #E #E'T #E'T'F #E'T'id #E'T' #E’T'F* #E’T'F #E’T’id #E’T' 10#E’ 11# Xâu vào Hành động id*id$ id*id$ id*id$ id*id$ *id$ *id$ id$ id$ $ $ ETE' TFT' Fid đẩy id T'*FT' đẩy * Fid đẩy id T' E’ nhận 16
Ngày đăng: 10/10/2023, 18:33
Xem thêm: