Nhập môn Chương trình dịch - Bài 2
lượt xem 33
download
Mô tả các bước chính của chương trình dịch Phân tích từ vựng là gì? Viết một chương trình phân tích từ vựng Mô tả từ tố - biểu thức chính quy (REs) Viết một chương trình sinh ra chương trình phân tích từ vựng
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Nhập môn Chương trình dịch - Bài 2
- Nhập môn Chương trình dịch Bài 2: Phân tích từ vựng
- Nội dung chính Mô tả các bước chính của chương trình dịch Phân tích từ vựng là gì? Viết một chương trình phân tích từ vựng Mô tả từ tố - biểu thức chính quy (REs) Viết một chương trình sinh ra chương trình phân tích từ vựng Chuyển đổi REs – NFAs Chuyển đổi NFAs – DFAs Bài tập về nhà 1
- Mô tả các bước dịch (1) Mã nguồn (dãy các kí tự) Phân tích từ vựng If (a == 0) min = a; Dãy các từ tố (token) If ( Id:a == 0 ) Id:min = Id:a ; if Cây cú pháp Phân tích cú pháp == = ; a 0 min a Phân tích ngữ nghĩa Cây cú pháp điều khiển if boolean int == = ; int int 0 int int a min a lvalue
- Phân tích từ vựng (lexical analysis) Mã nguồn (dãy các kí tự) Phân tích từ vựng If (a == 0) min = a; Dãy các từ tố (token) If ( Id:a == 0 ) Id:min = Id:a ; Phân tích cú pháp Phân tích ngữ nghĩa
- Từ tố (token) Tên: x, y11, elsex, _i00 Từ khóa: if, else, while, break Số nguyên: 2, 1000, -500, 5L Số thực: 2.0, 0.00020, .02, 1.1e5, 0.e-10 Kí hiệu: +, *, {, }, ++,
- Phân tích từ vựng kiểu AD-HOC Tự viết mã lệnh để sinh ra các từ tố Ví dụ: Đoạn chương trình nhận dạng từ tố loại “Tên” Token readIdentifier( ) { String id = “”; while (true) { char c = input.read(); if (!identifierChar(c)) return new Token(ID, id, lineNumber); id = id + String(c); } }
- Nhìn trước 1 kí tự Duyệt chương trình nguồn từng kí tự một – Sử dụng kí tự nhìn trước để quyết định loại từ tố và vị trí kết thúc từ tố char next; else x … ^ while (identifierChar(next)) { id = id + String(next); next next = input.read (); }
- Vòng lặp chính Hàm nextToken Token nextToken( ) { if (identifierFirstChar(next)) return readIdentifier(); if (numericChar(next)) return readNumber(); if (next == ‘\”’) return readStringConst(); … }
- Các vấn đề của phương pháp AD-HOC Trong một số trường hợp, không thể biết loại từ tố qua kí tự đọc vào đầu tiên – Nếu kí tự đầu tiên là “i”, đó có thể là tên hoặc từ khóa “if” – Nếu kí tự đầu tiên là “2”, đó có thể là số nguyên hoặc số thực – Mã lệnh kiểu AD-HOC khó viết đúng, và bảo trì nó còn khó hơn nhiều Vì vậy, cần một cách tiếp cận mới, có nguyên tắc hơn: các chương trình sinh ra các chương trình phân tích từ vựng một cách tự động (ví dụ: lex, JLex)
- Các vấn đề nảy sinh Cần cách mô tả các từ tố không bị nhập nhằng – 2.e0 20.e-01 2.0000 – “” “x” “\\” “\”\’” Cần một phương pháp để tách chuỗi kí tự thành các từ tố if (x == 0) a = x
- Mô tả từ tố Từ tố trong các ngôn ngữ lập trình có thể mô tả bằng các biểu thức chính quy (REs) Mỗi biểu thức chính quy R có thể biểu diễn một tập các xâu kí tự L(R) L(R) gọi là “ngôn ngữ” định nghĩa bởi R Ví dụ – L(abc) = { abc } – L(hello|goodbye) = {hello, goodbye} – L([1-9][0-9]*) = tập các hằng số nguyên dương Ý tưởng: mô tả mỗi loại từ tố bằng một biểu thức chính quy
- Quy ước của REs L(a) = {a} – tập hợp gồm xâu “a” a ε L(ε) = {ε} – tập hợp gồm xâu rỗng R|S L(R|S) = L(R) L(S) – hợp của L(R) và L(S) RS L(RS) = {xy | x L(R), y L(S)} – nối 2 xâu bất kì của L(R) và L(S) L(R*) = L(ε|R|RR|RRR|RRRR …) – nối các R* xâu của L(R) lại với nhau
- Một số quy ước khác L(R+) = L(R*) \ {ε} – R* loại bỏ xâu rỗng R+ L(R?) = L(R|ε) R? [abcd] L([abcd]) = L(a|b|c|d) [a-z] L([a-z]) = L(a|b|..|z) L([^abc]) = kí tự bất kì không thuộc L([abc]) [^abc] L([^a-z]) = kí tự bất kì không thuộc L([a-z]) [^a-z]
- Ví dụ Biểu thức chính quy (RE) Xâu thuộc ngôn ngữ a “a” ab “ab” a|b “a”, “b” (ab)* “”, “ab”, “abab” … (a | ε) b “ab”, “b”
- Ví dụ Biểu thức chính quy (RE) Xâu thuộc ngôn ngữ digit = [0-9] “0”, “2”, “9” posint = digit+ “123”, “5678” int = -? posint “123”, “-5678” real = int (ε | (. posint)) “123”, “-5678.123” = -?[0-9]+(ε | (. [0- 9]+)) “min”, “cal_Max1” id = [a-zA-Z_][a-zA-Z0-9_]*
- Tách từ tố từ chuỗi kí tự elsex = 0; 1 else x = 0 ; 2 elsex = 0 ; REs là chưa đủ để chỉ ra cách tách các từ tố Đa số các ngôn ngữ sử dụng luật “dài nhất thắng”: RE cho xâu dài nhất có thể được sẽ được chọn Khi RE cho các xâu dài bằng nhau, từ tố được ưu tiên hơn sẽ được chọn Đặc tả chương trình PTTV = REs + luật “dài nhất thắng” + mức độ ưu tiên
- Đặc tả chương trình PTTV Là đầu vào cho các chương trình sinh ra chương trình phân tích từ vựng – Danh sách REs theo thứ tự ưu tiên – Hành động gắn liền với mỗi RE khi chương trình PTTV nhận dạng được một từ tố bằng RE đó Đầu ra của các chương trình này là một chương trình PTTV có thể – Đọc chương trình nguồn và tách nó ra thành các từ tố bằng cách nhận dạng REs – Thông báo lỗi nếu gặp phải kí tự không đúng theo REs
- Example: Lex %% digits = 0|[1-9][0-9]* letter = [A-Za-z] identifier = {letter}({letter}|[0-9_])* whitespace = [\ \t\n\r]+ %% {whitespace} {/* discard */} {digits} { return new IntegerConstant(Integer.parseInt(yytext()); } “if” { return new IfToken(); } “while” { return new WhileToken(); } … {identifier} { return new IdentifierToken(yytext()); }
- Tổng kết Chương trình PTTV chuyển chương trình nguồn thành dãy các từ tố (token) PTTV kiểu AD-HOC khó viết đúng, khó bảo trì Có thể mô tả chính xác các từ tố trong các ngôn ngữ lập trình bằng biểu thức chính quy (RE) Đầu vào của chương trình sinh ra chương trình PTTV là đặc tả của chương trình PTTV: REs, mức độ ưu tiên và các hành động tương ứng Bài tới: hoạt động của các chương trình sinh ra chương trình PTTV
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Giáo trình Nhập môn Mạng máy tính - Hồ Đắc Phương
193 p | 1241 | 340
-
Nhập môn Quản trị hệ thống Linux
264 p | 274 | 124
-
LÝ THUYẾT NHẬP MÔN INTERNET VÀ E-LEARNING - 2
21 p | 174 | 37
-
LÝ THUYẾT NHẬP MÔN INTERNET VÀ E-LEARNING - 4
21 p | 166 | 35
-
LÝ THUYẾT NHẬP MÔN INTERNET VÀ E-LEARNING - 3
21 p | 152 | 25
-
LÝ THUYẾT NHẬP MÔN INTERNET VÀ E-LEARNING - 6
21 p | 244 | 24
-
LÝ THUYẾT NHẬP MÔN INTERNET VÀ E-LEARNING - 5
21 p | 131 | 21
-
Giáo trình Nhập môn tin học: Phần 2
62 p | 118 | 16
-
Môn tin học đại cương - Phần 5
27 p | 84 | 13
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn