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 10 0
Tài liệu đã được kiểm tra trùng lặp

Đ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ông tin cơ bản

Định dạng
Số trang 67
Dung lượng 313,37 KB

Nội dung

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

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

TÀI LIỆU LIÊN QUAN

w