Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 46 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
46
Dung lượng
210,08 KB
Nội dung
CHƯƠNG PHÂN TÍCH CÚ PHÁP 4.1 Vai trò phân tích cú pháp - Phương pháp tổng quát: Cocke-Younger-Kasami Earley - Phân tích từ xuống - Phân tích từ lên 4.2 Xây dựng văn phạm cho ngôn ngữ lập trình Loại bỏ không tường minh stmt → if exp then stmt if exp then stmt else stmt | other Thí dụ: phát biểu: if E1 then if E2 then S1 else S2 phát biểu không tường minh - Loại bỏ không tường minh Quy ứơc sửa văn phạm stmt → matched-stmt lunmatched-stmt matched-stmt→ if exp then matched-stmt else matched-stmt1 | other unmatched-stmt → if exp then stmt | if exp then matched-stmt else unmatched-stmt Loại bỏ đệ quay trái Văn phạm gọi đệ quy trái tồn dẫn xuất A ⇒ Aα, với α ⊂ ( Vt ∪ Vn) Đệ quy trái bao gồm đệ quy trái đơn giản (trực tiếp) đệ quy trái tổng quát Để loại bỏ đệ quy đơn giản, ta thay thếõ tập luật sinh: A → Aα1⏐Aα2⏐ …… ⏐Aαm⏐β1⏐β2⏐… ⏐βn cặp luật sinh A→ β1A’⏐β2A’⏐…⏐βnA.’ A’→α1A’⏐α2A’⏐ … ⏐αmA’⏐∈ Thí dụ 4.1 Loại bỏ đệ quy trái cho văn phạm: E→ E+T⏐ T T→ T*F⏐F F → (E) ⏐ id Giaûi thuật 4.1 Loại bỏ đệ qy trái Nhập: Văn phạm G vòng lặp hội luật sinh rỗng Xuất : Văn phạm tương đương G’ đệ quy trái Phương pháp: Áp dụng giải thuật mô 4.1 cho G G’ không đệ quy trái có luật sinh rỗng Sắp xếp caucus ký hiệu không kết thúc theo thứ tự đó: A1, A2, … An Mô 4.1 Giải thuật loại bỏ đệ quy trái từ văn phạm for i := to n for j := to i - begin - Thay luật sinh có dạng Ai → Aj γ luật sinh Ai→ δ1γ⏐δ2γ⏐… ⏐δkγ - Với Aj luật sinh có dạng Ai → δ1⏐δ2⏐ ….⏐δk - Loại luật sinh có đệ quy trái trực tiếp Ai luật sinh end; Thí dụ: Chúng ta có áp dụng giải thuật 4.1 vào văn phạm sau để loại bỏ đệ quy trái S→ Aa⏐ b A → Ac⏐ Sd ⏐∈ Thừa số trái: Thí dụ ta có hai luaät sinh: stmt → if exp then stmt else stmt ⏐if exp then stmt Cả hai luật sinh có if dẫn đầu nên ta chọn luật sinh để triển khai Vì để làm chậm lại định lựa chọn tạo thừa số trái Giải thuật 4.2 Tạo văn phạm có thừa số trái Nhập: cho văn phạm G Xuất: văn phạm G’ có thừa số trái tương đương Phương pháp: Tìm chuỗi dẫn đầu chung vế phải luật sinh, thí dụ: A → αβ1⏐αβ2⏐… ⏐αβn⏐γ γ chuỗi không bắt đầu α Ta thay luật luật A→αA’ A’→ β1⏐β2⏐…⏐βn Thí du: ï Ta áp dụng giải thuật cho văn phạm phát biểu if, nước văn phạm tương đương S → i E t SS’⏐a S’→ e S⏐∈ E→b 4.3 Phân tích cú pháp từ xuống Phân tích cú pháp đệ quy xuống Phân tích cú pháp đoán nhận trứơc Phân tích cú pháp đệ quy xuống Thí dụ: Cho văn phạm G : S→ cAd A → ab ⏐ a S c S A a d b a) c A d a b) Hình 4.4 Các bước phân tích cú pháp từ xuống Phân tích cú pháp đoán nhận trước - Hãy loại bỏ đệ quy trái cho văn phạm mà thiết kế - Hãy tạo văn phạm có thừa số trái cần thiết Sơ đồ dịch cho phân tích đoán nhận trước Sơ đồ có đặc điểm sau: - Mỗi ký hiệu không kết thúc có sơ đồ - Tên cạnh token ký hiệu không kết thúc Sự truyền token thực ký hiệu nhập trùng với token Nếu có truyền ký hiệu không kết thúc A ta thực lệnh gọi thủ tục A Để xây dựng sơ đồ tiến hành bước sau đây: Tạo trạng thái bắt đầu kết thúc Với luật sinh có dạng A Ỉ X1X2…Xn , ta xây dựng đường từ trạng thái bắt đầu đến trạng thái kết thúc cho cạnh có tên X1, X2, X3…Xn Cơ chế hoạt động phân tích đoán nhận trước Thí dụ 4.3 Chúng ta tạo sơ đồ dịch cho văn phạm G: E Ỉ TE’ E’ Ỉ + TE’ |∈ T Ỉ FT’ T’ Ỉ ∗ FT’ |∈ F’ Ỉ (E) | id T E: T: T’: 10 ∗ 11 E’ F F’ 12 ∈ T’ + 14 F: E’ ∈ E’: T’ T ( 15 ∈ 16 id Hình 4.5 Sơ đồ dịch ký hiệu không kết thúc G ) + E: T ∗ ∈ T: F 10 ∈ 13 F: 14 ( 15 E 16 ) id Hình 4.6 Sơ đồ dịch ký hiệu không kết thúc G, thu giảm Giải thuật: procedure E; procedure T; procedure F; begin nextchar (c); if c = ‘(‘ then begin match (‘(‘); E; match (‘)‘); end else if c = id then match (id) else error; 17 end; {F} begin F; while c = ‘*‘ F; end; {T} begin T; while c = ‘+‘ T; end; {E} Phân tích cú pháp đoán nhận trước không đệ quy Cấu tạo phân tích cú pháp Stack X a1a2 … an $ đệm nhập Chương trình điều khiển Xuất Y Z $ Bảng phân tích M Hình 4.7 Mô hình cấu tạo phân tích đoán nhận trước không đệ quy Thí dụ 4.12 Cho văn phạm G (1) E Ỉ E + T (2) E Ỉ T (3) T Ỉ T * F (4) T Ỉ F (5) F Ỉ (E) (6) F Ỉ id Bảng 4.8 Bảng phân tích cho văn phạm G thí dụ 4.12 Trạng thái action id + * s5 goto ( ) $ s4 s6 r2 s7 r2 r2 r4 r4 r4 r4 s4 r6 T F acc s5 E r6 r6 s5 s4 s5 s4 r6 10 s11 s6 r1 s7 r1 r1 10 r3 r3 r3 r3 11 r5 r5 r5 r5 s11 Thí dụ: Phân tích câu w = id ∗ id + id Văn phạm LR Xây dựng bảng phân tích SLR Định nghóa thực thể LR (0) Thí dụ: G có luật sinh A Ỉ XYZ, cho boỏn thửùc theồ: AặãXYZ; AặXãYZ; AặXYãZ; AặXYZã Neỏu A Ỉ ∈ cho ta thực thể A Ỉ • • Ý tưởng giải thuật xây dựng bảng phân tích SLR từ văn phạm, tìm DFA, nhận dạng chuỗi dẫn đầu bên trái dạng câu (viable prefixe) Định nghóa văn phạm gia tố: G văn phạm, G’ văn phạm gia tố, G có S’ ký hiệu mục tiêu có thêm luật sinh S’ Ỉ S Phép bao đóng – Closure Giải thuật tính closure Mô 4.4 Giải thuật tính hàm closure function closure (| : item) : item; begin J := |; repeat for với thực thể A Ỉ α.Bβ J với luật sinh B Ỉ γ G cho thửùc theồ B ặ ã chửa coự J theõm B ặ ã vaứo J; until thêm thực thể vào J; closure := J; end; Giải thuật tính goto: hàm goto (I, X) với I tập thực thể, X ký hiệu văn phạm Goto (I, X) closure tập thực thể có dạng A Ỉ αX.β cho thực thể A Ỉ α.Xβ I Mô 4.5 Giải thuật tính tập tuyển tập thực thể procedure items (G’); begin C := {closure ({S’ Ỉ • S}}} repeat for với tập thực thể I C với ký hiệu văn phạm X cho phép goto (I, X) không rỗng C thêm goto (I, X) vào C; until thêm tập thực thể vào C; end; Thí dụ 4.13 Cho văn phạm gia tố G’ E’ Ỉ E ; E Ỉ E + T ; E Ỉ T T Ỉ T* F ; T Æ F ; F Æ (E) ; F Æ id Hãy tìm tập C sơ đồ DFA Xây dựng bảng phân tích SLR Giải thuật 4.6 Xây dựng bảng phân tích Nhập: văn phạm gia tố G’ Xuất: bảng phân tích SLR với hàm action goto cho văn phạm G’ Phương pháp: Xây dựng C = {Io, I1, … In} i trạng thái đại diện cho taọp thửùc theồ Ii a Neỏu A ặ ãa thực thể Ii goto (Ii, a) = Ij phần tử action [i, a] = shift(j), với a phải ký hiệu kết thúc b Nếu A ặ ã ụỷ Ii thỡ action [i, a] = reduce(A Ỉα) với a tất ký hiệu nằm follow (A) A S’ (kyự hieọu muùc tieõu mụựi) c Neỏu S ặ Sã ôû Ii action [i, $] = accept Cho tất ký hiệu không kết thúc A Nếu goto [Ii, A]=Ij hàm goto [i, A]=j Tất phần tử bảng phân tích không xác định quy tắc 3, coi lỗi Trạng thái bắt đầu phân tích tập thực thể có chứa thực theồ S ặãS Thớ duù 4.14 Xaõy dửùng baỷng phân tích SLR cho văn phạm G thí dụ 4.13 Thí dụ 4.15 Cho văn phạm G (1) S Æ L = R (2) S Æ R (3) L Æ * R (4) L Æ id (5) R Æ L Ta nhận thấy đụng độ action [2, =] = s6 đồng thời action [2, =] = r5 action [2, $] = r5 Do phần tử action [2, =] có hai trị s6 r5 Như G văn phạm SLR Xây dựng bảng phân tích Canonical LR Dạng tổng quát thực thể [A Ỉ α.β, a] với A Ỉ αβ luật sinh a ký hiệu kết thúc dấu $ Thực thể có dạng gọi thực thể LR (1) Nếu β = ∈ thỡ thửùc theồ seừ coự daùng [A ặ ã , a] Lúc thực thu giảm luật sinh A Ỉ α với điều kiện ký hiệu nhập a Chúng ta nói thực thể LR (1) [A Ỉ α.β, a] hợp lệ với chuỗi ký hiệu dẫn đầu dạng câu γ tồn dẫn xuất phải: S ⇒ δAw ⇒ δαβw với rm rm γ = δα a ký hiệu dẫn đầu w, w = ∈ a $ Thí dụ 4.16 Cho văn phạm G S Ỉ BB B Ỉ aB | b Tính tập tuyển thực thể LR (1) Phép tính closure Giải thuật 4.7 Xây dựng tập thực thể LR (1) Mô 4.7 Giải thuật tính tập thực thể LR (1) cho văn phạm gia toá G’ function closure (I: items): items; begin repeat for vụựi moói thửùc theồ [A ặ ã B, a] , với luật sinh B Ỉ η G’ với ký hiệu kết thúc b thuoọc first cho thửùc theồ [B ặ ã , b] | thêm thực thể [B Ỉ η, b] vào | until thêm thực thể vào |; closure := |; end; function goto (| :items; X: symbol): items; begin j tập thửùc theồ coự daùng [A ặ Xã , a] cho thửùc theồ [A ặ ã X, a] ụỷ | ; goto := closure (J); end; procedure items (G’); begin d := {closure ({S ặã S, $}}}; repeat for với tập thực thể | C với ký hiệu văn phạm X cho goto (|, X) không rỗng chưa có C thêm goto (|, X) vào C; until thêm tập thực thể vào C; end; Thí dụ 4.17 Xây dựng tập thực thể LR (1) cho văn phạm gia tố G’: S’ Ỉ S ; S Ỉ CC ; C Ỉ cC|d Giải thuật 4.8 Xây dựng bảng phân tích Canonical LR Nhập: văn phạm gia tố G’ Xuất: bảng phân tích Canonical LR với hai hàm action goto cho G’ Phương pháp: Xây dựng C = {Io, I1, …, In} Trạng thái i đại diện cho Ii a Nếu thực thể [A Ỉ α.aβ, b] Ii goto (Ii , a) = Ij phần tử action [i, a] = shift(j), a phải ký hiệu kết thúc b Nếu [A ặ ã , a] ụỷ Ii, A S thỡ action[i, a]=reduce(Aặ) c Neỏu [S ặ Sã , $] Ii action [i, $] = accept Nếu goto (Ii , A) = Ij phần tử goto [i, A] = j Tất phần tử không áp dụng quy tắc lỗi Trạng thái bắt đầu phân tích cú pháp tập thực thể co chửựa thửùc theồ [S ặ ãS , $] Baỷng phaõn tích Canonical LR cho văn phạm thí dụ 4.17 xây dựng dựa vào giải thuật 4.7 Bảng 4.10 Bảng phân tích Canonical LR Trạng thái action c d s3 s4 s6 s3 r3 s7 s4 r3 s6 s7 r2 r2 goto $ acc r1 r3 r2 S C Bộ sinh phân tích cú pháp Bộ sinh phân tích cú pháp Yacc Tập tin đặc tả Yacc translate.y y.tab.c chuỗi token Trình biên dịch Yacc y.tab.c Trình biên dịch C a.out a.out dẫn xuất Hình 4.14 Tạo phân tích cú pháp Yacc Thí dụ 4.23 Chúng ta tạo tập tin đặc tả văn phạm cho Yacc văn phạm G E+T|T TỈT*F|F F Ỉ (E) | digit Mô 4.10 Tập tin đặc tả văn phạm cho Yacc thí dụ 4.23 % { # include %} % token DIGIT %% line : exp ′\n′{printf (″% d\n″, $1) ;} ; exp : exp ′+′ term {$$ = $1 + $3;} : term ; term : term ′*′ factor {$$ = $1 + $3;} : factor ; factor : ′(′exp′)′ {$$ = $2;} : DIGIT ; %% yylex ( ) { int c ; c = getchar ( ) ; if (isdigit (c)) { yylval = c - ′0′ ; return DIGIT; } return c; } Phần đặc tả Phần luật biên dịch: Ỉ |… | Luật biên dịch Yacc: : {hành vi ngữ nghóa 1} : {hành vi ngữ nghóa 2} … : {hành vi ngữ nghóa n} Phần chương trình C phụ trợ ... tương đương S → i E t SS’⏐a S’→ e S⏐∈ E→b 4. 3 Phân tích cú pháp từ xuống Phân tích cú pháp đệ quy xuống Phân tích cú pháp đoán nhận trứơc Phân tích cú pháp đệ quy xuống Thí dụ: Cho văn phạm G... 4. 4 Phaân tích cú pháp từ lên Phân tích cú pháp từ lên hiểu phân tích đẩy thu giảm (Shift-Reduce parsing) phương pháp phân tích LR Thí dụ 4. 9 Cho văn phạm G S Ỉ aABe ; A Ỉ Abc⏐b ; BỈ d Phân tích. .. phân tích cú pháp LR - Các tính chất phương pháp phân tích LR - Giải thuật phân tích cú pháp LR Bộ phân tích cú pháp có cấu tạo sau: a1 Stack a2 … an $ đệm nhập Sm Xm Sm –1 Xm – xuất Chương trình