Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 52 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
52
Dung lượng
593,28 KB
Nội dung
Bài 10 Phân tích ngữ nghĩa Nội dung • Những vấn đề ngữ nghĩa • Bảng ký hiệu • Luật phạm vi ảnh hưởng biến • Các sơ đồ dịch để xây dựng bảng ký hiệu • Kiểm tra kiểu (Type checking) • Hệ thống kiểu ngơn ngữ lập trình • Đặc tả kiểm tra kiểu • Chuyển đổi kiểu Phân tích ngữ nghĩa • Tìm lỗi sau giai đoạn phân tích cú pháp • Kiểm tra tương ứng kiểu • Kiểm tra tương ứng việc sử dụng hàm, biến với khai báo chúng • Xác định phạm vi ảnh hưởng biến chương trình • Phân tích ngữ nghĩa thường sử dụng cú pháp Bảng ký hiệu phạm vi • Phạm vi • Quản lý phạm vi tĩnh động • Những vấn đề liên quan đến phạm vi • Bảng ký hiệu • Xây dựng bảng ký hiệu Quản lý phạm vi • Đây vấn đề liên quan đến phù hợp khai báo sử dụng định danh • Phạm vi ảnh hưởng định danh phần chương trình truy cập tới định danh • Một định danh tham chiếu đối tượng khác phạm vi khác chương trình Phạm vi hai định danh giống không giao Phạm vi tĩnh động • Phần lớn ngơn ngữ quản lý phạm vi theo kiểu tĩnh Thông tin phạm vi phụ thuộc văn chương trình Luật phạm vi gần nhát áp dụng • Một số ngôn ngữ cho phép quản lý phạm vi động, quản lý phạm vi thực chương trình (Lisp, Snobol, Perl dùng số từ khóa đặc biệt) • Quản lý phạm vi động nghĩa ký hiệu tham chiếu, chương trình dịch tham chiếu vào stack chứa hoạt động để tìm thơng tin ký hiệu Ví dụ QL phạm vi tĩnh QL phạm vi động Những vấn đề quản lý phạm vi • Khi xét khai báo chứa định danh, liệu tồn định danh phạm vi hành chưa? • Khi sử dụng định danh, liệu khai báo chưa? Nếu khai báo (theo luật phạm vi gần nhất) liệu khai báo có tương thích với sử dụng khơng? Bảng ký hiệu (Symbol table) • Một cấu trúc liệu cho phép theo dõi quan hệ hành định danh (để kiểm tra ngữ nghĩa sinh mã cách hiệu quả) • Phần quan trọng phân tích ngữ nghĩa theo dõi hằng/biến/kiểu/hàm/thủ tục xem có phù hợp với khai báo chúng khơng? • Khi thêm định danh vào bảng ký hiệu, cần ghi lại thơng tin khai báo định danh Ngơn ngữ có cấu trúc khối • Khối ngơn ngữ lập trình tập cấu trúc ngơn ngữ có chứa khai báo • Một ngơn ngữ có cấu trúc khối • Các khối lồng bên khối khác • Phạm vi khai báo khối khối khối chứa • Luật lồng gần • Cho nhiều khai báo tên Khai báo có hiệu lực khai báo nằm khối gần Kiểu factor KPL Sản xuất Xử lý ::= TK_CHAR case TK_CHAR: eat(TK_CHAR); type = charType; break; ::= TK_NUMBER case TK_NUMBER: eat(TK_NUMBER); type = intType; break; ::= SB_LPAR SB_RPAR case SB_LPAR: eat(SB_LPAR); type = compileExpression(); eat(SB_RPAR); break; Kiểu factor KPL Sản xuất ::= TK_IDENT Xử lý case TK_IDENT: eat(TK_IDENT); switch (obj->kind) { case OBJ_CONSTANT: switch (obj->constAttrs->value->type) { case TP_INT: type = intType; break; case TP_CHAR: type = charType; break; default: break; } Kiểu factor KPL Sản xuất ::= TK_IDENT Xử lý case OBJ_VARIABLE: if (obj->varAttrs->type->typeClass == TP_ARRAY) type = compileIndexes(obj->varAttrs>type); else type = obj->varAttrs->type; break; case OBJ_PARAMETER: type = obj->paramAttrs->type; break; case OBJ_FUNCTION: compileArguments(obj->funcAttrs>paramList); type = obj->funcAttrs->returnType; break; Kiểu expression KPL • Kiểu biếu thức lấy kiểu factor • Nếu có dấu phép tốn, kiểu factor đầu bắt buộc nguyên, • Các factor sau dấu phép tốn bắt buộc kiểm tra kiểu có ngun hay khơng • Hàm trả kiểu ngun biểu thức chứa tốn tử Bộ kiểm tra kiểu lệnh Kiểm tra kiểu cho lệnh • Lệnh gán : Kiểu vế trái vế phải phải giống varType = compileLValue(); eat(SB_ASSIGN); expType = compileExpression(); checkTypeEquality(varType, expType); Kiểm tra kiểu cho lệnh if while • Điều kiện cần kiểu, thể vế trái vế phải phép so sánh phải kiểu sở • Các lệnh nhánh THEN ELSE phải kiểu • Lệnh thân vòng WHILE phải kiểu Bộ kiểm tra kiểu hàm • Bộ kiểm tra kiểu hàm dung phân tích khai báo hàm sử dụng hàm • D danh sách tham số hình thức • Elist danh sách tham số thực Nhập thơng tin kiểu TS hình thức vào bảng ký hiệu Sản xuất ::= TK_IDENT SB_COLON ::= KW_VAR TK_IDENT SB_COLON Xử lý param = createParameterObject (currentToken->string, PARAM_VALUE, symtab>currentScope->owner); eat(SB_COLON); type = compileBasicType(); param->paramAttrs->type = type; … Xử lý cho tham biến tương tự Nhập thông tin kiểu trá hàm vào bảng ký hiệu Sản xuất ::= KW_FUNCTION TK_IDENT SB_COLON SB_SEMICOLON SB_SEMICOLON Xử lý compileParams(); … returnType = compileBasicType(); funcObj->funcAttrs>returnType = returnType; Tương ứng kiểu giửa TS hình thức TS thực Sản xuất ::= Xử lý if (param->paramAttrs->kind == PARAM_VALUE) { type = compileExpression(); checkTypeEquality(type, param->paramAttrs->type);} else {type = compileLValue(); checkTypeEquality(type, param->paramAttrs->type); } Sử dụng hàm: Tương ứng số lượng TS hình thức TS thực sự) Sản xuất Xử lý ::= SB_LPAR SB_RPAR ::= if (node == NULL) error(…); compileArgument(node->object); node = node->next; while (lookAhead->tokenType == SB_COMMA) { eat(SB_COMMA); if (node == NULL) error(…); compileArgument(node->object); node = node->next; } if (node != NULL) error(…); ::= SB_COMMA ::= (CT mẫu dùng chu trình thay gọi đệ quy) Hàm kiểm tra biểu thức kiểu tương đương function sequiv(s, t): boolean; begin if s t kiểu liệu chuẩn then return true; else if s = array(s1, s2) and t = array(t1, t2) then return sequiv(s1, t1) and sequiv(s2, t2) else if s = s1 x s2 and t = t1 x t2) then return sequiv(s1, t1) and sequiv(s2, t2) else if s = pointer(s1) and t = pointer(t1) then return sequiv(s1, t1) else if s = s1 s2 and t = t1 t2 then return sequiv(s1, t1) and sequiv(s2, t2) else return false; end; Chuyển đổi kiểu • Kiểu x+i với x kiểu real i kiểu int Khi dịch sang lệnh máy, phép cộng với kiểu real kiểu int có mã lệnh khác • Tùy ngôn ngữ luật chuyển đổi quy đổi toán hạng hai kiểu Chuyển đổi kiểu biểu thức