21/1/2010 Bài toán phân tích cú pháp Bài Bài toán đặt Cho văn phạm phi ngữ cảnh G xâu w w ∈ L(G) đú h hay sai? i? Phân tích cú pháp t ê xuống ố có ó quay lluii Phân tích xuống (top down) S ⇒* w? Phân tích trái w cú pháp ⇒cây cú pháp E -> E + T E -> T T -> >T*F T -> F F -> ( E ) F -> ident Phân tích trái α dãy sản xuất sử dụng suy dẫn trái α từ S Phân tích danh sách số từ đến p Biểu diễn cú pháp cách nào? 21/1/2010 Ví dụ Giải thuật phân tích top down quay lui Xét văn phạm G, sản xuất đánh số sau 1.E → T+E 2.E → T 3.T → F* T 4.T → F 5.F → (E) 6.F → a Phân tích trái xâu a*(a+a) 23645124646 Tư tưởng chủ yếu giải thuật xây dựng phân tích cú pháp (cây suy dẫn) cho xâu w Đánh số thứ tự sản xuất có vế phải, vậy, A - sản xuất văn phạm xếp thứ tự A → α1 | α2 | | αn Nút hoạt động ký hiệu không kết thúc A Mô tả giải thuật Bắt đầu từ nút gốc S Nút S coi nút hoạt động Tạo nút cách đệ quy Chọn vế phải A- sản xuất : X1X2 .Xk Tạo k nút trực tiếp A với nhãn X1, X2, Xk Nút hoạt động nút nhãn X1 Nếu k = 0, (sản xuất A → ε) nút hoạt động nút bên phải (ngay sau) A duyệt theo thứ tự trái 21/1/2010 Nút xét có nhãn ký hiệu kết thúc a Điều kiện để thực giải thuật So sánh với ký hiệu xét Nếu trùng với ký hiệu xét chuyển đầu đọc sang phải ô, chuyển sang xét nút bên phải Nếu a không trùng với ký hiệu xét quay lui tới nút mà sử dụng sản xuất trước (Thay ký hiệu không kết thúc (chẳng hạn A) vế phải sản xuất) Chuyển đầu đọc sang trái (nếu cần) thử với lựa chọn Nếu không lựa chọn khác quay lui tới bước trước Văn phạm G cần thoả điều kiện không đệ quy trái để tránh rơi vào chu trình Nếu quay lui tới S không lựa chọn khác:câu sai cú pháp Ví dụ 10 Dựng phân tích cú pháp Cho văn phạm S → aSb | c Các sản xuất đánh số từ đến 2 Xét xâu vào aacbb 11 12 21/1/2010 Giải thuật phân tích cú pháp quay lui Thử lựa chọn khác Vào Văn phạm G phi ngữ cảnh không đệ quy trái, xâu w = a1 .an, n ≥ Các sản xuất G đánh số 1, q Ra Một phân hâ tí tích h trái t cho h w(nếu ( ế có) ó) Thông báo lỗi ngược lại 13 Phương pháp 14 (1) ∀ A ∈ N , giả sử có A-sản xuất A → α1 | α2 | | αn Coi sản xuất (Xây dựng stack D1 D2 g câu trái ệ có ợ g D2 biểu diễn dạng cách thay ký hiệu không kết thúc vế phải tương ứng D1 ghi lại lịch sử lựa chọn sử dụng ký hiệu vào đầu đọc đổi vị trí A1 → α1 An → αn 15 16 21/1/2010 Hình trạng giải thuật Thực giải thuật Bộ bốn (s, i, α, β) s ∈ Q: Trạng thái thời Bắt đầu từ hình trạng đầu, tính liên tiếp hình trạng không g tính ợ Nếu hình trạng cuối (t,n+1,γ,ε), đưa h(γ) dừng Ngược lại đưa thông báo sai q: Trạng thái bình thường b: b Quay Q l i lui t: Kết thúc i : Vị trí đầu đọc (Băng vào có dấu hiệu kết thúc #) α: Nội dung stack thứ β: Nội dung stack thứ hai 17 Ví dụ 18 Đánh số lại sản xuất Xét xâu vào aacbb văn phạm G với sản xuất 2 S → aSb S→c 19 S1 → aSb S2 → c 20 21/1/2010 Quá trình thay đổi hình trạng Tìm phân tích trái (q,1, ε, S#) |⎯ (q, 1, S1, aSb#) |⎯ (q, 2, S1a, Sb#) |⎯ (q, 2, S1aS1,aSbb#) |⎯ (q, 3, S1aS1a, Sbb#) | (q, |⎯ ( 3, S1aS S1aS S1,aSbbb#) Sbbb#) |⎯ (b, 3, S1aS1aS1,aSbbb#) |⎯ (q, 3, S1aS1aS2, cbb#) |⎯ (q, 4, S1aS1aS2c,bb#) |⎯ (q, 5, S1aS1aS2cb,b#) |⎯ (q, 6, S1aS1aS2cbb,#) |⎯ (t, 6, S1aS1aS2cbb, ε ) h(a) = ε ∀a ký hiệu kết thúc h(Ai)= p , p số hiệu sản xuất liên hệ với sản xuất A→ γ với γ lựa chọn thứ i A Văn phạm S1 → aSb S2 → c h(S1aS1aS2cbb)=112 21 22 Thử phân tích quay lui với KPL Chuyển sơ đồ cú pháp thành luật Phân tích từ vựng mã hóa từ tố Tập sản xuất văn phạm ::= program ident ; ::= begin end 23 24 21/1/2010 Mã hóa ký hiệu không kết thúc if(str=="") return 1; if(str=="") return 2; if(str=="") return 3; if (str == "") return 4; if (str == "") ) return 5; if(str=="") return 6; if (str =="") return 7; if (str == "") return 8; if (str == "") return 9; if(str=="") return 10; if (str == "") return 11; if(str=="") return 12; Mã hóa từ tố: tên, số, ký tự if (str == "") return 13; if (str == "") return 14; if(str=="") return 15; if(str=="") return 16; if(str=="" ) return 17; if (str ( t == "") " diti ") return t 18; 18 if (str == "") return 19; if(str=="") return 20; if (str == "") return 21; if(str=="") return 22 if(str=="") return 23; if (str == "") return 24; // ident; if(str == "ident") return 25; //const if(str == "number")return 26; if ((str == "charcon")) return 27;; //operator if(str == "plus")return 28; if (str == "minus") return 29; if (str == "times") return 30; if (str == "slash") return 31; if (str == "oddsym") return 32; if (str == "assign") return 33; if (str == "leq") return 34; //specific symbol if (str =="lparen") return 35; if (str == "rparen") return 36; if (str == "comma") return 37; if (str == "semicolon") semicolon ) return 38; if (str == "period") return 39; if (str == "becomes") return 40; if (str == "lbrace") return 41; if (str == "rbrace") return 42; if (str == "lbrack") return 43; if (str == "rbrack") return 44; 25 Mã hóa từ tố: từ khóa if (str == "beginsym") return 45; if (str == "endsym") return 46; if (str == "ifsym") return 47; if (str == "thensym") return 48; if (str == "whilesym") return 49; if (str == "dosym") return 50; if (str == "callsym") return 51; if (str == "constsym") return 52; 26 Mã hóa từ tố: phép toán quan hệ if (str == "varsym") return 53; if (str == "progsym") return 54; if (str == "funcsym") return 55; if (str == "typesym") return 56; if (str == "arraysym") return 57; if (str == "ofsym") return 58; if (str == "intsym") return 59; if (str == "charsym") return 60; 27 //relations if (str == "eql") return 61; if (str == "leq") return 62; if (str == "neq") return 63; if (str == "lss") return 64; if (str == "gtr") return 65; if (str == "geq") return 66; 28 21/1/2010 Mã hóa sản xuất Nhận xét ::= program ident ; Cài đặt phức tạp Chi phí thời gian lớn chương trình phải phân tích gồm nhiều ký hiệu (từ tố) Không thể thông báo lỗi chi tiết setlaw[1,1]="54 25 38 39 "; ::= begin end setlaw[2,1]=" 12 15 10 45 16 46 "; 29 30 ... dụ Giải thuật phân tích top down quay lui Xét văn phạm G, sản xuất đánh số sau 1.E → T+E 2.E → T 3.T → F* T 4.T → F 5.F → (E) 6. F → a Phân tích trái xâu a*(a+a) 2 364 512 464 6 Tư tưởng chủ... Thử phân tích quay lui với KPL Chuyển sơ đồ cú pháp thành luật Phân tích từ vựng mã hóa từ tố Tập sản xuất văn phạm ::= program ident ; ::=