Bài giảng xây dựng chương trình dịch bài 7 phân tích cú pháp tiền định

16 1 0
Bài giảng xây dựng chương trình dịch bài 7   phân tích cú pháp tiền định

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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 XY1Y2 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, xFOLLOW(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 AB, ký hiệu FIRST() trừ  tham gia vào FOLLOW(B) • Với sản xuất dạng AB AB 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: ETE' E'+TE'| TFT' 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 # * ( ETE' E'+TE' FOLLOW(E') = {$, )} ) E' TFT' T' id ETE' T'*FT' $ E' TFT' T' F(E) T' Fid Đẩ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$ $ $ ETE' TFT' Fid đẩy id T'*FT' đẩy * Fid đẩy id T' E’  nhận 16

Ngày đăng: 10/10/2023, 18:33

Tài liệu cùng người dùng

Tài liệu liên quan