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
652,5 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 03/10/14 Giới thiệu Ví dụ Cho văn phạm G = (VT, VN, P, S) P: { → → | → | → →| → → « Bị »| « Cỏ »| →« Vàng »| « Non » → « gặm» } 03/10/14 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 » … 03/10/14 Các câu ngữ pháp, 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ố) 03/10/14 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) 03/10/14 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 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 03/10/14 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 03/10/14 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 03/10/14 Bảng ký hiệu Mục đích Phân tích từ vựng Bảng ký hiệu Phân tích cú pháp Phân tích ngữ nghĩa • Bảng liệu mà pha CTD s/dụng • Dùng chứa thông tin danh biểu (tên) xuất chương trình nguồn • Mỗi phần tử ứng với tên, gồm trường – Trường tên • Khóa bảng Sinh mã 03/10/14 – Trường thuộc tính • Thuộc tính tên –Biến (kiểu), (giá trị) 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 03/10/14 50 Kiểm tra kiểu Bộ kiểm tra kiểu định danh Sản xuất P→D;E D→D;D D → Id : T T → char T → integer T → ↑T1 Quy tắc ngữ nghĩa addType(Id.entry, T.type) T.type = char T.type = integer 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 khai báo lưu bảng ký hiệu trước biểu thức E kiểm tra kiểu 03/10/14 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 03/10/14 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 03/10/14 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 → D1 ; D2 D.type = D1.type x D2.type Fun → fun id(D):T; B addType(id.entry,D.type → T.type) B→{S} S.type = S → Id(EList) if lookup(Id.entry)= t1→t2 AND EList.type=t1 then t2 else type_error EList → E EList → Elist1 , E 03/10/14 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; 03/10/14 55 Kiểm tra kiểu Chuyển kiểu float x; int n; x + n → Quy đổi kiểu 03/10/14 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 03/10/14 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 03/10/14 58 Xử lý sai sót Phương pháp • Vượt bỏ đoạn văn nguồn tìm từ tố cho phép nắm bắt lại 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ấ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 03/10/14 59 Xử lý sai sót Phương pháp→Ví 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 triển khai xong Condition) • Có thể tiếp tục triển khai Statement 03/10/14 60 Xử lý sai sót Phương pháp→Ví 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 03/10/14 61 Xử lý sai sót Phương pháp→Thự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 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 kế thừa từ cấu trúc (thủ tục) bên 03/10/14 62 Xử lý sai sót Phương pháp ghi nhận lỗi • Khi lỗi đốn biết 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 03/10/14 ; 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{ addError() if(Token == Semicolon) ghi nhận getToken(); thơng báo lỗi, else addError(« Thiếu dấu ‘;’ »); khơng dừng chương trình compileStatement(); } if (token == END) getToken(); else addError(« Thiếu từ khóa End »); }03/10/14 64 ... 28 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 03/10/14 29 Chương trình dịch định hướng cú pháp Định nghĩa hướng cú pháp. .. hàm 03/10/14 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... → → | → | → →| →