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

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

64 739 15

Đ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 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 PD;E DD;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)= t1t2 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á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 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á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 11/18/2012 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 đƣợ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

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

TỪ KHÓA LIÊN QUAN