1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

67 9 0

Đ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 4: Phân tích ngữ nghĩa Phạm Đăng Hải haipd@soict.hut.edu.vn Ví dụ Cho văn phạm G = ( , , P, S) P: { 09/20/23 | | | « Bị »| « Cỏ »| « Vàng »| « Non » « gặm» } Ví dụ L(G) = « Bị vàng gặm cỏ non » « Bị vàng gặm cỏ vàng » « Bị non gặm cỏ non » « Bò vàng gặm bò non » « Cỏ non gặm bò vàng » … 09/20/23 Các câu ngữ pháp, câu ngữ nghĩa (có ý nghĩa) Ví dụ Program Toto; Const N = 0; Begin N :=10; End := := N:= N:= N:= N:= N:= N:=10 Hoàn toàn cú pháp KPL Sử dụng sai ý nghĩa ban đầu (Hằng số) 09/20/23 Nhận xét • Không phải câu văn (NNLT: câu lệnh) ngữ pháp (NNLT: cú pháp) có giá trị sử dụng (NNLT: thực được) • Bộ phân tích ngữ nghĩa nhằm mục đích kiểm tra tính đắn mặt ngữ nghĩa câu văn (NNLT: câu lệnh) 09/20/23 Vị trí phân tích ngữ nghĩa Phân tích từ vựng Phân tích cú pháp Phân tích ngữ nghĩa Sinh mã 09/20/23 • Phân tích cú pháp – Kiểm tra cấu trúc ngữ pháp hợp lệ chương trình • Những u cầu khác ngồi cấu trúc ngữ pháp: – – – – Tên “x” định nghĩa chưa? “x” tên biến hay hàm? “x” định nghĩa đâu? Biểu thức “a+b” có qn kiểu khơng? –… • Phân tích ngữ nghĩa trả lời câu hỏi để làm rõ ngữ nghĩa chương trình Nhiệm vụ phân tích ngữ nghĩa • Quản lý thơng tin định danh (tên) – Hằng, biến, kiểu tự định nghĩa, chương trình • Kiểm tra việc sử dụng định danh – Phải khai báo trước dùng – Phải dụng mục đích • Gán giá trị cho hằng, tính tốn kiểu, thủ tục… – Đảm bảo tính qn • Tên khai báo lần phạm vi • Các phần tử kiểu liệt kê (enum) Bảng ký hiệu 09/20/23 Nhiệm vụ phân tích ngữ nghĩa • Kiểm tra kiểu liệu cho tốn tử – Tốn tử % C địi hỏi tốn hạng kiểu ngun – Có thể u cầu chuyển kiểu bắt buộc (int2real) – Chỉ số mảng phải nguyên • Kiểm tra tương ứng tham số thực hình thức – Số lượng tham số, tương ứng kiểu • Kiểm tra kiểu trả hàm 09/20/23 Các biểu thức kiểu ngôn ngữ Bộ luật để định kiểu cho cấu trúc Bảng ký hiệu • Lưu trữ thơng tin định danh chương trình thuộc tính chúng – – – – Hằng: {tên, kiểu, giá trị} Kiểu người dùng định nghĩa: {tên, kiểu thực tế} Biến: {tên, kiểu} Hàm: {tên, tham số hình thức, kiểu trả về, khai báo địa phương} – Thủ tục: {tên, tham số hình thức, khai báo địa phương) – Tham số hình thức: {tên, kiểu, tham biến/tham trị} 09/20/23 Bảng ký hiệu Khi gặp tên chương trình • Gặp giai đoạn khai báo – Đưa tên thông tin tương ứng vào bảng – Ví dụ: Const Max = 10; • Đưa Max vào bảng, với kiểu constant, giá trị 10; • Gặp câu lệnh – Đọc thơng tin để sử dụng • Phân tích ngữ nghĩa: Sử dụng mục đích khơng? – Ví dụ: Max := 20; Sai mục đích • Sinh mã: Kích thước nhớ cấp phát cho tên – Ví dụ: int 09/20/23 bytes, float byte 10 Các hàm so sánh kiểu Cần xây dựng hàm kiểm tra kiểu enum TypeClass{ TP_INT, • checkIntType(Type * t) TP_CHAR, if( (t != NULL) &&(t->typeClase ==TP_INT) ) TP_ARRAY return; }; else Error(“Not Integer type”) • checkCharType(Type * t) typeClass arraySize elementType • checkArrayType(Type * t) Type Type • checkBasicType(Type * t) – Kiểu tham số, kiểu hàm phải TP_INT/TP_CHAR • checkTypeEquality(Type *t1, Type * t2) 09/20/23 53 Duyệt if (Token == [SB_PLUS, SB_MINUS] ) CONST MAX = 100; Eat(SB_PLUS)/ Eat(SB_MINUS) MIN = -MAX; if(Token == Ident) • Kiểm tra Ident khai báo obj = checkDeclaredConstant(currentToken->string); • Nếu khai báo, phải có kiểu nguyên obj->constAttrs->value->type == TP_INT 09/20/23 54 Kiểu nhân tố Factor Ident [ Expression ] Number ( Expression ) Type * compileFactor() Nếu Token == NUMBER return intType Nếu Token == CHAR return charType Nếu Token == IDENT Ident khai báo? obj = checkDeclaredIdent(….) obj->kind = OBJ_CONST return kiểu obj->kind = OBJ_VAR Biến mảng: compileIndexs() return Kiểu biến obj->kind = OBJ_FUNCTION return Kiểu trả hàm 09/20/23 obj->kind = OBJ_PARAM return Kiểu hàm 55 Kiểu toán hạng Type * compileTerm() Type * t1 = compileFactor() while (Token == [SB_TIMES, SB_SLASH] ) EAT (SB_TIMES) / EAT(SB_SLASH) Type * t2 = compileFactor()// Kiểm tra t1, t2 kiểu nguyên //checkIntType() return t1 09/20/23 56 Duyệt Biểu thức if (Token == [SB_PLUS, SB_MINUS] ) 09/20/23 Type * t = compileExpression2() Kiểu t phải nguyên: checkIntType(t) 57 Kiểu biểu thức Type * compileExpression2() Type * t1 = compileTerm() while (Token == [SB_PLUS, SB_MINUS] ) eat(SB_PLUS)/Eat(SB_MINUS) t2 phải kiểu nguyên Type t2 =compileTerm() t2 phải kiểu nguyên return t1 09/20/23 58 Câu lệnh gán • Bên phải bên trái câu lệnh gán phải có kiểu – Ghi nhận kiểu vế trái phép gán • Type* t1 = compileLValue(void) Biến, tham số, hàm – Eat(SB_ASSIGN)// Đọc ký hiệu gán – Ghi nhận kiểu Expression • Type * t2 = compileExpression(); – So sánh kiểu tương đương 09/20/23 • checkTypeEquality(t1, t2) 59 LValue Object* checkDeclaredLValueIdent(char* name) – – Name khai báo? Object * lookupObject(Name) Kiểu tên phải là: Biến, Tham số, Hàm • – Thuộc tính kind đối tượng Object Nếu hàm, phải pham vi thời • Đối tượng phạm vi tại: symtab->currentScope->owner Type * compileLValue() – – Kiểm tra LValueIdent Nếu Biến • • checkDeclaredLValueIdent() Biến mảng: Kiểu phần tử mảng compileIndexs() Không phải mảng: Kiểu biến: varAttrs->type – Nếu Tham số: Kiểu tham số: paramAttrs->type – Nếu Hàm số: Kiểu hàm số: … 09/20/23 60 Chỉ số mảng Type* compileIndexes(Type* arrayType) while (Token==SB_LSEL) eat(SB_LSEL) Type * t = compileExpression(); checkIntType(t) //kiểu biểu thức nguyên Nếu mảng nhiều chiều, giảm số chiều arrayType = arrayType->elementType; Eat(SB_RSEL) return arrayType;//Kiểu phần tử mảng 09/20/23 61 Câu lệnh For For := To Do , , phải kiểu – – – – Eat(KW_FOR) Eat(Ident) Ident biến? Eat(SB_ASSIGN) Ghi nhận kiểu Ident – Ghi nhận kiểu Expression() (Type * compileExpression()) – So sánh kiểu tương đương (checkTypeEquality()) – Eat(KW_TO) – Ghi nhận kiểu Expression() (Type * compileExpression()) – So sánh kiểu tương đương (checkTypeEquality()) – Eat(KW_DO) 09/20/23 62 Gọi thủ tục, hàm • Gọi thủ tục câu lệnh Call – If (lookAhead->TokenType == KW_CALL) • Eat(KW_CALL); Eat(Ident); • Ident khai báo thủ tục? – Proc=CheckDeclaredProcedure(curentTokent->String) • compileArguments(Proc->procAttrs->paramList) • Gọi hàm sử dụng Factor – If (lookAhead->TokenType == IDENT) • Eat(IDENT) • Ident khai báo ? obj = checkDeclaredIdent() • Nếu Ident hàm ? obj->kind == OBJ_FUNCTION 09/20/23 – compileArguments(obj->funcAttrs->paramList) – type = obj - >funcAttrs-> returnType// Kiểu Factor 63 Duyệt tham số hàm/thủ tục Function foo(Var N:integer, a:integer):integer Obj = lookupObject(« foo ») Obj->funcAttrs->paramList Object « Foo» ObjectNode ObjectNode OBJ_FUN obj X obj Object Object TP_INT « N» « a» N/A PAR PAR paramAttr paramAttr funcAttrs N/A Type paramList returnType scope paraAttrs paraAttrs REF VAL TP_INT Type Type N/A Function Function funcAttr objList owner outer Scope 09/20/23 obj ObjectNode N/A Type 64 Duyệt tham số hàm/thủ tục • Tham số hình thức t/số thực phải trùng kiểu – void compileArguments(ObjectNode* paramList) – void compileArgument(Object* param) • Tham số hình thức: param->paramAttrs->type • Tham số thực sự: Type * compileExpression() • Nếu tham số hình thức tham biến tham số thực tế phải biến (LValue) – Tham biến • param->paramAttrs->kind ==PARAM_REFERENCE – Kiểu tham biến param->paramAttrs->type – Tham số truyền vào phải LValue: • Sử dụng hàm Type * compileLValue() để kiểm tra; 09/20/23 65 Duyệt Điều kiện Op • Exp1 Exp2 có kiểu – Lấy kiểu biểu thức • Type * t1 = compileExpression(); – Kiểu tra t1 kiểu • checkBasicType(t1) – Đọc toán tử quan hệ • Eat(Op) – Lấy kiểu biểu thức • Type * t2 = compileExpression(); – Kiểm tra tương thích kiểu 09/20/23 66 Nhiệm vụ ngày thứ tư • Lập trình cho hàm semantics.c – void checkIntType(Type* type); – void checkCharType(Type* type); – void checkArrayType(Type* type); – void checkBasicType(Type* type); – void checkTypeEquality(Type* t1, Type* t2); • Bổ sung đoạn mã kiểm tra kiểu parser tương ứng với luật kiểm tra • Biên dịch thử nghiệm với ví dụ mẫu 09/20/23 67

Ngày đăng: 10/10/2023, 18:29

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w