Bài giảng thực hành chương trình dịch bài 3 phạm đăng hải

32 2 0
Bài giảng thực hành chương trình dịch bài 3   phạm đăng hải

Đ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

Thực hành CHƯƠNG TRÌNH DỊCH Bài 3: Phân tích cú pháp Phạm Đăng Hải haipd@soict.hust.edu.vn Nhiệm vụ ptcp Xử lý lỗi Token Phân tích cú pháp Phân tích ngữ nghĩa Bảng ký hiệu • Kiểm tra cấu trúc ngữ pháp chương trình • Kích hoạt phân tích ngữ nghĩa sinh mã 09/20/23 Sơ đồ cú pháp KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 Sơ đồ cú pháp cho ngôn ngữ KPL 09/20/23 10 Văn phạm BNF 64 Arguments ::= SB_LPAR Expression Arguments2 SB_RLAR 65 Arguments ::= 66 Arguments2::= SB_COMMA Expression Arguments2 67 Arguments2::= 68 Condition ::= Expression Condition2 69 70 71 72 73 74 09/20/23 Condition2::= SB_EQ Expression Condition2::= SB_NEQ Expression Condition2::= SB_LE Expression Condition2::= SB_LT Expression Condition2::= SB_GE Expression Condition2::= SB_GT Expression 18 Văn phạm BNF 75 Expression ::= SB_PLUS Expression2 76 Expression ::= SB_MINUS Expression2 77 Expression ::= Expression2 78 Expression2 ::= Term Expression3 79 Expression3 ::= SB_PLUS Term Expression3 80 Expression3 ::= SB_MINUS Term Expression3 81 Expression3 ::= 09/20/23 19 Văn phạm BNF 82 Term ::= Factor Term2 83 Term2 ::= SB_TIMES Factor Term2 84 Term2 ::= SB_SLASH Factor Term2 85 Term2 ::= 86 87 88 89 Factor ::= UnsignedConstant Factor ::= Variable Factor ::= FunctionApptication Factor ::= SB_LPAR Expression SB_RPAR 90 Variable ::= VariableIdent Indexes 91 FunctionApplication ::= FunctionIdent Arguments 92 Indexes ::= SB_LSEL Expression SB_RSEL Indexes 93 Indexes ::= 09/20/23 20 Văn phạm KPL • Tính FIRST FOLLOW cho ký hiệu khơng kết thúc? • Về KPL ngơn ngữ LL(1) – Có thể phân tích phương pháp đệ quy xuống • Thiết kế phân tích đệ quy – Token lookAhead //Token xem trước – Duyệt ký hiêu kết thúc – Duyệt ký hiệu không kết thúc 09/20/23 21 Xây dựng Parser STT Tên tệp Makefile scanner.c reader.h, reader.c charcode.h, charcode.c Nội dung Project Tệp Đọc mã nguồn Phân loại ký tự token.h, token.c Phân loại nhận dạng token, từ khóa error.h, error.c parser.c parser.h Thông báo lỗi Duyệt cấu trúc chương trình nguồn 809/20/23 main.c Chương trình 22 Xem trước token Token *currentToken; // Token vừa đọc Token *lookAhead; // Token xem trước void scan(void) { Token* tmp = currentToken; currentToken = lookAhead; lookAhead = getValidToken();//Thêm vào pttv Token* getValidToken(void) { free(tmp); Token *token = getToken(); } while (token->tokenType == TK_NONE) { free(token); token = getToken(); } return token; 09/20/23 } 23 Duyệt ký hiệu kết thúc a If Ch = a Then nextCh Else Error (Đang đợi ký hiệu a) void eat(TokenType tokenType) { if (lookAhead->tokenType == tokenType) { printToken(lookAhead); scan(); } else missingToken(tokenType, lookAhead->lineNo, lookAhead->colNo); } 09/20/23 24 Duyệt ký hiệu không kết thúc sơ đồ compileA(); A A X1 X2 XN void compileA(){ assert(“parsing a A ”); T(X1); //Thông báo trình T(X2); … void assert(char *msg) { T(XN); assert(“A parsed ”); 09/20/23 } printf("%s\n", msg); } 25 Duyệt sơ đồ Ví dụ sơ đồ Program void compileProgram(void) { assert("Parsing a Program "); eat(KW_PROGRAM); eat(TK_IDENT); eat(SB_SEMICOLON); compileBlock(); eat(SB_PERIOD); assert("Program parsed!"); } 09/20/23 26 Kích hoạt ptcp int compile(char * fileName) { if (openInputStream(fileName) == IO_ERROR) return IO_ERROR; currentToken = NULL; lookAhead = getValidToken(); compileProgram(); free(currentToken); free(lookAhead); closeInputStream(); return IO_SUCCESS; } 09/20/23 27 Ví dụ Statement FIRST(Statement) = {TK_IDENT, KW_CALL, KW_BEGIN, KW_IF, KW_WHILE, KW_FOR, } FOLLOW(Statement) = {SB_SEMICOLON, KW_END, KW_ELSE} /* Predict parse table for Expression */ Input Production Action TK_IDENT Statement ::= AssignSt compileAssignSt(); KW_CALL Statement ::= CallSt compileCallSt(); KW_BEGIN Statement ::= GroupSt compileGroupSt(); KW_IF Statement ::= IfSt compileIfSt(); KW_WHILE Statement ::= WhileSt compileWhileSt(); KW_FOR Statement ::= ForSt compileForSt(); -SB_SEMICOLON nothing (break;) KW_END nothing (break;) KW_ELSE nothing (break;) Others Error 09/20/23 28 Ví dụ Statement void compileStatement(void) { switch (lookAhead-> tokenType){ case TK_IDENT: case KW_FOR: compileAssignSt(); compileForSt(); break; break; case KW_CALL: // check FOLLOW tokens compileCallSt(); case SB_SEMICOLON: break; case KW_END: case KW_BEGIN: case KW_ELSE: compileGroupSt(); break; break; // Error occurs case KW_IF: default: compileIfSt(); error(ERR_INVALIDSTATEMENT, break; lookAhead->lineNo, lookAheadcase KW_WHILE: >colNo); compileWhileSt(); break; break; } } 09/20/23 29 Tuần • Dịch chương trình với – Khai báo – Khai báo kiểu – Khai báo biến – Thân hàm rỗng 09/20/23 30 Tuần • Dịch chương trình với – Khai báo – Khai báo kiểu – Khai báo biến – Các lệnh 09/20/23 31 Tuần  Dịch chương trình với đầy đủ sơ đồ cú pháp 09/20/23 32

Ngày đăng: 15/11/2023, 13:31

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan