Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 142 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
142
Dung lượng
0,96 MB
Nội dung
BỘ LAO ĐỘNG - THƯƠNG BINH VÀ XÃ HỘI TỔNG CỤC DẠY NGHỀ GIÁO TRÌNH Mô đun : Chuyên đề (Kỹ thuật lập trình) NGHỀ: QUẢN TRỊ MẠNG TRÌNH ĐỘ: CAO ĐẲNG ( Ban hành kèm theo Quyết định số:120/QĐ-TCDN ngày 25 tháng 02 năm 2013 Tổng cục trưởng Tổng cục dạy nghề) Hà Nội, năm 2013 TUYÊN BỐ BẢN QUYỀN: Tài liệu thuộc loại sách giáo trình nên nguồn thông tin phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác mang tính lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm LỜI GIỚI THIỆU Kiến thức môn học Kỹ thuật lập trình tản người muốn tìm hiểu sâu Công nghệ thông tin đặt biệt việc lập trình để giải toán máy tính điện tử Nắm vững kỹ thuật lập trình sở để sinh viên tiếp cận với việc thiết kế xây dựng phần mềm sử dụng công cụ lập trình đại Mặc dầu có nhiều cố gắng, không tránh khỏi khiếm khuyết, mong nhận đóng góp ý kiến độc giả để giáo trình hoàn thiện Hà Nội, ngày 20 tháng năm 2013 Chủ biên Hồ Viết Hà MỤC LỤC TRANG LỜI GIỚI THIỆU - Ý nghĩa vai trò: Đây môn học sở ngành ngành liên quan đến công nghệ thông tin, cung cấp cho sinh viên kiến thức kỹ thậut lập trình để làm tản cho việc lập trình giải vấn đề cần thiết BÀI 1: GIỚI THIỆU TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH Lịch sử phát triển ngôn ngữ lập trình Sự đời thúc đẩy ngôn ngữ lập trình Phân loại ngôn ngữ lập trình Vai trò ảnh hưởng phần cứng ngôn ngữ lập trình Các thuộc tính ngôn ngữ lập trình tốt 10 Các lĩnh vực ứng dụng ngôn ngữ lập trình 12 Chuẩn hoá ngôn ngữ lập trình 17 Các vấn đề nảy sinh từ sử dụng ngôn ngữ lập trình .17 BÀI 2:CÁC LOẠI DỮ LIỆU CẤU TRÚC .20 Các kiểu liệu sở 20 Kiểu mảng 23 Xâu kí tự .30 Kiểu cấu trúc 37 Kiểu hợp .46 Kiểu tập tin (file) 49 Các kiểu liệu khác 56 BÀI :HÀM THỦ TỤC 60 Khái niệm chương trình 60 Xây dựng hàm thủ tục .61 Cơ chế hoạt động chương trình .63 Biến toàn cục biến cục 64 Cơ chế truyền tham số 66 Tính ưu việt chương trình .71 BÀI 4: ĐẶC TRƯNG CÚ PHÁP VÀ NGỮ NGHĨA CHƯƠNG TRÌNH 73 Khái niệm ngôn ngữ .73 Cây phân tích cú pháp (parsing tree) 75 Các vấn đề cú pháp .75 Phân tích cú pháp 78 Ngữ nghĩa hình thức .79 Ngữ nghĩa tiên đề 80 Bài 5: LẬP TRÌNH THỦ TỤC 84 Biến 84 Lập trình cấu trúc 84 BÀI : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 94 Trừu tượng hóa (Abstraction) 94 Đối tượng (object) 95 Lớp (Class) 96 Thuộc tính (Attribute) 97 Phương thức (Method) 98 Thông điệp (Message) 98 Tính bao gói (Encapsulation) .99 Tính thừa kế (Inheritance) 99 9.Tính đa hình (Polymorphism) .100 BÀI 7:LẬP TRÌNH LOGIC VÀ LẬP TRÌNH HÀM .102 Giới thiệu lập trình logic 102 Ngữ nghĩa kí hiệu 103 Logic Prolog .109 Giới thiệu lập trình hàm .109 Ngôn ngữ hàm Scheme 110 BÀI : LẬP TRÌNH SONG SONG .116 Một số khái niệm 116 Xử lý ngoại lệ .116 Ðề xuất ngoại lệ 116 Lan truyền ngoại lệ (Propagating an exception) 117 Sau ngoại lệ xử lý 117 BÀI 9: CÁC PHƯƠNG PHÁP NGÔN NGỮ LẬP TRÌNH KHÁC .118 BÀI 10: PHÂN TÍCH CÚ PHÁP VÀ CHƯƠNG TRÌNH DỊCH 123 Chương trình dịch .123 Mô hình phân tích - tổng hợp trình biên dịch .124 Môi trường trình biên dịch 124 Các giai đoạn dịch 125 Quản lý bảng ký hiệu 126 Xử lý lỗi 127 Phân tích từ vựng .127 Phân tích cú pháp .127 YÊU CẦU VỀ ĐÁNH GIÁ MÔĐUN 139 TÀI LIỆU THAM KHẢO .140 MÔ ĐUN CHUYÊN ĐỀ (KỸ THUẬT LẬP TRÌNH) Mã mô đun: MĐ 39 * VỊ TRÍ, TÍNH CHẤT, Ý NGHĨA VÀ VAI TRÒ CỦA MÔĐUN - Vị trí: Là mô đun bố trí học kỳ cuối năm - Tính chất: Là mô đun để thực chuyên đề nêu - Ý nghĩa vai trò: Đây môn học sở ngành ngành liên quan đến công nghệ thông tin, cung cấp cho sinh viên kiến thức kỹ thậut lập trình để làm tản cho việc lập trình giải vấn đề cần thiết * MỤC TIÊU MÔĐUN: - Lựa chọn chủ đề nghiên cứu thưc hành riêng cho chuyên ngành học - Xác định yêu cầu đề tài, điều kiện kỹ thuật, tài chính, hạn chế - Biết lập kế hoach thực đề tài - Sử dụng kỹ thuật học để thực đề tài - Viết báo cáo đề tài - Bố trí làm việc khoa học đảm bảo an toàn cho người phương tiện học tập * NỘI DUNG CỦA MÔĐUN: Tiêu đề/Tiểu tiêu đề T.Số Giới thiệu tổng quan ngôn ngữ lập trình Các loại liệu cấu trúc Hàm thủ tục Các đặc trưng cú pháp ngữ nghĩa chương trình Lập trình thủ tục Lập trình hướng đối tượng Lập trình Logic lập trình hàm Lập trình song song Các phương pháp ngôn ngữ lập trình khác 10 Phân tích cú pháp chương trình dịch * Kiểm tra Tổng cộng 1 3 12 12 2 10 10 2 60 Thời gian (giờ) LT TH 15 43 KT* 2 BÀI 1: GIỚI THIỆU TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH Mã : MĐ39-01 Giới thiệu Trong lĩnh vực công nghệ thông tin, không nói đến ngôn ngữ lập trình Bởi vì, chúng công cụ cần thiết giúp cho làm việc giao tiếp với máy tính điện tử Vì vậy, việc nắm khái niệm ngôn ngữ lập trình cần thiết làm việc lĩnh vực công nghệ thông tin lĩnh vực có ứng dụng công nghệ thông tin Mục tiêu - Nắm khái niệm ngôn ngữ lập trình - Hiểu lịch sử phát triển ngôn ngữ lập trình - Đánh giá sơ ngôn ngữ lập trình - Xác định lĩnh vực ứng dụng ngôn ngữ lập trình Nội dung Giới thiệu lịch sử phát triến ngôn ngữ lập trình khái niệm chúng Chỉ yếu tố ảnh hưởng đến phát triển ngôn ngữ lập trình lĩnh vực ứng dụng ngôn ngữ lập trình Lịch sử phát triển ngôn ngữ lập trình Mục tiêu: Trình bày lịch sử phát triển ngôn ngữ lập trình, kỹ thuật lập trình Những ngôn ngữ lập trình (programming language) máy tính điện tử ngôn ngữ máy (machine language), tổ hợp số hệ nhị phân, hay bit (binary digit) Ngôn ngữ máy phụ thuộc vào hoàn toàn kiến trúc phần cứng máy tính quy ước khắt khe nhà chế tạo Để giải toán, người lậ trình phải sử dụng tập hợp lệnh điều khiển sơ cấp mà lệnh tổ hợp bit nhị phân nên gặp nhiều khó khăn, mệt nhọc, dễ gặp phải sai sót, khó sửa lỗi Từ năm 1950, để giảm nhẹ việc lập trình, người ta đưa vào kỹ thuật chương trình (sub-program hay sub-routine) xây dựng thư viện chương trình (library) đẻ cần gọi đến dùng lại đoạn chương trình viết Như thế, nhận thấy vào giai đoạn sơ khai ban đầu máy tính điện tử, việc sử dụng máy tính khó khăn, ngôn ngữ lập trình phương tiện giao tiếp lại phức tạp người sử dụng Người sử dụng máy tính vào giai đoạn chuyên gia tin học Như thế, ứng dụng máy tính điện tử hạn chế Sự đời thúc đẩy ngôn ngữ lập trình Cũng từ năm 1950, ngôn ngữ hợp dịch, hay hợp ngữ (assembly) đời Trong hợp ngữ, mã lệnh địa toán hạng thay từ gợi nhớ, ADD, SUB, JUMP, … tương ứng với phép toán số học +, -, lệnh chuyển điều khiển, … Do máy tính hiểu ngôn ngữ máy, chương trình viết hợp ngữ chạy mà phải qua giai đoạn hợp dịch (assembler) thành ngôn ngữ máy Tuy nhiên, hợp ngữ phụ thuộc nhiều vào phần cứng xa lạ với ngôn ngữ tự nhiên, người lập trình gặp nhiều khó khăn giải toán máy tính, đặc biệt toán tương đối lớn Năm 1957, hãng IBM đưa ngôn ngữ FORTRAN (FORmula TRANslator) Đây ngôn ngữ lập trình gần gũi với ngôn ngữ tự nhiên với cách diễn đạt toán học FORTRAN cho phép giải nhiều loại toán khoa học, kỹ thuật sau nhanh chóng ứng dụng rộng rãi ngày với kho tàng thư viện thuật toán đồ sộ tiện dụng Tiếp theo đời ngôn ngữ ALGOL 60 (ALGOrithmic Language) vào năm 1960, COBOL (Common Business Oriented Language) vào năm 1964, Simula vào năm 1964, … Theo phát triển máy tính điện tử, ngôn ngữ lập trình không ngừng cải tiến hoàn thiện đẻ ngày đáp ứng nhu cầu người sử dụng làm giảm nhẹ công việc lập trình Sự phát triển ngôn ngữ lập trình làm xích gần lại “khoảng cách” người sử dụng máy tính, nghĩa máy tính không sử dụng chuyên gia tin học mà sử dụng nhiều người nhiều lĩnh vực khác Rất nhiều ngôn ngữ lập trình đời tảng lý thuyết tính toán hình thành nên hai loại ngôn ngữ lập trình: ngôn ngữ bậc thấp ngôn ngữ bậc cao Các ngôn ngữ bậc thấp (low-level language) gồm hợp ngữ ngôn ngữ máy, thường dùng để viết chương trình điều khiển kiểm tra thiết bị, … Các ngôn ngữ bậc cao (high-level language) phương tiện giúp người làm tin học giải vấn đề thực tế đồng thời nơi mà thành tựu khoa học máy tính đưa vào Lĩnh vực nghiên cứu ngôn ngữ lập trình vừa có tính truyền thống vừa có tính đại Ngày nay, với tiến khoa học công nghệ, người ta sử dụng công cụ hình thức cho phép giảm nhẹ công việc xây dựng hệ thống chương trình từ phân tích, thiết kế sử dụng ngôn ngữ lập trình Chúng ta có cài nhìn toàn cảnh lích sử ngôn ngữ lập trình qua hình vẽ đây: FORTRAN (55) LISP (58) COBOL (60) ALP (62) ALGOL 60 (63) SIMULA (66) ALGOL 68 (69) PASCAL (71) C (69) SNOBOL4 (71) SMALLTALK (71) PROLOG (72) ADA (75) SCHEME (75) FP (78) SMALLTALK (80) COMMON LISP (81) ADA (83) C++ (86) ADA 9X (90) EIFFEL (90) JAVA (95) Hình 1.Ngôn ngữ lập trình qua hình vẽ Phân loại ngôn ngữ lập trình Cho đến có hàng trăm ngôn ngữ lập trình đề xuất thực tế có số ngôn ngữ sử dụng rộng rãi Ngoài cách phân loại theo bậc nói trên, người ta phân loại ngôn ngữ lập trình theo phương thức (paradgm), theo mức độ quan trọng, theo hệ, Cách phân loại theo mức hay bậc dựa mức độ trừu tượng so với yếu tố phần cứng, chẳng hạn lệnh (instruction) cấp phát nhớ (memory allocation) đây: Mức Lệnh Sử dụng nhớ Ví dụ Thấp Lệnh máy đơn Truy cập cấp phát trực Hợp ngữ giản tiếp Cao Biểu thức điều Truy cập cấp phát nhờ C, Pascal, Ada kiện tương minh phép gán Rất cao Máy trừu tượng Truy cập ẩn tự động cấp Prolog, Miranda phát Những năm gần đây, ngôn ngữ lập trình phát triển theo phương thức lập trình (còn gọi phong cách hay kiểu lập trình) Một phương thức lập trình hiểu tập hợp tính trừu tượng đặc trưng cho lớp ngôn ngữ mà có nhiều người lập trình thường xuyên sử dụng chúng Sau sơ đồ minh họa phân cấp phương thức lập trình: Phương thức lập trình Mệnh lệnh Thủ tục Khai báo Hướng đối Xử lý song tượng song Logic Hàm Cơ sở liệu Sau số ngôn ngữ lập trình quen thuộc liệt kê theo phương thức: • Các ngôn ngữ thủ tục (procedural language) có Fortran (1957), Cobol (1959), Basic (1965), Pascal (1971), C (1969), Ada (1975), … • Các ngôn ngữ hướng đối tượng (object-oriented language) có Smalltalk (1971), C++ (1985), Eiffel (1990), Java (1995), C# (2000), … • Các ngôn ngữ hàm (functional language) có Lisp (1958), ML (1973), Scheme (1975), Caml (1987), Miranda (1982), … • Các ngôn ngữ dựa logic (logic-based language) chủ yếu ngôn ngữ Prolog (1972) • Các ngôn ngữ thao tác sở liệu SQL (1980),… • Các ngôn ngữ xử lý song song Ada, Occam (1982), C-Linda, … Ngoài có số phương thức lập trình phát triển ứng dụng như: • Lập trình phân bổ (distributed programming) • Lập trình ràng buộc (constraint programming) • Lập trình hướng truy cập (access-oriented programming) • Lập trình theo luồng liệu (dataflow programming) Việc phân loại ngôn ngữ lập trình theo mức độ quan trọng dựa (what) thao tác được, hay tính được, so với cách thao tác (how) Một ngôn ngữ thể thao tác mà không cách thao tác gọi ngôn ngữ định nghĩa (definitional) hay ngôn ngữ khai báo (declarative) Một ngôn ngữ thể cách thao tác mà không thao tác gọi ngôn ngữ thao tác (operational) hay không khai báo (non-declarative), ngôn ngữ mệnh lệnh Ngoài ra, ngôn ngữ lập trình phân chia theo hệ sau: • Thế hệ 1: ngôn ngữ máy • Thế hệ 2: hợp ngữ • Thế hệ 3: ngôn ngữ thủ tục • Thế hệ 4: ngôn ngữ áp dụng hay hàm • Thế hệ 5: ngôn ngữ suy diễn hay dựa logic • Thế hệ 6: mạng nơ-ron (neural networks) Hình 10.3 Một phân rã điển hình trình biên dịch Việc quản lý bảng ký hiệu xử lý lỗi thực xuyên suốt qua tất giai đoạn Quản lý bảng ký hiệu Một nhiệm vụ quan trọng trình biên dịch ghi lại định danh sử dụng chương trình nguồn thu thập thông tin thuộc tính khác định danh Những thuộc tính cung cấp thông tin vị trí lưu trữ cấp phát cho định danh, kiểu tầm vực định danh, định danh tên thủ tục thuộc tính thông tin số lượng kiểu đối số, phương pháp truyền đối số kiểu trả thủ tục có Bảng ký hiệu (symbol table) cấu trúc liệu mà phần tử mẩu tin dùng để lưu trữ định danh, bao gồm trường lưu giữ ký hiệu thuộc tính Cấu trúc cho phép tìm kiếm, truy xuất danh biểu cách nhanh chóng Trong trình phân tích từ vựng, danh biểu tìm thấy đưa vào bảng ký hiệu nói chung thuộc tính chưa xác định giai đoạn Xử lý lỗi Mỗi giai đoạn gặp nhiều lỗi, nhiên sau phát lỗi, tùy thuộc vào trình biên dịch mà có cách xử lý lỗi khác nhau, chẳng hạn : - Dừng thông báo lỗi gặp lỗi (Pascal) - Ghi nhận lỗi tiếp tục trình dịch (C) Giai đoạn phân tích từ vựng thường gặp lỗi ký tự ghép thành token Giai đoạn phân tích cú pháp gặp lỗi token kết hợp với theo cấu trúc ngôn ngữ Giai đoạn phân tích ngữ nghĩa báo lỗi toán hạng có kiểu không yêu cầu phép toán hay kết cấu nghĩa thao tác thực chúng hoàn toàn mặt cú pháp Phân tích từ vựng Ðọc ký tự gộp lại thành token, token danh biểu, từ khóa, ký hiệu, Chuỗi ký tự tạo thành token gọi lexeme - trị từ vựng token 7.1 Phân tích cú pháp phân tích ngữ nghĩa Xây dựng cấu trúc phân cấp cho chuỗi token, biểu diễn cú pháp kiểm tra ngôn ngữ theo cú pháp 7.2 Sinh mã trung gian Sau phân tích ngữ nghĩa, số trình biên dịch tạo dạng biểu diễn trung gian chương trình nguồn Chúng ta xem dạng biểu diễn chương trình dành cho máy trừu tượng Chúng có đặc tính quan trọng : dễ sinh dễ dịch thành chương trình đích 7.3 Tối ưu mã Giai đoạn tối ưu mã cố gắng cải thiện mã trung gian để có mã máy thực nhanh Một số phương pháp tối ưu hóa hoàn toàn bình thường 7.4 Sinh mã Giai đoạn cuối biên dịch sinh mã đích, thường mã máy mã hợp ngữ Các vị trí vùng nhớ chọn lựa cho biến chương trình sử dụng Sau đó, thị trung gian dịch thành chuỗi thị mã máy Vấn đề định việc gán biến cho ghi Phân tích cú pháp Phân tích cú pháp trình xác định xem liệu chuỗi ký hiệu kết thúc (token) sinh từ văn phạm hay không ? Khi nói vấn đề này, xem xây dựng phân tích cú pháp, trình biên dịch không xây dựng Tuy nhiên, trình phân tích cú pháp (parse) phải có khả xây dựng nó, không việc phiên dịch không bảo đảm tính đắn Phần lớn phương pháp phân tích cú pháp rơi vào lớp: phương pháp phân tích từ xuống phương pháp phân tích từ lên Những thuật ngữ muốn đề cập đến thứ tự xây dựng nút phân tích cú pháp Trong phương pháp đầu, trình xây dựng gốc tiến hành hướng xuống nút lá, phương pháp sau thực từ nút hướng gốc Phương pháp phân tích từ xuống thông dụng nhờ vào tính hiệu xây dựng theo lối thủ công Ngược lại, phương pháp phân tích từ lên lại xử lý lớp văn phạm lược đồ dịch phong phú Vì vậy, đa số công cụ phần mềm giúp xây dựng thể phân tích cú pháp cách trực tiếp từ văn phạm có xu hướng sử dụng phương pháp từ lên 8.1 Phân tích cú pháp từ xuống (Top - down Parsing) Xét văn phạm sinh tập kiểu liệu Pascal type simple | id | array [simple] of type simple integer | char | num num Phân tích xuống bắt đầu nút gốc, nhãn ký hiệu chưa kết thúc bắt đầu lặp lại việc thực hai bước sau đây: Tại nút n, nhãn ký hiệu chưa kết thúc A, chọn luật sinh A xây dựng n cho ký hiệu vế phải luật sinh Tìm nút mà xây dựng Ðối với số văn phạm, bước cài đặt phép quét (scan) dòng nhập từ trái qua phải Ví dụ 10.1 : Với luật sinh văn phạm trên, ta xây dựng cú pháp cho dòng nhập: array [num num] of integer Mở đầu ta xây dựng nút gốc với nhãn type Ðể xây dựng nút type ta chọn luật sinh type array [simple] of type Các ký hiệu nằm bên phải luật sinh array, [, simple, ], of, type nút gốc type có có nhãn tương ứng (áp dụng bước 1) Trong nút type, từ trái qua nút có nhãn simple (một ký hiệu chưa kết thúc) xây dựng nút simple (bước 2) Trong luật sinh có vế trái simple, ta chọn luật sinh simple num num để xây dựng Nói chung, việc chọn luật sinh xem trình thử sai (trial - and - error) Nghĩa luật sinh chọn để thử sau quay lại để thử luật sinh khác luật sinh ban đầu không phù hợp Một luật sinh không phù hợp sau sử dụng luật sinh xây dựng hợp với dòng nhập Ðể tránh việc lần ngược, người ta đưa phương pháp gọi phương pháp phân tích cú pháp dự đoán Hình 10.4 Minh họa trình phân tích cú pháp từ xuống 8.2 Phân tích cú pháp dự đoán (Predictive parsing) Phương pháp phân tích cú pháp đệ qui xuống (recursive-descent parsing) phương pháp phân tích xuống, thực loạt thủ tục đệ qui để xử lý chuỗi nhập Mỗi thủ tục kết hợp với ký hiệu chưa kết thúc văn phạm Ở xét trường hợp đặc biệt phương pháp đệ qui xuống phương pháp phân tích dự đoán ký hiệu dò tìm xác định thủ tục chọn ký hiệu chưa kết thúc Chuỗi thủ tục gọi trình xử lý chuỗi nhập tạo phân tích cú pháp Ví dụ 10.2 : Xét văn phạm trên, ta viết thủ tục type simple tương ứng với ký hiệu chưa kết thúc type simple văn phạm Ta đưa thêm thủ tục match để đơn giản hóa đoạn mã cho hai thủ tục trên, dịch tới ký hiệu tham số t so khớp với ký hiệu dò tìm đầu đọc (lookahead) procedure match (t: token); begin if lookahead = t then lookahead := nexttoken else error end; procedure type; begin if lookahead in [integer, char, num] then simple else if lookahead = ‘‘ then begin match (‘‘); match(id); end else if lookahead = array then begin match(array); match(‘[‘); simple; match(‘]’); match(of); type end else error; end; procedure simple; begin if lookahead = integer then match(integer) else if lookahead = char then match(char) else if lookahead = num then begin match(num); match(dotdot); match(num); end else error end; Phân tích cú pháp bắt đầu lời gọi tới thủ tục cho ký hiệu bắt đầu type Với dòng nhập array [num num] of integer đầu đọc lookahead bắt đầu đọc token array Thủ tục type sau thực chuỗi lệnh: match(array); match(‘[‘); simple; match(‘]’); match(of); type Sau đọc array [ ký hiệu num Tại điểm thủ tục simple lệnh match(num); match(dotdot); match(num) thực Xét luật sinh type simple Luật sinh dùng ký hiệu dò tìm sinh simple, chẳng hạn ký hiệu dò tìm integer văn phạm luật sinh type integer, có luật sinh simple integer, luật sinh type simple dùng cách type gọi simple Phân tích dự đoán dựa vào thông tin ký hiệu đầu sinh vế phải luật sinh Nói xác hơn, giả sử ta có luật sinh A , ta định nghĩa tập hợp : FIRST() = { token | xuất ký hiệu đầu nhiều chuỗi sinh } Nếu sinh FIRST() Ví dụ 7.8: Xét văn phạm trên, ta dễ dàng xác định : FIRST( simple) = { integer, char, num } FIRST(id) = { } FIRST( array [simple] of type ) = { array } Nếu ta có A A , phân tích đệ qui xuống quay lui FIRST() FIRST() = Nếu ký hiệu dò tìm thuộc FIRST() A dùng Ngược lại, ký hiệu dò tìm thuộc FIRST() A dùng 8.3 Thiết kế phân tích cú pháp dự đoán Bộ phân tích dự đoán chương trình bao gồm thủ tục tương ứng với ký hiệu chưa kết thúc Mỗi thủ tục thực hai công việc sau: Luật sinh mà vế phải dùng ký hiệu dò tìm thuộc FIRST( ) Nếu có đụng độ hai vế phải ký hiệu dò tìm dùng phương pháp Một luật sinh với nằm bên vế phải dùng ký hiệu dò tìm không thuộc tập hợp FIRST vế phải khác Một ký hiệu chưa kết thúc tương ứng lời gọi thủ tục, token phải phù hợp với ký hiệu dò tìm Nếu token không phù hợp với ký hiệu dò tìm có lỗi 8.4 Loại bỏ đệ qui trái Một phân tích cú pháp đệ quy xuống dẫn đến vòng lặp vô tận gặp luật sinh đệ qui trái dạng E E + T ký hiệu trái bên vế phải giống ký hiệu chưa kết thúc bên vế trái luật sinh Ðể giải vấn đề phải loại bỏ đệ qui trái cách thêm vào ký hiệu chưa kết thúc Chẳng hạn với luật sinh dạng A A | (.Ta thêm vào ký hiệu chưa kết thúc R để viết lại thành tập luật sinh sau : A R R R| Ví dụ 10.3: Xét luật sinh đệ quy trái : E E + T | T Sử dụng quy tắc khử đệ quy trái nói với : A E, + T, T Luật sinh biến đổi tương đương thành tập luật sinh : E TR R +TR| 8.5 Phân tích từ vựng Bây thêm vào phần trước trình biên dịch phân tích từ vựng để đọc biến đổi dòng nhập thành chuỗi từ tố (token) mà phân tích cú pháp sử dụng Nhắc lại chuỗi ký tự hợp thành token gọi trị từ vựng (lexeme) token Trước hết ta trình bày số chức cần thiết phân tích từ vựng 8.6 Loại bỏ khoảng trắng dòng thích Quá trình dịch xem xét tất ký tự dòng nhập nên ký tự nghĩa (như khoảng trắng bao gồm ký tự trống (blanks), ký tự tabs, ký tự newlines) dòng thích (comment) phải bị bỏ qua Khi phân tích từ vựng bỏ qua khoảng trắng phân tích cú pháp không xem xét đến chúng Chọn lựa cách sửa đổi văn phạm để đưa khỏang trắng vào cú pháp khó cài đặt 8.7 Xử lý Bất ký tự số xuất biểu thức xem số Bởi số nguyên dãy chữ số nên cho luật sinh văn phạm tạo token cho số Bộ phân tích từ vựng có nhiệm vụ ghép chữ số để số sử dụng đơn vị suốt trình dịch Ðặt num token biểu diễn cho số nguyên Khi chuỗi chữ số xuất dòng nhập phân tích từ vựng gửi num cho phân tích cú pháp Giá trị số nguyên chuyển cho phân tích cú pháp thuộc tính token num Về mặt logic, phân tích từ vựng chuyển token thuộc tính cho phân tích cú pháp Nếu ta viết token thuộc tính thành nằm < > dòng nhập 31 + 28 + 59 chuyển thành dãy : , < +, >, , < +, >, Bộ cho thấy thuộc tính + vai trò phân tích cú pháp cần thiết dùng đến trình dịch 8.8 Nhận dạng danh biểu từ khóa Ngôn ngữ dùng danh biểu (identifier) tên biến, mảng, hàm văn phạm xử lý danh biểu token Người ta dùng token id cho danh biểu khác ta có dòng nhập count = count + increment; phân tích từ vựng chuyển cho phân tích cú pháp chuỗi token: id = id + id (cần phân biệt token trị từ vựng lexeme nó: token id trị từ vựng (lexeme) count increment) Khi lexeme thể cho danh biểu tìm thấy dòng nhập cần phải có chế để xác định xem lexeme thấy trước chưa? Công việc thực nhờ lưu trữ trợ giúp bảng ký hiệu (symbol table) nêu chương trước Trị từ vựng lưu bảng ký hiệuvà trỏ đến mục ghi bảng trở thành thuộc tính token id Nhiều ngôn ngữ sử dụng chuỗi ký tự cố định begin, end, if, để xác định số kết cấu Các chuỗi ký tự gọi từ khóa (keyword) Các từ khóa thỏa mãn qui luật hình thành danh biểu, cần qui ước chuỗi ký tự xác định danh biểu từ khóa Một vấn đề cần quan tâm vấn đề tách token trường hợp ký tự xuất trị từ vựng nhiều token Ví dụ số token toán tử quan hệ Pascal : 8.9 Giao diện phân tích từ vựng Bộ phân tích từ vựng đặt xen dòng nhập phân tích cú pháp nên giao diện với hai sau: Hình 10.5 Giao diện phân tích từ vựng Bộ phân tích từ vựng đọc ký tự từ dòng nhập, nhóm chúng lại thành trị từ vựng chuyển token xác định trị từ vựng với thuộc tính đến giai đọan sau trình biên dịch Trong vài tình huống, phân tích từ vựng phải đọc vượt trước số ký tự xác định token để chuyển cho phân tích cú pháp Ví dụ, Pascal gặp ký tự >, phải đọc thêm ký tự sau nữa; ký tự sau = token xác định “lớn bằng”, ngược lại token “lớn hơn” ký tự bị đọc Trong trường hợp ký tự đọc phải đẩy trả (push back) cho dòng nhập ký tự bắt đầu cho trị từ vựng Bộ phân tích từ vựng phân tích cú pháp tạo thành cặp "nhà sản xuất người tiêu dùng" (producer - consumer) Bộ phân tích từ vựng sản sinh token phân tích cú pháp tiêu thụ chúng Các token sản xuất phân tích từ vựng lưu đệm (buffer) chúng tiêu thụ phân tích cú pháp Bộ phân tích từ vựng hoạt động tiếp buffer bị đầy phân tích cú pháp hoạt động buffer rỗng Thông thường, buffer lưu giữ token Ðể cài đặt tương tác dễ dàng, người ta tạo thủ tục phân tích từ vựng gọi từ thủ tục phân tích cú pháp, lần gọi trả token Việc đọc quay lui ký tự cài đặt cách dùng đệm nhập Một khối ký tự đọc vào buffer nhập thời điểm đó, trỏ giữ vị trí phân tích Quay lui ký tự thực cách lùi trỏ trở Các ký tự dòng nhập cần lưu lại cho công việc ghi nhận lỗi cần phải vị trí lỗi đoạn chương trình Ðể tránh việc phải quay lui, số trình biên dịch sử dụng chế đọc trước ký tự gọi đến phân tích từ vựng Bộ phân tích từ vựng đọc tiếp ký tự đọc tới ký tự mở đầu cho token khác Trị từ vựng token trước bao gồm ký tự từ ký tự đọc trước đến ký tự vừa ký tự vừa đọc Ký tự vừa đọc ký tự mở đầu cho trị từ vựng token sau Với chế ký tự đọc lần Quản lý bảng danh hiệu Một cấu trúc liệu gọi bảng ký hiệu (symbol table) thường dùng để lưu giữ thông tin cấu trúc ngôn ngữ nguồn Các thông tin tập hợp từ giai đoạn phân tích trình biên dịch sử dụng giai đoạn tổng hợp để sinh mã đích Ví dụ trình phân tích từ vựng, chuỗi ký tự tạo token (trị từ vựng token) lưu vào mục ghi bảng danh biểu Các giai đọan sau bổ sung thêm thông tin kiểu danh biểu, cách sử dụng vị trí lưu trữ Giai đoạn sinh mã dùng thông tin để tạo mã phù hợp, cho phép lưu trữ truy xuất biến Giao diện bảng ký hiệu Các thủ tục bảng ký hiệu chủ yếu liên quan đến việc lưu trữ truy xuất trị từ vựng Khi trị từ vựng lưu trữ token kết hợp với lưu Hai thao tác sau thực bảng ký hiệu: Insert (s, t): Trả mục ô cho chuỗi s, token t Lookup (s): Trả mục ô cho chuỗi s chuỗi s không tồn Bộ phân tích từ vựng sử dụng thao tác tìm kiếm lookup để xác định xem ô cho trị từ vựng token tồn bảng ký hiệu hay chưa? Nếu chưa dùng thao tác xen vào insert để tạo ô cho Xử lý từ khóa dành riêng Ta sử dụng bảng ký hiệu nói để xử lý từ khóa dành riêng (reserved keyword) Ví dụ với hai token div mod vớiï hai trị từ vựng tương ứng div mod Chúng ta khởi tạo bảng ký hiệu lời gọi: insert (“div”, div); insert (“mod”, mod); Sau lời gọi lookup (“div”) trả token div, “div” dùng làm danh biểu Với phương pháp vừa trình bày tập từ khóa lưu trữ bảng ký hiệu trước việc phân tích từ vựng diễn Ta lưu trữ từ khóa bên bảng ký hiệu danh sách có thứ tự từ khóa Trong trình phân tích từ vựng, trị từ vựng xác định ta phải tìm (nhị phân) danh sách từ khóa xem có trị từ vựng không Nếu có, trị từ vựng từ khóa, ngược lại, danh biểu đưa vào bảng ký hiệu Cài đặt bảng ký hiệu Cấu trúc liệu cụ thể dùng cài đặt cho bảng ký hiệu trình bày hình Chúng ta không muốn dùng lượng không gian nhớ định để lưu trị từ vựng tạo danh biểu lượng không gian cố định không đủ lớn để lưu danh biểu dài lãng phí gặp danh biểu ngắn Thông thường, bảng ký hiệu gồm hai mảng : Mảng lexemes (trị từ vựng) dùng để lưu trữ chuỗi ký tự tạo danh biểu, chuỗi ngăn cách ký tự EOS (end - of - string) Mảng symtable với phần tử mẩu tin (record) bao gồm hai trường, trường trỏ lexptr trỏ tới đầu trị từ vựng trường token Cũng dùng thêm trường khác để lưu trữ giá trị thuộc tính Mục ghi thứ zero mảng symtable phải để trống giá trị trả hàm lookup trường hợp không tìm thấy ô tương ứng cho chuỗi ký hiệu Bảng ký hiệu mảng để lưu chuỗi minh họa sau: Hình 10.6 Bảng ký hiệu mảng để lưu chuỗi Trong hình trên, ô thứ thứ hai bảng ký hiệu dành cho từ khóa div mod Ô thứ ba thứ tư dành cho danh biểu count i Ðoạn mã (ngôn ngữ giả) cho phân tích từ vựng dùng để xử lý danh biểu sau: Function lexan: integer; var lexbuf: array[0 100] of char; c: char begin loop begin đọc ký tự vào c; if c ký tự trống blank ký tự tab then không thực điều ; else if c ký tự newline then lineno = lineno + else if c ký tự số then begin đặt tokenval giá trị ký số ký số theo sau; return NUM; end else if c chữ then begin đặt c ký tự, ký số theo sau vào lexbuf; p := lookup (lexbuf); if p = then p := insert (lexbuf, id); tokenval := p; return trường token ô có mục p; end else begin /* token ký tự đơn */ đặt tokenval NONE; /* thuộc tính */ return số nguyên mã hóa ký tự c; end; end; end; Nó xử lý khoảng trắng số nguyên giống thủ tục nói phần trước Khi phân tích từ vựng đọc vào chữ cái, bắt đầu lưu chữ chữ số vào vùng đệm lexbuf Chuỗi tập hợp lexbuf sau tìm mảng symtable bảng ký hiệu cách dùng hàm lookup Bởi bảng ký hiệu khởi tạo với ô cho div mod (hình 2.14) nên tìm thấy trị từ vựng lexbuf có chứa div hay mod, ngược lại ô cho chuỗi chứa lexbuf hàm lookup trả hàm insert gọi để tạo ô symtable p số ô bảng ký hiệu chuỗi lexbuf Chỉ số truyền tới phân tích cú pháp cách đặt tokenval := p token nằm trường token trả Kết trả số nguyên mã hóa cho ký tự dùng làm token THUẬT NGỮ CHUYÊN NGÀNH programming language: ngôn ngữ lập trình machine language:ngôn ngữ máy sub-program hay sub-routine:kỹ thuật chương trình library:thư viện chương trình assembly:hợp ngữ assembler:giai đoạn hợp dịch FORmula TRANslator:ngôn ngữ FORTRAN ALGOrithmic Language:ngôn ngữ ALGOL 60 Common Business Oriented Language:ngôn ngữ COBOL low-level language:ngôn ngữ bậc thấp high-level language:ngôn ngữ bậc cao paradgm:phương thức instruction:lệnh memory allocation:cấp phát nhớ procedural language: ngôn ngữ thủ tục object-oriented language:ngôn ngữ hướng đối tượng functional language:ngôn ngữ hàm logic-based language:ngôn ngữ dựa logic distributed programming:lập trình phân bổ constraint programming:lập trình ràng buộc access-oriented programming:lập trình hướng truy cập dataflow programming:lập trình theo luồng liệu operational:ngôn ngữ thao tác non-declarative:không khai báo neural networks:mạng nơ-ron longint:số nguyên dài hai từ nhớ writability:Tính dễ viết readability:Tính dễ đọc reliability:Tính tin cậy mybuffer:biến xâu function: hàm procedure:thủ tục global variable:biến toàn cục local variable:biến cục recursivity:đệ quy syntax:cú pháp terminal symbols:các ký hiệu kết thúc nonterminal symbols:các ký hiệu chưa kết thúc variable: biến production:luật sinh parsing tree:cây phân tích cú pháp Backus-Naur Form:chuẩn Backus-Naur top down:trên xuống bottom-up:dưới lên backtracking:khả quay lui stack:ngăn xếp semantic:mặt ngữ nhĩa axiomatic semantics:ngữ nghĩa tiên đề denotationnal semantics:ngữ nghĩa biểu thị semantic function:hàm ngữ nghĩa semantic domain:miền cú pháp literal constant:Hằng trực kiện object orientation:hướng đối tượng object:đối tượng message: thông điệp method:phương thức Object-Oriented Programming:Lập trình hướng đối tượng Abstraction:Trừu tượng hóa software object:đối tượng phần mềm state:trạng thái behavior:hành động member function:hàm thành viên instance:thể blueprint:bảng thiết kế prototype:mẫu ban đầu blueprint:thiết kế class attribute:thuộc tính lớp class methods:phương thức lớp parameter:tham số Encapsulation:Tính bao gói Inheritance:Tính thừa kế Subclass:lớp Superclass:lớp cha information hiding:che giấu thông tin Polymorphism:Tính đa hình Relation:mối quan hệ Horn clause:mệnh đề Horn Rule:luật Fact:sự kiện Question:câu hỏi Knowledge: tri thức Predicat:vị từ logic atom:nguyên tử elementary term:hạng sơ cấp constant:hằng literal:trực kiện compound term:hạng phức hợp comment:chú thích substitution :sử dụng phép bound :ràng buộc recursive rule :luật đệ quy ancesto :quan hệ tổ tiên anonymous variable:biến vô danh irst order predicate logic:công thức logic vị từ bậc resolution:hợp giải functional programing language:ngôn ngữ lập trình hàm arguments hay parameters:tham đối boolean:kiểu logic exception :ngoại lệ raising the exception:đề xuất ngoại lệ Propagating an exception:Lan truyền ngoại lệ Propagated:được truyền dynamic chain:chuỗi động remain:kế thừa source program:chương trình nguồn executable program;chương trình thực source language:ngôn ngữ nguồn compiler:Trình biên dịch interprete:Trình thông dịch preprocessor:bộ tiền xử lý executable:thực thi assembly code:mã lệnh hợp ngữ assembler:trình dịch hợp ngữ symbol table:Bảng ký hiệu parse:cú pháp Predictive parsing:Phân tích cú pháp dự đoán Token: từ tố Lexeme:trị từ vựng Keyword:từ khóa producer – consumer:nhà sản xuất - người tiêu dùng buffer:bộ đệm YÊU CẦU VỀ ĐÁNH GIÁ MÔĐUN Kỹ năng: - Sử dụng thành thạo phần mềm hỗ trợ thiết kế, hiểu ngôn ngữ lập trình - Lập tài liệu phân tích thiết kế - Hiểu kiểu liệu loại ngôn ngữ lập trình Thái độ: - Cẩn thận lắng nghe ý kiến thảo luận nhóm thiết kế - Học viên cần tuân thủ tập thực hành theo thứ tự chương, từ dễ đến khó Đánh giá thông qua kiểm tra trắc nghiệm: - Dùng phần mềm thi trắc nghiệm - Kiểm tra trắc nghiệm giấy máy tính - Xây dựng ngân hàng câu hỏi, học viên nhận để phát sinh ngẫu nhiên chất lượng đề (trung bình, khá, giỏi, xuất sắc) - Thời gian làm tuỳ theo số lượng câu đề - Thang điểm 10 chia cho câu - Kết đánh giá dựa vào làm theo điểm đạt Thực hành: Đánh giá thông qua khả giải hoàn thành chương trình (đề kiểm tra) đề Thang điểm: (đánh giá câu hỏi trắc nghiệm) 0-49 : Không đạt 50-69 : Đạt trung bình 70-85 : Đạt 86-100 : Đạt Giỏi TÀI LIỆU THAM KHẢO [1] Terrence W Pratt, Marvin V Zelkowitz; Programming Languages: Design and Implementation; Prentice-Hall, 2000 [2] Doris Appleby, Julius J VandeKopple; Programming Languages; McGrawHill; 1997 [3] Ryan Stensifer; The Study of Programming Languages; Prentice Hall, 1995 [4] Maryse CONDILLAC; Prolog fondements et applications; BORDAS, Paris 1986 [5] Website XLISP http://webmaker.web.cern.ch/WebMaker/examples/xlisp/www/cldoc_1.html [6] Website Turbo Prolog http://www.csupomona.edu/%7Ejrfisher/www/prolog_tutorial/contents.html ... #include #include #include #include #define KICHTHUOC // Kich thuoc cua ban co #define SODUONGCHEO (2*KICHTHUOC-1) // So duong cheo cua ban co #define... #include #include #include long giaithua(long n) { if (n == 0) return(1); else return(n * giaithua(n-1)); } void main() { int n; char c; clrscr(); printf("Chuong trinh. .. vào bàn cờ vua, tìm đường để quân mã hết bàn cờ mà không lại ô #include #include #include #define KICHTHUOC // Kich thuoc cua ban co void nuocdi(int, int, int);