Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
562,97 KB
Nội dung
IT4073:NGÔN NGỮ PHƢƠNG PHÁP DỊCH Phạm Đăng Hải haipd@soict.hut.edu.vn Chƣơng 4: Phân tích ngữ nghĩa Giới thiệu Bảng ký hiệu Chƣơng trình dịch định hƣớng cú pháp Kiểm tra kiểu Xử lý sai sót 11/18/2012 Giới thiệu Ví dụ Cho văn phạm G = (VT, VN, P, S) P: { | | | « Bị »| « Cỏ »| « Vàng »| « Non » « gặm» } 11/18/2012 Giới thiệu 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 » … 11/18/2012 Các câu ngữ pháp, nhƣng khơng phải câu ngữ nghĩa (có ý nghĩa) Giới thiệu 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ố) 11/18/2012 Giới thiệu 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) 11/18/2012 Giới thiệu Nhiệm vụ phân tích ngữ nghĩa NNLT • 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 đƣợc khai báo trƣớc dùng – Phải đƣợc 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 đƣợc khai báo lần phạm vi • Các phần tử kiểu liệt kê (enum) Bảng ký hiệu 11/18/2012 Giới thiệu Nhiệm vụ phân tích ngữ nghĩa NNLT • Kiểm tra kiểu liệu cho toán tử – Toán tử % C địi hỏi tốn hạng kiểu ngun – Có thể yê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 11/18/2012 Các biểu thức kiểu ngôn ngữ Bộ luật để định kiểu cho cấu trúc Chƣơng 4: Phân tích ngữ nghĩa Giới thiệu Bảng ký hiệu Chƣơng trình dịch định hƣớng cú pháp Kiểm tra kiểu Xử lý sai sót 11/18/2012 Bảng ký hiệu Mục đích Phân tích từ vựng Bảng ký hiệu • Bảng liệu mà pha CTD s/dụng • Dùng chứa thông tin danh biểu (tên) xuất Phân tích chƣơng trình cú pháp nguồn • Mỗi phần tử ứng với Phân tích tên, gồm trƣờng ngữ nghĩa – Trƣờng tên • Khóa bảng Sinh mã – Trƣờng thuộc tính • Thuộc tính tên –Biến (kiểu), (giá trị) 11/18/2012 10 Kiểm tra kiểu Bộ kiểm tra kiểu đơn giản Xét văn phạm P → D;E D → D;D | id : T T → char | int | array[num] of T | ↑T E → literal | num | id | E mod E | E[E] | E↑ Văn pham sinh chƣơng trình bắt đầu khai báo D sau biểu thức E –Giả thiết số mảng 11/18/2012 50 Kiểm tra kiểu Bộ kiểm tra kiểu định danh Sản xuất Quy tắc ngữ nghĩa PD;E DD;D D Id : T addType(Id.entry, T.type) T char T.type = char T integer T.type = integer T T1 T.type = pointer(T1.type) T array[num] of T1 T.Type = array(1 num.val,T1.type) Do P D ; E nên kiểu định danh đƣợc khai báo đƣợc lƣu bảng ký hiệu trƣớc biểu thức E đƣợc kiểm tra kiểu 11/18/2012 51 Kiểm tra kiểu Bộ kiểm tra kiểu biểu thức Hàm lookup(idx) trả kiểu bảng ký hiệu vị trí idx 11/18/2012 52 Kiểm tra kiểu Bộ kiểm tra kiểu câu lệnh • Với câu lệnh khơng có giá trị (lệnh gán, lệnh gộp, ) có kiểu sở void • Lỗi câu lệnh kiểu lệnh là: type_error • Một chƣơng trình hồn chỉnh có thêm luật P D; S 11/18/2012 53 Kiểm tra kiểu Bộ kiểm tra kiểu hàm Sản xuất D Id : T Quy tắc ngữ nghĩa addType(Id.entry, T.type) D.type = T.type D.type = D1.type x D2.type D D1 ; D2 Fun fun id(D):T; B addType(id.entry,D.type T.type) B{S} S.type = S Id(EList) if lookup(Id.entry)= t1t2 AND EList.type=t1 then t2 else type_error EList E EList Elist1 , E 11/18/2012 EList.type = E.type EList.type = EList1.type x E.type 54 Kiểm tra kiểu Kiểm tra biểu thức kiểu tƣơng đƣơng //s t biểu thức kiểu function sequiv(s, t): boolean; begin if s t có 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; 11/18/2012 55 Kiểm tra kiểu Chuyển kiểu float x; int n; x + n Quy đổi kiểu 11/18/2012 56 Chƣơng 4: Phân tích ngữ nghĩa Giới thiệu Bảng ký hiệu Kiểm tra kiểu Chƣơng trình dịch định hƣớng cú pháp Xử lý sai sót 11/18/2012 57 Xử lý sai sót Giới thiệu Phân tích cú pháp gặp lỗi • Gọi tới thủ tục Error(…) để báo lỗi – Thông báo kiểu lỗi vị trí lỗi • Sau báo lỗi ngừng trình dịch lại – Bởi văn nguồn khơng khớp với dự đốn Chƣơng trình dịch khơng biết theo hƣớng • VD: gặp statement (X):=10; khơng biết nhánh – Chƣơng trình dịch có n lỗi cần n+1 lần dịch • Tốn • Cần điều chỉnh để CTD hồi phục sau gặp lỗi 11/18/2012 58 Xử lý sai sót Phƣơng pháp • Vƣợt bỏ đoạn văn nguồn tìm đƣợc từ tố cho phép nắm bắt lại đƣợc cấu trúc chƣơng trình tiếp tục làm việc theo dự kiến • Các từ tố cho phép nắm bắt đƣợc cấu trúc ký hiệu ngừng Có thể – Các từ tố theo sau cấu trúc phân tích • Khi gặp, cho biết cấu trúc bị bỏ qua • Là FOLLOW() cấu trúc – Các từ tố cấu trúc tại, bị bỏ xót • Đƣợc goi Các ký hiệu chốt • Thƣờng từ khóa cấu trúc 11/18/2012 59 Xử lý sai sót Phƣơng phápVí dụ if max > a + * 10 then Lỗi biểu thức (Term) (thiếu toán hạng dấu ‘(‘ ) • Sau Condition (Expression) Then, Do, • Khi gặp KW_THEN bỏ qua hết Condition • Ghi nhận lỗi (coi nhƣ triển khai xong Condition) • Có thể tiếp tục triển khai Statement 11/18/2012 60 Xử lý sai sót Phƣơng phápVí dụ if max > a + 10 Min then Condition Lỗi Statement, nhánh if : (thiếu từ khóa Then ) • Sau Statement End ; • Khơng thiết phải bỏ statement gặp End ; • Khi đến Then bắt đầu phân tích tiếp 11/18/2012 61 Xử lý sai sót Phƣơng phápThực • Để thực hiện, cần cho biết thủ tục phân tích cú pháp (dùng để triển khai đích, ví dụ compileBlock(), compileStatement(), ) hồi phục ký hiệu ngừng – Các ký hiệu chốt thuộc cấu trúc mà thủ tục phân tích – Các ký hiệu theo sau cấu trúc (phụ thuộc chỗ gọi) Ví dụ: Đang phân tích Condition, Condition đƣợc gọi nhánh IF, ký hiệu theo sau THEN, nhánh WHILE, ký hiệu theo sau DO – Các ký hiệu ngừng đƣợc kế thừa từ cấu trúc (thủ tục) bên 11/18/2012 62 Xử lý sai sót Phƣơng pháp ghi nhận lỗi • Khi lỗi đốn biết đƣợc khơng cần vƣợt q đoạn chƣơng trình nguồn – Ví dụ, lỗi thiếu dấu ; End statement • Có thể sửa lại sơ đồ viết lại theo sơ đồ End Statement Statement 11/18/2012 ; Begin 63 Xử lý sai sót Phƣơng pháp ghi nhận lỗi if (token == BEGIN){ getToken(); compileStatement(); while (token [Semicolon]FIRST(Statement) do{ if(Token == Semicolon) addError() getToken(); ghi nhận else addError(« Thiếu dấu ‘;’ »); thơng báo lỗi, khơng dừng compileStatement(); chƣơng trình } if (token == END) getToken(); else addError(« Thiếu từ khóa End »); } 11/18/2012 64 ... Chƣơng 4: Phân tích ngữ nghĩa Giới thiệu Bảng ký hiệu Chƣơng trình dịch định hƣớng cú pháp Kiểm tra kiểu Xử lý sai sót 11/18/2012 29 Chương trình dịch định hướng cú pháp Định nghĩa hƣớng cú pháp. .. Được phân tích từ vựng đưa ) 11/18/2012 32 Chương trình dịch định hướng cú pháp Cây phân tích cú pháp có giải Cây có giá trị thuộc tính nút 11/18/2012 33 Chương trình dịch định hướng cú pháp. .. định nghĩa dựa vào giá trị nút cha và/ hoặc nút anh em 11/18/2012 30 Chương trình dịch định hướng cú pháp Dạng định nghĩa hƣớng cú pháp • Mỗi sản xuất dạng A liên hệ với tập luật ngữ nghĩa