Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
635,36 KB
Nội dung
CHƯƠNG TRÌNH DỊCH Bài 9: Phân tích văn phạm thuật toán bottom-up Nội dung Ý tưởng & thuật tốn Ví dụ minh họa Cài đặt bottom-up đơn giản Cấu trúc luật văn phạm Cấu trúc suy diễn trực tiếp Máy phân tích: hàm hỗ trợ Máy phân tích: hàm Đánh giá bottom-up Bài tập TRƯƠNG XUÂN NAM Phần Ý tưởng & thuật toán TRƯƠNG XUÂN NAM Bottom-up: ý tưởng Cho văn phạm G với luật sinh: S→E+S|E E→1|2|3|4|5|(S) Xâu vào: W = (1 + + (3 + 4)) + Thu gọn W thành S: (1+2+(3+4))+5(E+2+(3+4))+5 (E+E+(3+4))+5(E+E+(E+4))+5 (E+E+(E+E))+5(E+E+(E+S))+5 (E+E+(S))+5(E+E+E)+5 (E+E+S)+5(E+S)+5(S)+5 E+5E+EE+SS TRƯƠNG XUÂN NAM Bottom-up: mục tiêu & ý tưởng Mục tiêu: số nhiều suy dẫn dạng S * w, thuật toán tìm suy dẫn phải Ý tưởng chính: Thử sai quay lui lực tính tốn máy tính Dị ngược q trình suy dẫn w wn-1 … w1 S kĩ thuật thu-gọn: tìm xem wi có chứa vế phải luật hay khơng, có thay phần vế phải vế trái tương ứng Nếu wi S chắn cần phải thu-gọn, wi không chứa vế phải luật nhánh thử sai cần quay lui, ngược lại thu-gọn thử tiếp TRƯƠNG XUÂN NAM Bottom-up: thuật toán A = w Với chuỗi A đạt trình lần ngược: Nếu A = “S”: • Kết luận: q trình tìm kiếm thành cơng • Lưu lại kết (chuỗi biến đổi từ đầu để A) • Kết thúc trình tìm kiếm * Duyệt tất luật sinh dạng x → α, α chuỗi A thì: • Áp dụng thu-gọn: α A x, ta A’ • Thử bước với chuỗi A = A’ Nếu khơng có phương án thu gọn quay lui TRƯƠNG XUÂN NAM Phần Ví dụ minh họa TRƯƠNG XUÂN NAM Bottom-up: ví dụ Cho tập luật S → AB, A → ab, B → aba Chỉ trình thu gọn chuỗi w = ababa … Áp dụng luật A → ab, thu gọn ababa Aaba Chuỗi Aaba có phương án thu gọn: Aaba AAa Aaba AB TRƯƠNG XUÂN NAM Bottom-up: ví dụ Áp dụng luật A → ab, thu gọn Aaba AAa Đến nhánh ngưng khơng thu gọn tiếp Áp dụng luật B → aba, thu gọn Aaba AB TRƯƠNG XUÂN NAM Bottom-up: ví dụ Áp dụng luật S → AB, thu gọn AB S Đến điều kiện A = “S” xảy ra: Thuật toán dừng, kết luận thu gọn thành cơng Lưu lại q trình suy dẫn ngược TRƯƠNG XUÂN NAM 10 Cấu trúc luật văn phạm class Rule { public string left, right; public Rule(string l, string r) { left = l; right = r; } public string ToFineString() { string s = left + " >"; for (int i = 0; i < right.Length; i++) s += " " + right[i]; return s; } } TRƯƠNG XUÂN NAM 12 Cấu trúc suy diễn trực tiếp class Step { public int ruleNumber, position; public Step(int r, int p) { ruleNumber = r; position = p; } } Giải thích: Biến ruleNumber lưu số thứ tự luật dùng Biến position lưu vị trí áp dụng luật TRƯƠNG XN NAM 13 Máy phân tích: hàm hỗ trợ class PTBU { public List rules = new List(); public List steps; string word = null; public void AddRule(string left, string right) { rules.Add(new Rule(left, right)); } public void PrintAllRules() { Console.WriteLine(""); foreach (Rule r in rules) Console.WriteLine(" " + r.ToFineString()); } TRƯƠNG XUÂN NAM 14 Máy phân tích: hàm hỗ trợ public void PrintSteps() { Console.WriteLine("Doan nhan cong sau string w = word; foreach (Step s in steps) { string x = DoBackStep(w, s); } } string DoBackStep(string w, Step s) { string w1 = w.Substring(0, s.position); string w2 = w.Substring(s.position + rules[s.ruleNumber].right.Length); return w1 + rules[s.ruleNumber].left + w2; } TRƯƠNG XUÂN NAM 15 Máy phân tích: hàm public bool Process(string x) { steps = new List(); word = x; return BottomUp(x); } // áp dụng luật k vị trí i chuỗi w? bool CanApplyHere(string w, int i, int k) { string s = w.Substring(i); if (s.Length > rules[k].right.Length) s = s.Substring(0, rules[k].right.Length); return (s == rules[k].right); } TRƯƠNG XUÂN NAM 16 Máy phân tích: hàm public bool BottomUp(string w) { if ("S" == w) return true; for (int i = 0; i < w.Length; i++) for (int k = 0; k < rules.Count; k++) if (CanApplyHere(w, i, k)) { Step st = new Step(k, i); steps.Add(st); if (BottomUp(DoBackStep(w, st))) return true; steps.RemoveAt(steps.Count - 1); } return false; } TRƯƠNG XUÂN NAM 17 Thử nghiệm class Program { public static void Main() { PTBU parser = new PTBU(); parser.AddRule("S", "AB"); parser.AddRule("A", "ab"); parser.AddRule("B", "aba"); parser.PrintAllRules(); if (parser.Process("ababa")) parser.PrintSteps(); } } TRƯƠNG XUÂN NAM 18 Phần Đánh giá bottom-up TRƯƠNG XUÂN NAM 19 Đánh giá bottom-up Đặc trưng: Dễ hiểu: cài đặt đơn giản Chậm: duyệt tồn bộ, khơng có bước cắt nhánh Không vạn năng: không làm việc với văn phạm có suy dẫn rỗng (A → ) đệ quy (A + A) Không dễ loại bỏ kết trùng lặp (trường hợp muốn tìm phương án suy dẫn) Ý tưởng cải tiến: * Quy hoạch động: sử dụng lại kết duyệt cũ * Cắt nhánh sớm: dựa đặc trưng số luật để loại bỏ phương án khơng có tương lai TRƯƠNG XN NAM 20 Phần Bài tập TRƯƠNG XUÂN NAM 21 Bài tập Chỉ q trình thu gọn theo phân tích bottom-up chuỗi raid thuộc văn phạm G sau: S→rXd|rZd X→oa|ea Z→ai Chỉ trình thu gọn theo phân tích bottom-up chuỗi (a=(b+a)) thuộc văn phạm G sau: S→B B→R|(B) R→E=E E→a|b|(E+E) TRƯƠNG XUÂN NAM 22 Bài tập Chỉ q trình thu gọn theo phân tích bottom-up cho chuỗi (5+7)*3 thuộc văn phạm G sau: E→E+T|T T→T*F|F F → ( E ) | số Chỉ q trình thu gọn theo phân tích bottom-up chuỗi true and not false với tập luật: E → E and T | T T → T or F | F F → not F | ( E ) | true | false TRƯƠNG XUÂN NAM 23 Bài tập Chỉ trình thu gọn theo phân tích bottom-up chuỗi abbcbd thuộc văn phạm G có tập luật: S→aA|bA A→cA|bA|d Có thể thực phân tích bottom-up chuỗi aaab thuộc văn phạm G hay không? Chỉ phương án xử lý có S→AB A→aA| B→b|bB TRƯƠNG XUÂN NAM 24 Bài tập (lập trình) Hãy chỉnh sửa thuật tốn top-down bottom-up để chúng phương án suy dẫn từ kí hiệu bắt đầu S thành chuỗi đích w * Mã nguồn minh họa hai thuật toán top-down bottom-up dựa đệ quy, chuyển đổi chúng thành dạng không đệ quy (gợi ý: sử dụng stack lưu lại trạng thái chuỗi trung gian trình thử-sai luật sinh) Hãy xây dựng thuật toán chuyển đổi từ suy dẫn trả thuật tốn top-down (bottom-up) thành phân tích cú pháp tương ứng TRƯƠNG XUÂN NAM 25 Bài tập (lập trình) * Hãy điều chỉnh tht tốn top-down (bottom-up) để chúng trả phân tích cú pháp khác (dùng cho văn phạm có nhập nhằng) Nếu văn phạm G đệ quy phải, thuật tốn top-down hay bottom-up trả kết nhanh tính huống: Chuỗi w khơng thuộc văn phạm G Chuỗi w có nhiều phân tích cú pháp TRƯƠNG XUÂN NAM 26 ... trình) Hãy chỉnh sửa thuật tốn top-down bottom-up để chúng phương án suy dẫn từ kí hiệu bắt đầu S thành chuỗi đích w * Mã nguồn minh họa hai thuật toán top-down bottom-up dựa đệ quy, chuyển đổi chúng... điều chỉnh thuât toán top-down (bottom-up) để chúng trả phân tích cú pháp khác (dùng cho văn phạm có nhập nhằng) Nếu văn phạm G đệ quy phải, thuật tốn top-down hay bottom-up trả kết nhanh tính... stack lưu lại trạng thái chuỗi trung gian trình thử-sai luật sinh) Hãy xây dựng thuật toán chuyển đổi từ suy dẫn trả thuật tốn top-down (bottom-up) thành phân tích cú pháp tương ứng TRƯƠNG XUÂN