Bài giảng Thực hành chương trình dịch: Bài 2 - Phạm Đăng Hải
lượt xem 3
download
Bài giảng "Thực hành chương trình dịch: Bài 2 - Phân tích từ vựng" được thực hiện nhằm giúp các bạn sinh viên nắm được thành phần thực hiện chức năng phân tích từ vựng; nhiệm vụ của bộ scanner; bảng chữ cái của KPL; các từ tố của ngôn ngữ KPL;... Mời các bạn cùng tham khảo bài giảng!
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Thực hành chương trình dịch: Bài 2 - Phạm Đăng Hải
- Thực hành CHƯƠNG TRÌNH DỊCH Bài 2: Phân tích từ vựng Phạm Đăng Hải haipd@soict.hut.edu.vn
- Scanner Token Chương Phân tích Phân tích trình nguồn từ vựng getToken() cú pháp Bảng ký hiệu • Trong một chương trình dịch, thành phần thực hiện chức năng phân tích từ vựng gọi là scanner. 09/20/23 2
- Scanner 09/20/23 3
- Nhiệm vụ của bộ scanner • Bỏ qua các ký tự vô nghĩa – Dấu cách, tab, ký tự xuống dòng, chú thích. • Phát hiện các ký tự không hợp lệ • Phát hiện token – Định danh (identifier) /Từ khóa (keyword) – Số (number) /Hằng ký tự/xâu ký tự – Special character… • Chuyển lần lượt các token cho bộ phân tích cú pháp (parser) 09/20/23 4
- Bảng chữ cái của KPL • Chữ cái (letter): a-z, A-Z, ‘_’ • Chữ số (digit): 0-9 • Các ký hiệu đặc biệt +, -, *, /, >,
- Các từ tố của ngôn ngữ KPL • Từ khóa PROGRAM, CONST, TYPE, VAR, PROCEDURE, FUNCTION, BEGIN, END, ARRAY, OF, INTEGER, CHAR, CALL, IF, ELSE, WHILE, DO, FOR, TO • Toán tử := (assign), + (addition), - (subtraction), * (multiplication), / (division), = (comparison of equality), != (comparison of difference), > (comparison of greaterness), < (comparison of lessness), >= (comparison of greaterness or equality),
- Các từ tố của ngôn ngữ KPL • Ký hiệu đặc biệt ; (semicolon), . (period), : (colon), , (comma), ( (left parenthesis), ) (right parenthesis), ‘ (singlequote) • Ký hiệu kép (. và .) để đánh dấu chỉ mục của mảng (* và *) để đánh dấu điểm bắt đầu và kết thúc của chú thích • Các thành phần khác Định danh, số, hằng ký tự 09/20/23 7
- Nhận dạng các Token của KPL • Các token của KPL tạo nên một ngôn ngữ chính quy – Có thể mô tả bởi một sơ đồ cú pháp chính quy. – Chúng có thể nhận dạng bằng một automat hữu hạn xác định • Scanner là một automat hữu hạn xác định 09/20/23 8
- Nhận dạng các Token của KPL c a r S0 S1 S1 S1 Token’s type: identifier Token’s value: car car >= 30 ““ > = S0 S0 S4 S5 Token’s type: greaterness or equality comparison operator Token’s value: >= ““ 3 0 S0 S0 S2 S2 Token’s type: number Token’s value: 30 • Khi hoàn tất nhận dạng một token, automat sẽ chuyển lại về trạng thái 0 • Khi có lỗi xảy ra (gặp ký tự lạ,…), automat sẽ trả về trạng thái -1, . 09/20/23 9
- Xây dựng Scanner STT Tên tệp Nội dung 1 Makefile Project 2 scanner.c Tệp chính 3 reader.h, Đọc mã nguồn reader.c 4 charcode.h, Phân loại ký tự charcode.c 5 token.h, Phân loại và nhận dạng token, token.c từ khóa 6 error.h, error.c Thông báo lỗi 09/20/23 10
- Xây dựng Scanner Reader // Mở kênh vào int openInputStream(char *fileName); // Đóng kênh vào void closeInputStream(void); // Đọc một ký tự từ kênh vào int readChar(void); // Chỉ số dòng, cột hiện tại int lineNo, colNo; // Ký tự hiện tại int currentChar; 09/20/23 11
- Xây dựng Scanner charcode typedef enum { CHAR_SPACE, // Khoảng trống CHAR_LETTER, // Chữ cái CHAR_DIGIT, // Chữ số CHAR_PLUS, // ‘+’ CHAR_MINUS, // ‘-’ CHAR_TIMES, // ‘*’ CHAR_SLASH, // ‘/’ CHAR_LT, // ‘‘ CHAR_EXCLAIMATION, // ‘!’ CHAR_EQ, // ‘=‘ CHAR_COMMA, // ‘,’ CHAR_PERIOD, // ‘.’ CHAR_COLON, // ‘:’ CHAR_SEMICOLON, // ‘;’ CHAR_SINGLEQUOTE, // ‘\’’ CHAR_LPAR, // ‘(‘ CHAR_RPAR, // ‘)’ CHAR_UNKNOWN // Ký tự ngoài bảng chữ cái } CharCode; 09/20/23 12
- Xây dựng Scanner charcode • charcode.c – Định nghĩa một bảng charCodes ánh xạ từng ký tự trong bảng mã ASCII vào một trong các CharCode được định nghĩa • Lưu ý: – Lệnh đọc ký tự getc() có thể trả về mã EOF có giá trị nguyên là -1, nằm ngoài bảng mã ASCII 09/20/23 13
- Xây dựng Scanner token typedef enum { TK_NONE, // Đại diện cho một lỗi TK_IDENT, // Định danh TK_NUMBER, // Số TK_CHAR, // Hằng ký tự TK_EOF, // Kết thúc chương trình // Các từ khóa KW_PROGRAM, KW_CONST, KW_TYPE, KW_VAR, KW_INTEGER, KW_CHAR, KW_ARRAY, KW_OF, KW_FUNCTION, KW_BEGIN, KW_PROCEDURE, KW_END, KW_CALL, KW_IF, KW_THEN, KW_ELSE, KW_WHILE, KW_DO, KW_FOR, KW_TO, // Các ký hiệu đặc biệt SB_SEMICOLON, SB_COLON, SB_PERIOD, SB_COMMA, SB_ASSIGN, SB_EQ, SB_NEQ, SB_LT, SB_LE, SB_GT, SB_GE, SB_PLUS, SB_MINUS, SB_TIMES, SB_SLASH, SB_LPAR, SB_RPAR, SB_LSEL, SB_RSEL 09/20/23 } TokenType; 14
- Xây dựng Scanner token // Cấu trúc lưu trữ của một token typedef struct { char string[MAX_IDENT_LEN + 1]; int lineNo, colNo; TokenType tokenType; int value; } Token; // Kiểm tra một xâu có là từ khóa không TokenType checkKeyword(char *string); // Tạo một token mới với kiểu và vị trí Token* makeToken(TokenType tokenType, int lineNo, int colNo); 09/20/23 15
- Xây dựng Scanner Error // Danh sách các lỗi trong quá trình phân tích từ vựng typedef enum { ERR_ENDOFCOMMENT, ERR_IDENTTOOLONG, ERR_INVALIDCHARCONSTANT, ERR_INVALIDSYMBOL } ErrorCode; // Các thông báo lỗi #define ERM_ENDOFCOMMENT "End of comment expected!" #define ERM_IDENTTOOLONG "Identification too long!" #define ERM_INVALIDCHARCONSTANT "Invalid const char!" #define ERM_INVALIDSYMBOL "Invalid symbol!" // Hàm thông báo lỗi void error(ErrorCode err, int lineNo, int colNo); 09/20/23 16
- Xây dựng Scanner Scanner // Đọc một token tính từ vị trí hiện tại Token* getToken(void) { Token *token; int ln, cn; if (currentChar == EOF) return makeToken(TK_EOF, lineNo, colNo); switch (charCodes[currentChar]) { case CHAR_SPACE: skipBlank(); return getToken(); case CHAR_LETTER: return readIdentKeyword(); case CHAR_DIGIT: return readNumber(); case CHAR_PLUS: token = makeToken(SB_PLUS, lineNo, colNo); readChar(); return token; … }//switch 09/20/23 } 17
- Nhiệm vụ Hoàn thiện các hàm sau trong scanner.c – void skipBlank(); – void skipComment(); – Token* readIdentKeyword(void); – Token* readNumber(void); – Token* readConstChar(void); – Token* getToken(void) 09/20/23 18
- Yêu cầu kết quả • Hạn nộp: 23h59m59s, Thứ năm Ngày 11/03/2020 • Quy cách: – Nộp 01 file nén theo định dang .zip có tên: Ten_HoDem – File nén chỉ gồm các file mã nguồn (*.c, *.h) và file readme.txt (nếu cần, mô tả chương trình), makefile • Quy cách chương trình – Chương trình được dịch bằng DevC++5.11 theo chế độ dòng lệnh • Ví dụ: C:\>gcc scanner.c +error.c+token.c+….–o Kpl – Chương trình thực hiện theo cú pháp • Ví dụ: C:\> Kpl.exe Vidu.KPL – Output: Danh sách từ tố 09/20/23 19
- Ví dụ: Kết quả Program Example1; (* Example 1 *) Begin KW_PROGRAM ABC := 10; TK_IDENT(Example1) End. (* Example 1 *) SB_SEMICOLON KW_BEGIN TK_IDENT(ABC) SB_ASSIGN TK_NUMBER(10) SB_SEMICOLON KW_END SB_PERIOD 09/20/23 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng thực hành lập trình web 2 - Bài 1
9 p | 529 | 128
-
Bài giảng Thực hành Autocad 2000 - Nguyễn Độ
192 p | 366 | 99
-
Bài giảng Thực hành mô hình cấu trúc tuyến tính (SEM) với phần mềm AMOS: Phần 1
53 p | 351 | 70
-
Bài giảng Thực hành lập trình Windows Visual Basic: Bài 01-04 - Phạm Ngọc Hưng
28 p | 108 | 10
-
Bài giảng Kỹ thuật lập trình - Chương 3
16 p | 80 | 9
-
Bài giảng Thực hành chương 5: Cấu hình Group Policy để tự động map ổ đĩa mạng cho Client - Từ Thanh Trí
9 p | 107 | 9
-
Bài giảng Kỹ thuật lập trình - Hà Đại Dương, Nguyễn Mậu Uyên
200 p | 81 | 8
-
Bài giảng Thực hành chương 3: Tạo User Account & cấu hình Home Folder Cho User Account
12 p | 157 | 8
-
Bài giảng Thực hành Unix, Linux 2 - ĐH Bách khoa TP.HCM
89 p | 68 | 7
-
Bài giảng Ngôn ngữ lập trình Pascal: Chương 6 - Thực hành Turbo Pascal
6 p | 126 | 6
-
Bài giảng Thực hành chương 1: Cài đặt Windows Server 2003 - Từ Thanh Trí
12 p | 87 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 1 - Phạm Đăng Hải
13 p | 16 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 3 - Phạm Đăng Hải
32 p | 18 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 5 - Phạm Đăng Hải
66 p | 21 | 4
-
Bài giảng Thực hành cơ sở lập trình: Giới thiệu về IDE
18 p | 10 | 4
-
Bài giảng Thực hành cơ sở lập trình: C Programming (Phần 1)
27 p | 7 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 4 - Phạm Đăng Hải
67 p | 15 | 3
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