Bài giảng Xây dựng chương trình dịch: Bài 9 - Phương pháp đệ quy trên xuống
lượt xem 3
download
Bài giảng "Xây dựng chương trình dịch: Bài 9 - Phương pháp đệ quy trên xuống" cung cấp cho người học các kiến thức: đặc điểm của phương pháp; bộ phân tích cú pháp; mô tả chức năng bộ phân tích cú pháp; thủ tục triển khai một đích; bộ phân tích cú pháp KPL; sơ đồ cú pháp của lệnh KPL;... Mời các bạn cùng tham khảo nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Xây dựng chương trình dịch: Bài 9 - Phương pháp đệ quy trên xuống
- Bài 9. Phương pháp đệ quy trên xuống
- Đặc điểm của phương pháp • Sử dụng để phân tích cú pháp cho các văn phạm LL(1) • Có thể mở rộng cho văn phạm LL(k), nhưng việc tính toán phức tạp • Sử dụng để phân tích văn phạm khác có thể dẫn đến lặp vô hạn
- Bộ phân tích cú pháp • Bao gồm một tập thủ tục, mỗi thủ tục ứng với một sơ đồ cú pháp (một ký hiệu không kết thúc) • Các thủ tục đệ quy : khi triển khai một ký hiệu không kết thúc có thể gặp các ký hiệu không kết thúc khác, dẫn đến các thủ tục gọi lẫn nhau, và có thể gọi trực tiếp hoặc gián tiếp đến chính nó.
- Mô tả chức năng • Giả sử mỗi thủ tục hướng tới một đích ứng với một sơ đồ cú pháp • Tại mỗi thời điểm luôn có một đích được triển khai, kiểm tra cú pháp hết một đoạn nào đó trong văn bản nguồn
- Thủ tục triển khai một đích • Đối chiếu văn bản nguồn với một đường trên sơ đồ cú pháp • Đọc từ tố tiếp • Đối chiếu với nút tiếp theo trên sơ đồ • Nếu là nút tròn (ký hiệu kết thúc)thì từ tố vừa đọc phải phù hợp với từ tố trong nút • Nếu là nút chữ nhật nhãn A (ký hiệu không kết thúc), từ tố vừa đọc phải thuộc FIRST (A) => tiếp tục triển khai đích A • Ngược lại, thông báo một lỗi cú pháp tại điểm đang xét
- Từ sơ đồ thành thủ tục • Mỗi sơ đồ ứng với một thủ tục • Các nút xuất hiện tuần tự chuyển thành các câu lệnh kế tiếp nhau. • Các điểm rẽ nhánh chuyển thành câu lệnh lựa chọn (if, case) • Chu trình chuyển thành câu lệnh lặp (while, do while, repeat. . .) • Nút tròn chuyển thành đoạn đối chiếu từ tố • Nút chữ nhật chuyển thành lời gọi tới thủ tục khác
- Chú ý • Bộ phân tích cú pháp luôn đọc trước một từ tố • Xem trước một từ tố cho phép chọn đúng đường đi khi gặp điểm rẽ nhánh trên sơ đồ cú pháp • Khi thoát khỏi thủ tục triển khai một đích, có một từ tố đã được đọc dôi ra
- Bộ phân tích cú pháp KPL • void error(ErrorCode err, int lineNo, int colNo) • void eat(TokenType tokenType) (kiểm tra từ tố hiện hành có thuộc loại được chỉ ra không? • Các hàm phân tích cú pháp ứng với các sản xuất hoặc sơ đồ cú pháp • void compileFactor(void);//phân tích nhân tử • void compileTerm(void);//phân tích số hạng • void compileExpression(void); // phân tích biểu thức • void CompileCondition(void); // phân tích điều kiện • void CompileStatement(void); // phân tích câu lệnh • void compileBlock(void); // phân tích các khối câu lệnh • void compileBasictype(void); // các kiểu biến cơ bản • void compileProgram();
- Hàm eat So sánh k/h đỉnh stack và k/h đang xét (xem trước) void eat(TokenType tokenType) { if (lookAhead->tokenType == tokenType) { printToken(lookAhead); scan(); } else missingToken(tokenType, lookAhead->lineNo, lookAhead- >colNo); }
- void compileBasicType(void) { Phân tích basic type switch (lookAhead->tokenType) { case KW_INTEGER: eat(KW_INTEGER); break; case KW_CHAR: eat(KW_CHAR); break; default: error(ERR_INVALIDBASICTYPE, lookAhead->lineNo, lookAhead- >colNo); break; } }
- Phân tích void compileFactor(void) { switch (lookAhead->tokenType) { factor case TK_NUMBER: eat(TK_NUMBER); break; case TK_CHAR: eat(TK_CHAR); break; case TK_IDENT: eat(TK_IDENT); switch (lookAhead->tokenType) { case SB_LSEL: case SB_LPAR: compileIndexes(); eat(SB_LPAR); break; compileExpression(); case SB_LPAR: eat(SB_RPAR); compileArguments(); break; break; default: default: break; error(ERR_INVALIDFACTOR, } lookAhead->lineNo, lookAhead->colNo); break; } }
- void compileTerm(void) Phân tích { term compileFactor(); while (lookAhead->tokenType == SB_TIMES || lookAhead- >tokenType == SB_SLASH) ) switch (lookAhead->tokenType) { if (lookAhead->tokenType == SB_TIMES) {eat(SB_TIMES); compileFactor();} else {eat(SB_SLASH); compileFactor();} }
- // check the FOLLOW set void compileTerm(void) case SB_PLUS: case SB_MINUS: { compileFactor(); case KW_TO: case KW_DO: compileTerm2();} case SB_RPAR: case SB_COMMA: void compileTerm2(void) case SB_EQ: {switch (lookAhead->tokenType) case SB_NEQ: {case SB_TIMES: case SB_LE: case SB_LT: eat(SB_TIMES); case SB_GE: compileFactor(); case SB_GT: compileTerm2(); case SB_RSEL: case SB_SEMICOLON: break; case KW_END: case SB_SLASH: case KW_ELSE: eat(SB_SLASH); case KW_THEN: break; compileFactor(); default: compileTerm2(); error(ERR_INVALIDTERM, lookAhead->lineNo, lookAhead- break; >colNo); } }
- void compileExpression(void) { assert("Parsing an expression"); Phân tích switch (lookAhead->tokenType) { case SB_PLUS: expression eat(SB_PLUS); void compileExpression3(void) compileExpression2(); { break; switch (lookAhead->tokenType) case SB_MINUS: { eat(SB_MINUS); case SB_PLUS: compileExpression2(); eat(SB_PLUS); break; default: compileTerm(); compileExpression2(); compileExpression3(); } break; } case SB_MINUS: eat(SB_MINUS); compileTerm(); compileExpression3(); break;
- void compileCondition(void) { compileExpression(); Phân tích switch (lookAhead->tokenType) { case SB_EQ: condition eat(SB_EQ); compileExpression(); break; case SB_NEQ: eat(SB_NEQ); compileExpression(); break; case SB_GE: case SB_LE: eat(SB_GE); eat(SB_LE); compileExpression(); break; compileExpression(); case SB_GT: break; eat(SB_GT); case SB_LT: compileExpression(); eat(SB_LT); break; default: compileExpression(); error(ERR_INVALIDCOMPARATOR, lookAhead->lineNo, break; lookAhead->colNo); } }
- Sơ đồ cú pháp của lệnh KPL
- Phân tích statement void compileStatement(void) { case KW_FOR: switch (lookAhead->tokenType) compileForSt(); { break; case TK_IDENT: // check FOLLOW tokens compileAssignSt(); case SB_SEMICOLON: break; case KW_END: case KW_CALL: case KW_ELSE: compileCallSt(); break; break; // Error occurs case KW_BEGIN: default: compileGroupSt(); error(ERR_INVALIDSTATEMENT, break; lookAhead->lineNo, lookAhead- case KW_IF: >colNo); compileIfSt(); break; break; } case KW_WHILE: } compileWhileSt(); break;
- void compileProgram(void) Phân tích { eat(KW_PROGRAM); program eat(TK_IDENT); eat(SB_SEMICOLON); compileBlock(); eat(SB_PERIOD); }
- Khối
- Phân tích block void compileBlock(void) {if (lookAhead->tokenType == KW_CONST) {eat(KW_CONST); else while (lookAhead->tokenType == TK_IDENT) while ((lookAhead->tokenType == KW_FUNCTION) || (lookAhead->tokenType == KW_PROCEDURE)) { eat(TK_IDENT); {if (lookAhead->tokenType == KW_FUNCTION) eat(SB_EQ); {eat(KW_FUNCTION); compileConstant(); eat(TK_IDENT); compileParams(); eat(SB_SEMICOLON); } eat(SB_COLON); else compileBasicType(); eat(SB_SEMICOLON); if (lookAhead->tokenType == KW_TYPE) compileBlock(); {eat(KW_TYPE); eat(SB_SEMICOLON);} else while (lookAhead->tokenType == TK_IDENT) {eat(KW_PROCEDURE); {eat(TK_IDENT); eat(TK_IDENT); compileParams(); eat(SB_EQ); eat(SB_SEMICOLON); compileType(); compileBlock(); eat(SB_SEMICOLON);}} eat(SB_SEMICOLON);} else else {eat(KW_BEGIN); if (lookAhead->tokenType == KW_VAR) compileStatement(); {eat(KW_VAR); while (lookAhead->tokenType == SB_SEMICOLON) { while (lookAhead->tokenType == TK_IDENT) eat(SB_SEMICOLON); { eat(TK_IDENT); compileStatement(); eat(SB_COLON); } compileType(); eat(KW_END);} eat(SB_SEMICOLON);} }
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Xây dựng chương trình dịch: Bài 1 - Nguyễn Thị Thu Hương
6 p | 131 | 5
-
Bài giảng Xây dựng chương trình dịch: Bài 10 - Phân tích ngữ nghĩa
52 p | 13 | 4
-
Bài giảng Xây dựng chương trình dịch: Bài 7 - Phân tích cú pháp tiền định
16 p | 10 | 4
-
Bài giảng Xây dựng chương trình dịch: Bài 12 - Sinh mã đích
33 p | 11 | 4
-
Bài giảng Xây dựng chương trình dịch: Bài 5 - Nguyễn Thị Thu Hương
4 p | 52 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 2 - Nguyễn Thị Thu Hương
6 p | 66 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 3 - Nguyễn Thị Thu Hương
3 p | 62 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 2 - Các giai đoạn chính của chương trình dịch
23 p | 7 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 12 - Nguyễn Thị Thu Hương
11 p | 55 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 8 - Nguyễn Thị Thu Hương
4 p | 63 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 7 - Nguyễn Thị Thu Hương
3 p | 61 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 10 - Nguyễn Thị Thu Hương
9 p | 59 | 3
-
Bài giảng Xây dựng chương trình dịch: Bài 4 - Nguyễn Thị Thu Hương
5 p | 59 | 2
-
Bài giảng Xây dựng chương trình dịch: Bài 11 - Nguyễn Thị Thu Hương
10 p | 46 | 2
-
Bài giảng Xây dựng chương trình dịch: Bài 9 - Nguyễn Thị Thu Hương
5 p | 56 | 2
-
Bài giảng Xây dựng chương trình dịch: Bài 6 - Phân tích cú pháp trên xuống có quay lui
31 p | 6 | 2
-
Bài giảng Xây dựng chương trình dịch: Bài 6 - Nguyễn Thị Thu Hương
8 p | 64 | 2
-
Bài giảng Xây dựng chương trình dịch: Bài 11 - Sinh mã trung gian
38 p | 12 | 2
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