intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Xây dựng chương trình dịch: Bài 7 - Nguyễn Thị Thu Hương

Chia sẻ: Ti Vu | Ngày: | Loại File: PDF | Số trang:3

62
lượt xem
3
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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" trình bày các nội dung: Phân tích tiền định, tính FOLLOW, bảng phân tích tiền định. Đây là một tài liệu tham khảo hữu ích dành cho các bạn sinh viên Công nghệ thông tin dùng làm tài liệu học tập và nghiên cứu.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Xây dựng chương trình dịch: Bài 7 - Nguyễn Thị Thu Hương

21/1/2010<br /> <br /> Phân tích tiền định<br /> „<br /> <br /> Bài 7<br /> Phân tích cú pháp tiền định<br /> „<br /> <br /> „<br /> <br /> Tư tưởng chính của phân tích cú pháp trên xuống :<br /> … Bắt đầu từ gốc, phát triển xuống các nút cấp dưới<br /> … Chọn một sản xuất và thử xem có phù hợp với xâu vào<br /> không<br /> … Có thể quay lui<br /> Có thể tránh được quay lui?<br /> … Cho sản xuất A → α | β bộ phân tích cú pháp cần chọn<br /> giữa α và β<br /> Làm thế nào?<br /> … Cho ký hiệu không kết thúc A và ký hiệu xem trước t, sản<br /> xuất nào của A chắc chắn sinh ra một xâu bắt đầu bởi t?<br /> <br /> 1<br /> <br /> Phân tích tiền định<br /> <br /> 2<br /> <br /> Phân tích tiền định<br /> <br /> Nếu có hai sản xuất: A→α⏐β , ta mong muốn<br /> có một phương pháp rõ ràng để chọn đúng sản<br /> xuất cần thiết<br /> „ Định nghĩa:<br /> „<br /> <br /> „<br /> <br /> … Nếu<br /> <br /> X là ký hiệu kết thúc FIRST(X)={X}<br /> … Nếu X→ε là một sản xuất thì thêm ε vào<br /> FIRST(X)<br /> … Nếu X là ký hiệu không kết thúc và<br /> X→Y1Y2...Yn là một sản xuất , thêm<br /> FIRST(Yi+1) vào FIRST(X) nếu FIRST(Yj)<br /> chứa ε<br /> <br /> α là một xâu chứa ký hiệu kết thúc và không<br /> kết thúc, x ∈ FIRST(α) nếu từ α có thể suy dẫn ra<br /> xγ (x chứa 0 hoặc 1 ký hiệu)<br /> <br /> … Với<br /> <br /> „<br /> <br /> Nếu FIRST(α) và FIRST(β) không chứa ký<br /> hiệu chung ta biết phải chọn A→α hay A→β<br /> khi đã xem trước một ký hiệu<br /> <br /> Tính FIRST(X):<br /> <br /> 3<br /> <br /> 4<br /> <br /> 1<br /> <br /> 21/1/2010<br /> <br /> Phân tích tiền định<br /> <br /> Tính FOLLOW<br /> <br /> Điều gì xảy ra nếu ta có sản xuất để chọn là<br /> A→α với α=ε hoặc α⇒*ε?<br /> „ Có thể mở rộng<br /> g nếu ta biết rằng<br /> g có một dạng<br /> g<br /> câu mà ký hiệu đang xét xuất<br /> ấ hiện sau A<br /> „ Định nghĩa:<br /> <br /> …FOLLOW(S)<br /> <br /> chứa EOF<br /> …Với các sản xuất dạng A→αBβ, mọi ký hiệu<br /> trong FIRST(β) trừ ε tham gia vào<br /> FOLLOW(B)<br /> …Với các sản xuất dạng A→αB hoặc<br /> A→αBβ trong đó FIRST(β) chứa ε,<br /> FOLLOW(B) chứa mọi ký hiệu của<br /> FOLLOW(A)<br /> <br /> „<br /> <br /> … Với<br /> <br /> A là ký hiệu không kết thúc,<br /> x∈FOLLOW(A) nếu và chỉ nếu Scó thể suy<br /> dẫn ra αAxβ<br /> 5<br /> <br /> Phân tích tiền định<br /> „<br /> <br /> Bảng phân tích tiền định<br /> <br /> Với các khái niệm<br /> <br /> Dùng cho bộ sinh phân tích cú pháp<br /> „ Căn cứ<br /> <br /> … FIRST<br /> … FOLLOW<br /> <br /> „<br /> „<br /> „<br /> <br /> 6<br /> <br /> „<br /> <br /> Ta có thể xây dựng bộ phân tích cú pháp mà<br /> không đòi hỏi quay lui<br /> Chỉ có thể xây dựng bộ phân tích cú pháp như<br /> vậy cho những văn phạm đặc biệt<br /> Loại văn phạm như vậy bao gồm văn phạm một<br /> số ngôn ngữ lập trình đơn giản, chẳng hạn<br /> KPL,PL/0, PÁSCAL-S<br /> <br /> … Ký<br /> <br /> hiệu đang xét<br /> … Ký hiệu đang ở đỉnh stack<br /> „<br /> <br /> Quyết định<br /> … Thay<br /> <br /> thế ký hiệu không kết thúc<br /> con trỏ sang ký hiệu tiếp<br /> … Chấp nhận xâu<br /> … Chuyển<br /> <br /> 7<br /> <br /> 8<br /> <br /> 2<br /> <br /> 21/1/2010<br /> <br /> Ví dụ<br /> „<br /> <br /> Văn phạm:<br /> <br /> Bảng phân tích<br /> <br /> E→TE'<br /> E'→+TE'|ε<br /> T→FT'<br /> T'→*FT'|ε<br /> F→(E)<br /> F→id<br /> <br /> +<br /> E<br /> E' E'→+TE'<br /> T<br /> T'→ε<br /> T'<br /> F<br /> Đẩy<br /> +<br /> *<br /> (<br /> )<br /> id<br /> $<br /> <br /> FIRST(E) = FIRST(T) = FIRST(F) = {(, id}<br /> FIRST(E') = {+, ε}<br /> FIRST(T') = {*, ε}<br /> FOLLOW(E) = FOLLOW(E') = {$, )}<br /> FOLLOW(T) = FOLLOW(T') = {+, $, )}<br /> FOLLOW(F) = {*, +, $, )}<br /> Văn phạm này có thể xây dựng bộ phân tích tiền định<br /> 9<br /> <br /> *<br /> <br /> T'→*FT'<br /> <br /> (<br /> E→TE'<br /> T→FT'<br /> T→FT<br /> F→(E)<br /> <br /> )<br /> E'→ε<br /> T'→ε<br /> <br /> id<br /> E→TE'<br /> T→FT'<br /> T→FT<br /> F→id<br /> <br /> $<br /> E'→ε<br /> T'→ε<br /> <br /> Đẩy<br /> Đẩy<br /> Đẩy<br /> <br /> Đẩy<br /> Nhận<br /> 10<br /> <br /> Phân tích xâu vào id*id<br /> sử dụng bảng phân tích và stack<br /> <br /> Bước Stack<br /> 1<br /> $E<br /> 2<br /> $E'T<br /> $<br /> 3<br /> $E'T'F<br /> 4<br /> $E'T'id<br /> 5<br /> $E'T'<br /> 6<br /> $T'F*<br /> 7<br /> $T'F<br /> 8<br /> $T'id<br /> 9<br /> $T'<br /> 10<br /> $<br /> <br /> Xâu vào<br /> id*id$<br /> id*id$<br /> $<br /> id*id$<br /> id*id$<br /> *id$<br /> *id$<br /> id$<br /> id$<br /> $<br /> $<br /> <br /> Hành động kế tiếp<br /> E→TE'<br /> T→FT'<br /> F→id<br /> đẩy id<br /> T'→*FT'<br /> đẩy *<br /> F→id<br /> đẩy id<br /> T'→ε<br /> nhận<br /> 11<br /> <br /> 3<br /> <br />
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2