ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Cấu trúc liệu giải thuật - CO2003 Bài tập lớn MÔ PHỎNG SYMBOL TABLE BẰNG DANH SÁCH Tác giả: ThS Trần Ngọc Bảo Duy TP HỒ CHÍ MINH, THÁNG 08/2021 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH ĐẶC TẢ BÀI TẬP LỚN Phiên 1.1 Chuẩn đầu Sau hoàn thành tập lớn này, sinh viên ơn lại sử dụng thành thục: • Thiết kế sử dụng đệ quy • Lập trình hướng đối tượng • Các cấu trúc liệu danh sách Dẫn nhập Symbol table (tạm gọi bảng ghi đối tượng) cấu trúc liệu quan trọng tạo ra, trì sử dụng trình biên dịch (compiler) nhằm lưu vết ngữ nghĩa danh hiệu (identifiers) lưu thông tin tên (name), thông tin kiểu (type), thông tin tầm vực (scope), v.v Trong giai đoạn mà trình biên dịch thực để chuyển từ mã nguồn (source code) sang mã máy thực thi (executable code), giai đoạn phân tích ngữ nghĩa (semantic analysis) giai đoạn quan trọng để kiểm tra tính xác đoạn mã nguồn, ví dụ kiểm tra biến sử dụng khai báo chưa, việc gán giá trị vào biến có phù hợp kiểu hay khơng, v.v Giai đoạn phân tích ngữ nghĩa địi hỏi phải có bảng ghi tối tượng để truy vết thông tin mà việc kiểm tra đòi hỏi Trong tập lớn, sinh viên yêu cầu thực mô bảng ghi đối tượng sử dụng cấu trúc liệu danh sách 3.1 Mô tả Đầu vào Mỗi testcase tập tin đầu vào bao gồm dòng lệnh tương tác với bảng ghi đối tượng Các dịng lệnh mơ tả mơ tả mục 3.5 Sinh viên thấy ví dụ testcase thông qua mục Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 1/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH 3.2 u cầu Để hồn thành tập lớn này, sinh viên phải: Đọc toàn tập tin mô tả Tải xuống tập tin initial.zip giải nén Sau giải nén, sinh viên nhận tập tin: main.h, main.cpp, SymbolTable.h, SymbolTable.cpp, error.h, đó, sinh viên khơng phép sửa đổi tập tin khơng nằm danh mục dùng để nộp Sửa đổi file SymbolTable.h, SymbolTable.cpp để hoàn thành tập lớn đảm bảo hai u cầu sau: • Ít có lớp SymbolTable có phương thức đối tượng (instance method) public void run(string testcase) phương thức đầu vào cho lời giải Đối với testcase, đối tượng lớp tạo phương thức run đối tượng gọi với tham số tên file tập tin văn (chứa đoạn tương tác với bảng ghi đối tượng) • Chỉ có lệnh include file SymbolTable.h #include "main.h" include file SymbolTable.cpp #include "SymbolTable.h" Ngồi ra, khơng cho phép có #include khác tập tin Sinh viên yêu cầu thiết kế sử dụng cấu trúc liệu dựa loại danh sách học Sinh viên phải giải phóng tồn vùng nhớ xin cấp phát động chương trình kết thúc 3.3 Thông tin đối tượng bảng ghi Thông tin đối tượng (symbol) bao gồm: Tên danh hiệu (identifier) Kiểu tương ứng danh hiệu (type) 3.4 Các lỗi ngữ nghĩa Trong trình tương tác, kiểm tra số lỗi ngữ nghĩa ném (thông qua lệnh throw ngơn ngữ lập trình C/C++) tìm thấy: Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 2/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Lỗi khơng khai báo Undeclared Lỗi khai báo lại Redeclared Lỗi không kiểu TypeMismatch Lỗi khơng đóng lại khối UnclosedBlock kèm với mức khối khơng đóng (được mơ tả mục 3.5.3) Lỗi khơng tìm thấy khối tương ứng UnknownBlock Các lỗi kèm lệnh tương ứng chuỗi kí tự tập tin đầu vào trừ lỗi UnclosedBlock UnknownBlock Chương trình dừng lại khơng tiếp tục tương tác có lỗi xảy 3.5 Các lệnh tương tác Một lệnh viết dịng ln bắt đầu mã Ngồi ra, lệnh khơng có có hai tham số Tham số lệnh, có, cách mã khoảng trắng (space) Tham số thứ hai mã, có, cách với tham số khoảng trắng Ngồi ra, khơng có ký tự phân cách theo sau khác Ngược với quy định quy định định dạng lệnh mô tả nội dung đây, lệnh sai, mô ném lỗi InvalidInstruction kèm với dòng lệnh sai kết thúc 3.5.1 Thêm đối tượng vào bảng ghi hoạt động - INSERT • Định dạng chung: INSERT đó: – tên danh hiệu, chuỗi ký tự bắt đầu ký tự chữ thường ký tự bao gồm ký tự chữ thường, in hoa, ký tự gạch _ ký tự số – kiểu tương ứng danh hiệu Có hai loại kiểu number string để khai báo kiểu số kiểu chuỗi ký tự • Ý nghĩa: Đưa danh hiệu vào bảng ghi đối tượng So sánh với C/C++, tương tự việc khai báo biến • Giá trị in hình: success thêm thành cơng vào bảng, ngược lại ném lỗi tương ứng • Các lỗi xảy ra: Redeclared Bài tập lớn mơn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 3/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Ví dụ 1: Với tập tin đầu vào gồm dịng: INSERT a1 number INSERT b2 string Do khơng có lỗi trùng tên (khai báo lại) nên chương trình in ra: success success Ví dụ 2: Với tập tin đầu vào gồm dòng: INSERT x number INSERT y string INSERT x string Do thêm danh hiệu x dòng số mà tiếp tục thêm danh hiệu x dòng số nên gây lỗi Redeclared nên chương trình in ra: success success Redeclared: INSERT x string 3.5.2 Gán giá trị cho đối tượng - ASSIGN • Định dạng chung: ASSIGN đó: – tên danh hiệu phải tuân theo luật nêu mục 3.5.1 – giá trị gán vào biến, bao gồm ba dạng: ∗ Hằng số: dãy số Ví dụ: 123, 456, 789 số đúng, cịn 123a, 123.5, 123.8.7 khơng số Hằng số xem có kiểu số (number) ∗ Hằng chuỗi: bắt đầu dấu nháy đơn (’), chuỗi bao gồm ký tự số, ký tự chữ, khoảng trắng kết thúc dấu nháy đơn Ví dụ: ’abc’, ’a 12 C’ chuỗi, cịn ’abc_1’, ’abC@u’ khơng chuỗi Hằng chuỗi xem có kiểu chuỗi (string) ∗ Một danh hiệu khác khai báo trước • Ý nghĩa: Kiểm tra phù hợp cho việc gán giá trị đơn giản cho danh hiệu • Giá trị in hình: success thành cơng, ngược lại ném lỗi tương ứng • Các lỗi xảy ra: Bài tập lớn mơn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 4/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH – Undeclared danh hiệu chưa khai báo xuất trong hai phần – TypeMismatch kiểu giá trị gán danh hiệu khác Ví dụ 3: Với tập tin đầu vào gồm dòng: INSERT x number INSERT y string ASSIGN x 15 ASSIGN y 17 ASSIGN x ’abc’ Việc gán dịng thứ khơng gây lỗi, dòng thứ 4, lỗi kiểu xảy gán số vào danh hiệu kiểu chuỗi Chương trình chạy đến dịng kết thúc success success success TypeMismatch: ASSIGN y 17 3.5.3 Mở đóng khối (block) - BEGIN/ END • Định dạng chung: BEGIN/ END • Ý nghĩa: Mở đóng khối tương tự với việc mở đóng { } C/C++ Khi mở khối mới, có số quy tắc sau: – Được phép khai báo lại tên danh hiệu khai báo trước – Khi tìm kiếm danh hiệu, ta phải tìm với khối Nếu khơng tìm tìm khối cha làm gặp khối toàn cục – Các khối có mức (level) xác đinh với khối tồn cục xác định mức tăng dần với khối • Giá trị in ra: Chương trình khơng in với việc đóng mở block • Các lỗi xảy ra: UnclosedBlock ném ta khơng đóng lại khối mở UnknownBlock đóng lại khơng tìm dược khối bắt đầu Ví dụ 4: Với tập tin đầu vào gồm dòng: INSERT x number INSERT y string Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 5/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH BEGIN INSERT x number BEGIN INSERT y string END END Chương trình in ra: success success success success Vì bắt đầu block có mức dịng sau phép khai báo lại biến x dịng Block có mức bắt đầu dịng nên sau biến y phép báo lại mà khơng có lỗi Tuy nhiên, ta xóa lệnh END dịng cuối cùng, chương trình in ra: success success success success UnclosedBlock: ta chưa có lệnh để đóng lại block có mức 3.5.4 Tìm đối tượng tương ứng với danh hiệu - LOOKUP • Định dạng chung: LOOKUP đó, tên danh hiệu phải tuân theo luật nêu mục 3.5.1 • Ý nghĩa: Tìm kiếm danh hiệu có nằm bảng hoạt động hay khơng So sánh với C/C++, tương tự tìm sử dụng biến • Giá trị in hình: mức block chứa danh hiệu tìm thấy, ngược lại ném lỗi tương ứng • Các lỗi xảy ra: Undeclared khơng tìm thấy danh hiệu tất tầm vực bảng ghi đối tượng Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 6/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Ví dụ 5: Với tập tin đầu vào gồm dòng: INSERT x number INSERT y string BEGIN INSERT x number LOOKUP x LOOKUP y END Chương trình in ra: success success success Vì x tìm thấy block trước, cịn y khơng tìm thấy block nên tìm thấy block cha 3.5.5 In thuận danh hiệu hoạt động tầm vực - PRINT • Định dạng chung: PRINT • Ý nghĩa: In hết tất danh hiệu tìm thấy tầm vực theo thứ tự khai báo từ dòng đến dịng • Giá trị in ra: danh hiệu kèm theo mức khối tương ứng in cách khoảng trắng dịng khơng có khoảng trắng cuối dịng Ví dụ 6: Với tập tin đầu vào gồm dòng: INSERT x number INSERT y string BEGIN INSERT x number INSERT z number PRINT END Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 7/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Chương trình in ra: success success success success y//0 x//1 z//1 Dịng PRINT nằm khối có mức biến x khai báo lại nên có x tầm vực thấy, x tầm vực cha (khối có mức 0) khơng thấy 3.5.6 In ngược danh hiệu hoạt động tầm vực - RPRINT • Định dạng chung: RPRINT • Ý nghĩa: In hết tất danh hiệu tìm thấy tầm vực theo thứ tự từ tầm vực đến tầm vực cha • Giá trị in ra: danh hiệu kèm theo mức khối tương ứng in cách khoảng trắng dịng khơng có khoảng trắng cuối dịng Ví dụ 7: Với tập tin đầu vào gồm dòng: INSERT x number INSERT y string BEGIN INSERT x number INSERT z number RPRINT END Chương trình in ra: success success success success z//1 x//1 y//0 Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 8/9 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Dịng RPRINT nằm khối có mức biến x khai báo lại nên có x tầm vực thấy, x tầm vực cha (khối có mức 0) khơng thấy, tất in ngược lại Nộp Sinh viên nộp tập tin: SymbolTable.h SymbolTable.cpp, trước thời hạn đưa đường dẫn "Assignment - Submission" Có số testcase đơn giản sử dụng để kiểm tra làm sinh viên nhằm đảm bảo kết sinh viên biên dịch chạy Sinh viên nộp lần tùy ý có nộp cuối tính điểm Vì hệ thống khơng thể chịu tải nhiều sinh viên nộp lúc, sinh viên nên nộp sớm tốt Sinh viên tự chịu rủi ro nộp sát hạn chót Khi thời hạn nộp bài, hệ thống đóng nên sinh viên nộp Bài nộp qua phương thức khác không chấp nhận Một số quy định khác • Sinh viên phải tự hồn thành tập lớn này phải ngăn không cho người khác đánh cắp kết Nếu không, sinh viên bị xử lý theo quy định trường gian lận • Mọi định giảng viên phụ trách tập lớn định cuối • Sinh viên khơng cung cấp testcase sau chấm mà cung cấp thông tin chiến lược thiết kế testcase phân bố số lượng sinh viên theo testcase Thay đổi so với phiên trước • Cập nhật lại luật để nhận dạng số ———————HẾT——————— Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2021 - 2022 Trang 9/9 ... tin: main.h, main.cpp, SymbolTable.h, SymbolTable.cpp, error.h, đó, sinh viên khơng phép sửa đổi tập tin không nằm danh mục dùng để nộp Sửa đổi file SymbolTable.h, SymbolTable.cpp để hoàn thành... tương tác với bảng ghi đối tượng) • Chỉ có lệnh include file SymbolTable.h #include "main.h" include file SymbolTable.cpp #include "SymbolTable.h" Ngồi ra, khơng cho phép có #include khác tập tin... tên danh hiệu phải tuân theo luật nêu mục 3.5 .1 – giá trị gán vào biến, bao gồm ba dạng: ∗ Hằng số: dãy số Ví dụ: 12 3, 456, 789 số đúng, 12 3a, 12 3.5, 12 3.8.7 không số Hằng