1. Trang chủ
  2. » Công Nghệ Thông Tin

NGÔN NGỮ và PHƯƠNG PHÁP DỊCH - Chương 4: Phân tích ngữ nghĩa docx

64 822 10

Đ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 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... → → | → | → →| →

Ngày đăng: 10/03/2014, 00:20

TỪ KHÓA LIÊN QUAN

w