CHƯƠNG TRÌNH DỊCH. Bài 4: Phân Tích Từ Vựng Với DFA

54 8 0
CHƯƠNG TRÌNH DỊCH. Bài 4: Phân Tích Từ Vựng Với DFA

Đ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

CHƯƠNG TRÌNH DỊCH Bài 4: Phân Tích Từ Vựng Với DFA Nội dung Bộ phân tích từ vựng đơn giản Automat hữu hạn (FA) Đồ thị chuyển (TD) Automat hữu hạn không đơn định (NFA) Automat hữu hạn đơn định (DFA) Từ RE (regular expression) đến DFA Chuyển đổi từ biểu thức quy sang NFA Chuyển đổi từ NFA sang DFA DFA tối ưu cho phân tích từ vựng Bộ phân tích từ vựng dựa DFA Bài tập TRƯƠNG XUÂN NAM Phần Bộ phân tích từ vựng đơn giản TRƯƠNG XUÂN NAM Bộ PTTV đơn giản using System; using System.Collections.Generic; // định nghĩa từ loại PTTV enum WordType { TYPE_EOF, // loại kết thúc đầu vào TYPE_ERROR, // loại đầu vào lỗi TYPE_START, // kí hiệu bắt đầu = TYPE_INTEGER, // số nguyên TYPE_OPERATOR, // phép toán TYPE_PARETHESIS // ngoặc } TRƯƠNG XUÂN NAM Bộ PTTV đơn giản // lớp chứa thông tin từ class Word { public WordType wordType; // chứa từ loại từ public string wordContent; // chứa nội dung từ public Word(WordType t, string c) { wordType = t; wordContent = c; } } // lớp automata thực PTTV class PTTV { string input; int pos; TRƯƠNG XUÂN NAM Bộ PTTV đơn giản public List process(string a) { List list = new List(); input = a.Replace(" ", string.Empty); pos = 0; { Word x = getNextWord(); list.Add(x); if (x.wordType == WordType.TYPE_EOF) break; if (x.wordType == WordType.TYPE_ERROR) break; pos += x.wordContent.Length; } while (true); return list; } TRƯƠNG XUÂN NAM Bộ PTTV đơn giản // lấy từ Word getNextWord() { Word x = new Word(WordType.TYPE_EOF, ""); if (pos >= input.Length) return x; x = nextIsStart(); if (x != null) return x; x = nextIsOperator(); if (x != null) return x; x = new Word(WordType.TYPE_ERROR, ""); return x; } TRƯƠNG XUÂN NAM Bộ PTTV đơn giản // từ có phải kí hiệu bắt đầu? Word nextIsStart() { if (input[pos]=='=') return new Word(WordType.TYPE_START, "="); return null; } // từ có phải kí hiệu ngoặc? Word nextIsOperator() { if ((input[pos]=='+') || (input[pos]=='-') || (input[pos]=='*') || (input[pos]=='/')) return new Word(WordType.TYPE_OPERATOR, "" + input[pos]); return null; } } TRƯƠNG XUÂN NAM Bộ PTTV đơn giản // hàm thử nghiệm PTTV class MyApp { public static void Main() { PTTV scanner = new PTTV(); List x = scanner.process("=+1"); foreach (Word w in x) Console.WriteLine("{0}: {1}", w.wordType, w.wordContent); } } TRƯƠNG XUÂN NAM Phần 2.1 Automat hữu hạn (FA) TRƯƠNG XUÂN NAM 10 Tối ưu NFA  Khơng có nhiều hội cho tối ưu NFA, ý tưởng dễ thấy hợp trạng thái start chu trình   Trong NFA trên: trạng thái ghép đơi  Trong NFA dưới:  Trạng thái ghép đôi  Sửa đổi hàm move(2, c) = start thành move(2, c) = TRƯƠNG XUÂN NAM a c ε ε ε ε ε ε b a ε c ε 40 Tối ưu DFA  Ý tưởng: ghép trạng thái tương đương (hàm move giống nhau) b  Ví dụ: xét DFA đoán nhận b*ab*a b  Ta thấy tương đương: a     move(3, a) = move(3, b) = move(4, a) = move(4, b) = b start a b  Ghép thành trạng thái start b TRƯƠNG XUÂN NAM a b a a a b a 41 Tối ưu DFA  Với DFA mới, ta thấy tương đương:     move(1, a) = move(1, b) = move(2, a) = move(2, b) = b start b b a a a  Ghép trạng thái thành trạng thái 1, ta trạng thái tối ưu sau b b start a a  Chú ý: chưa có thuật giải tối ưu cho toán TRƯƠNG XUÂN NAM 42 Tối ưu bảng chuyển  Tổ chức bảng chuyển thường sử dụng ma trận  Ưu điểm: đơn giản, dễ hiểu, tốc độ cao  Nhược điểm: kích thước lớn, dễ nhầm lẫn mã hóa  Có số chiến thuật tối ưu bảng chuyển, chủ yếu dựa ý tưởng nén trạng thái giống TRƯƠNG XUÂN NAM 43 Phần Bộ phân tích từ vựng dựa DFA TRƯƠNG XUÂN NAM 44 DFA thực tế DFA thực tế việc ghép từ nhiều DFA con, xem DFA từ loại mà đốn nhận TRƯƠNG XN NAM 45 Bộ PTTV dựa DFA // đầu vào: chuỗi x kết thúc kí hiệu EOF // đầu ra: trạng thái chấp nhận lỗi (ERROR) s := START; while (s != ERROR) { c := nextInput(x); if (c == EOF) break; s := move(s, c); } if (isAcceptState(s)) return acceptState(s); else return ERROR; TRƯƠNG XUÂN NAM 46 Phần Bài tập TRƯƠNG XUÂN NAM 47 Bài tập Hình bên thể đồ thị chuyển DFA (bắt đầu từ q0) Hãy cho biết DFA sau đốn nhận ngơn ngữ nào? (viết dạng biểu thức quy) DFA đốn nhận biểu thức nào? TRƯƠNG XUÂN NAM q0 q1 q2 1 q3 48 Bài tập DFA đốn nhận biểu thức quy nào? DFA đốn nhận biểu thức quy nào? DFA đốn nhận biểu thức quy nào? TRƯƠNG XUÂN NAM 49 Bài tập Xây dựng NFA đoán nhận biểu thức (\+? | -?) d+ Xây dựng NFA đoán nhận biểu thức đây: (a* | b*)* (( | a) b)* (a | b)*abb(a | b)* (if | then | else) a((b|a∗c)x)∗|x∗a ab* (a|b)+ a (a|ε)b*ab Xây dựng DFA đoán nhận (0|(1(01*(00)*0)*1)*)* TRƯƠNG XUÂN NAM 50 Bài tập Chuyển đổi NFA sau thành DFA ε ε ε ε a ε ε b ε a b ε 10 Chuyển đổi NFA sau thành DFA TRƯƠNG XUÂN NAM 51 Bài tập 11 Chuyển đổi NFA sau thành DFA TRƯƠNG XUÂN NAM 52 Bài tập 12 Xây dựng DFA tối ưu cho: (a | b)*a(a | b) (a | b)*a(a | b)(a | b) (a | b)*a(a | b)(a | b)(a | b) 13 Tối ưu hóa DFA (nếu có thể) TRƯƠNG XUÂN NAM 53 Bài tập 14 Xây dựng DFA cho PTTV biểu thức Excel 10 Dấu “=” (bắt đầu biểu thức) Số nguyên dương Các phép toán: +, -, *, / Các cặp ngoặc Địa ô: A10, C6,… Số âm Số thực Lời gọi hàm: SUM, IF Địa tuyệt đối: $A$10, $C6,… Kiểu chuỗi (nằm cặp dấu nháy kép) TRƯƠNG XUÂN NAM 54 ... null; } // từ có phải kí hiệu ngoặc? Word nextIsOperator() { if ((input[pos]=='+') || (input[pos]== '-' ) || (input[pos]=='*') || (input[pos]=='/')) return new Word(WordType.TYPE_OPERATOR, "" + input[pos]);... xây dựng đoán nhận với lần thử TRƯƠNG XUÂN NAM 11 Automat hữu hạn (FA)  Automat hữu hạn (finite-state automaton) dùng để đốn nhận lớp ngơn ngữ quy (regular expression)  Cấu trúc học FA gồm:... thái (hoặc dừng báo lỗi) • Khơng chấp nhận kí hiệu đầu vào   Automat hữu hạn không đơn định (non-deterministic finite automata – NFA) • Chấp nhận kí hiệu đầu vào  • Với kí hiệu đầu vào, chuyển

Ngày đăng: 03/08/2022, 10:13

Tài liệu liên quan