Bài tập lớn chương trình dịch xây dựng bộ phân tích từ vựng cho ngôn ngữ Slang Chương trình dịch nghiên cứu 2 vấn đề + Lý thuyết thiết kế các ngôn ngữ lập trình. + Cách viết chương trình chuyển đổi từ một ngôn ngữ lập trình này sang một ngôn ngữ lập trình khác.
Chương trình dịch Bộ phân tích từ vựng cho ngơn ngữ Slang Mục Lục Giới thiệu chương trình dịch a Giới thiệu b Ứng dụng chương trình dịch c Các tốn cụ thể chương trình dịch d Đặc trưng chương trình dịch e Phân loại chương trình dịch f Cấu trúc chương trình dịch Ứng dụng chương trình dịch Phát triển dự án chương trình dịch a Mục đích b Các bước tiến hành Vai trò phân tích từ vựng Nhiệm vụ phân tích từ vựng Các bước để phân tích từ vựng 10 Xác định từ tố 12 a Biểu thức quy 12 b Đồ thị chuyển 13 c Viết chương trình cho đồ thị chuyển 14 d Tập hợp tất mẫu từ tố 14 e Lập phân tích từ vựng phương pháp diễn giải đồ thị chuyển 14 f Viết chương trình 15 g Cách xử lý lỗi 15 Các bước để xây dựng PTTV 16 Demo chương trình 16 a Ngơn ngữ SLANG 16 b Kết 18 1.Giới thiệu chương trình dịch a Giới thiệu - Ngơn ngữ lập trình tập hợp ký hiệu chuẩn hóa theo quy tắc định để viết chương trình Nó dùng lập trình máy tính để thực thuật tốn để giao tiếp với người Cú pháp đơn giản, gần gũi với ngơn ngữ tự nhiên - Ví dụ: C/Pascal/Java, - Ngôn ngữ máy ngôn ngữ để viết chương trình mà máy tính trực tiếp hiểu thực Mỗi chương trình viết ngơn ngữ khác muốn thực máy tính phải dịch ngôn ngữ máy chương trình dịch - Chương trình dịch: chuyển tự động ngơn ngữ lập trình sang ngơn ngữ máy - Chương trình dịch nghiên cứu vấn đề + Lý thuyết thiết kế ngơn ngữ lập trình + Cách viết chương trình chuyển đổi từ ngơn ngữ lập trình sang ngơn ngữ lập trình khác b Ứng dụng chương trình dịch - Các chương trình dịch dùng lập trình: Turbo Pascal, Turbo C/Borland C/Dev C v.v - Các chuyển đổi văn bản: Phần mềm convert từ MS Word sang Pdf ngược lại v.v - Xử lý ngôn ngữ tự nhiên: dịch Anh – Việt, Việt –Anh tự động v.v c Các toán cụ thể chương trình dịch - Dịch ngơn ngữ lập trình thành mã máy - Dịch ngơn ngữ lập trình bậc cao thành ngơn ngữ bậc thấp - Chuyển đổi đoạn mã ngôn ngữ lập trình - Kiểm tra tả, ngữ pháp đoạn văn - Mơ tả hình ảnh (dịch từ hình ảnh thành văn bản) d Đặc trưng chương trình dịch - Tính tồn vẹn: kết ngơn ngữ đích phải hồn tồn tương đương với đầu vào viết ngơn ngữ nguồn - Tính suốt: + Chương trình phải chia thành bước độc lập + Phải rõ ràng kết sau từ bước thực + Có thể thực việc hiệu chỉnh, sửa lỗi tối ưu sau bước - Tính hiệu quả: chương trình dịch sử dụng khơng q nhiều nhớ cơng suất tính tốn, kết ngơn ngữ đích đủ tốt - Tính chịu lỗi: + Chương trình chấp nhận số lỗi đầu vào đưa gợi ý xử lý phù hợp + Chương trình dừng lỗi coi tốt e Phân loại chương trình dịch - Theo số lần duyệt Theo mục đích Theo độ phức tạp: Assembly, Preprocessor, Compiler Theo phương pháp dịch chạy: Thông dịch, biên dịch Theo lớp văn phạm: LL(1), LR(1) f Cấu trúc chương trình dịch Giai đoạn phân tích: - Phân tích từ vựng (lexical analyzer): + Đọc CT nguồn từ phải sang trái, nhóm ký hiệu gọi từ tố: tên từ khóa, tên biến, số, phép tốn v.v - Phân tích cú pháp (syntax analyzer): + Phân tích cấu trúc ngữ pháp chương trình + Các từ tố nhóm lại theo cấu trúc phân cấp - Phân tích ngữ nghĩa (semantic analyzer): + Phân tích tất đặc tính khác chương trình + Tìm lỗi ngữ nghĩa, khơng tương thích Ví dụ: gán ghi cho biến số nguyên Giai đoạn tổng hợp - Sinh mã trung gian (intermediate code generator): sinh chương trình ngôn ngữ trung gian nhằm: + Dễ sinh tối ưu mã máy + Dễ chuyển đổi mã máy - Tối ưu mã (code optimizer): Sửa đổi chương trình ngơn ngữ trung gian nhằm cải tiến chương trình đích hiệu - Sinh mã (code generator): Tạo chương trình đích từ ngơn ngữ trung gian tối ưu Cấu trúc chi tiết chương trình dịch: Các thành phần khác: - Quản lý bảng ký hiệu + Ghi lại ký hiệu, tên, Đã sử dụng chương trình nguồn thuộc tính kèm theo kiểu, phạm vi, giá trị v.v - Xử lý lỗi + Ghi lại vị trí có lỗi, loại lỗi, lỗi khác liên quan + Giúp CCD bỏ qua lỗi không quan trọng + Giúp CCD biết lỗi dây chuyển: dịch tiếp hay khơng? 2.Ứng dụng chương trình dịch - Từ ứng dụng ban đầu chương trình dịch cho ngơn ngữ lập trình, nhiều kĩ thuật áp dụng vào nhiều ngành khác - Bộ kiểm tra tả + Dùng cho ngơn ngữ tự nhiên (trong phần mềm soạn thảo văn bản) + Trợ giúp việc soạn thảo (intellisense, word suggestion) - Bộ kiểm tra ngữ pháp + Kiểm tra lỗi nhanh viết ngơn ngữ lập trình + Sốt lỗi viết tài liệu ngôn ngữ tự nhiên - Sinh nhận dạng mã độc / virus: + Mỗi mã độc / virus nhận dạng mẫu (pattern) automat + Kết hợp nhiều automat làm để tăng tốc độ việc nhận dạng (thay phải chạy otomat cho virus, ta chạy automat phát đồng thời nhiều virus) - Các công cụ ngơn ngữ: + Bộ tìm kiếm văn hiệu + Bộ phát ngôn ngữ + Bộ diễn dịch giao thức 3.Phát triển dự án chương trình dịch a Mục đích - Tạo ngơn ngữ lập trình - Viết chương trình dịch hồn chỉnh cho ngôn ngữ máy b Các bước tiến hành - Tìm hiểu/thiết kế ngơn ngữ nguồn/đích + Có nhu cầu NNLT hay không? ○ Vi mạch sáng chế + Các NNLT không đáp ứng nhu cầu + Điều kiện cần đảm bảo: ○ Thiết kế tốt ○ Tuân theo tiêu chuẩn: begin, end, start, var v.v + Xây dựng CCD kỹ thuật - Thiết kế viết chương trình dịch + Phân tích từ vựng: đọc văn tìm từ tố + Phân tích cú pháp: đọc từ tố phân tích cú pháp + Phân tích ngữ nghĩa: dựa vào luật xây dựng câu + Sinh mã trung gian: chuyển từ cú pháp sang MTG + Sinh mã: chương trình MTG → mã máy + Quản lý bảng ký hiệu + Xử lý lỗi + Xây dựng môi trường phát triển CCD: gắn liền với hệ thống cụ thể (ví dụ Turbo pascal gắn với cơng cụ soạn thảo chương trình) + Kiểm tra bảo trì 4.Vai trị phân tích từ vựng - Phân tích từ vựng (lexical analysis) bước trình dịch + Cịn gọi scanning lexing, phân tích từ vựng scanner lexer - Khối phân tích từ vựng (PTTV): + Nhận liệu đầu vào mã nguồn cần dịch + Loại bỏ đoạn mã không cần thiết + Chia đoạn mã lại thành dãy từ tố (token) + Chuyển kết cho khối phân tích cú pháp - Có nhiều quan điểm tương tác PTTV phân tích cú pháp + Thiết kế cổ điển: coi PTTV tiến trình song song phụ thuộc vào phân tích cú pháp, q trình phân tích cú pháp điều khiển việc phân tích từ vựng + Thiết kế đại: tách PTTV thành module độc lập, kết đầu PTTV tiêu chuẩn hóa để ghi file sử dụng mục đích khác - Chú ý: việc chọn cách thiết kế mục tiêu xây dựng chương trình, khơng có nghĩa thiết kế đại tốt thiết kế cổ điển - Trong thiết kế cổ điển, PTTV đóng vai trò cung cấp liệu cho phân tích cú pháp + Bộ phân tích cú pháp yêu cầu PTTV lấy từ tố + Bộ PTTV đọc chương trình nguồn từ đầu từ vị trí phân tích lần gọi trước,tách lấy từ tố trả lại cho phân tích cú pháp + Quá trình lặp lại hết mã nguồn gặp lỗi - Trong thiết kế hơn, PTTV có xu hướng đứng tách độc lập, việc có nhiều lợi ích: + Thiết kế theo hướng module hóa, đơn giản + Tăng hiệu hoạt động PTTV, chẳng hạn PTTV độc lập xử lý macro, xử lý khoảng trắng, ghi chú, + Tối ưu hoạt động trình dịch, PTTV sau hoạt động giải phóng tài nguyên mà sử dụng thay giữ lại lúc với phân tích cú pháp + Xử lý số lỗi từ vựng mà không cần phân tích cú pháp 5.Nhiệm vụ phân tích từ vựng - PTTV đóng vai trị chuẩn hóa liệu đầu vào, ngồi giúp hạn chế lỗi (viết sai luật, sai từ khóa, sai cấu trúc, ) - Các nhiệm vụ (nhất thiết phải có để đảm bảo hoạt động chương trình dịch): + Đọc chương trình nguồn, loại bỏ ký hiệu vơ ích (khoảng trắng, dấu tab, xuống dòng, ghi chú, ) + Phát số lỗi từ vựng + Xác định nội dung từ vựng + Xác định từ loại từ vựng + Đưa số thơng tin thuộc tính từ vựng 6.Các bước để phân tích từ vựng - Đầu vào PTTV: Trong trường hợp tổng quát nhất, đầu vào PTTV mã nguồn cần phân tích, khơng có ràng buộc - Đầu PTTV phụ thuộc vào đặc điểm ngôn ngữ nguồn phân tích cú pháp + Trong hầu hết tình huống, PTTV thường trả kết dạng sau: + Danh sách từ vựng ứng theo mã nguồn (thường danh sách liên kết, chẳng hạn – List) ● Với từ vựng, thông tin bao gồm: ● Từ loại từ vựng ● Giá trị xác từ vựng ● Giá trị mã hóa từ vựng ● Vị trí từ vựng mã nguồn - Các bước thực + Xóa bỏ ký tự khơng có nghĩa: thích, dịng trống, ký tự xuống dịng, dấu tab, khoảng trắng khơng cần thiết + Nhận dạng ký hiệu: kí tự liền tạo thành kí hiệu Các dạng kí hiệu gọi từ tố + Số hố ký hiệu - Ví dụ: + Đầu vào: position := initial + rate * 60 + Đầu ra: Tên phép_gán tên tốn_tử_cộng tên tốn_tử_nhân số chấm_phẩy - Ví dụ: Từ tố (token) Từ vị Mẫu (luật mô tả) const const const if if if quan hệ = = tên pi, count, i, d2 Chữ theo sau chữ số số 3.14, 0, 6.02E23 Bất số xâu “Xin chao cac ban” Bất chữ đặt dấu ", trừ dấu " - Thuộc tính từ tố + Một từ tố ứng với tập từ vị khác nhau, phải thêm số thông tin để cần biết cụ thể từ vị - Ví dụ: + Cho biểu thức: position := initial + rate * 60; + Dãy từ tố nhận bao gồm: 7.Xác định từ tố - Biểu diễn từ tố + Các từ tố khác có luật mơ tả (mẫu) khác Các luật mô tả sở để nhận dạng từ tố + Cách biểu diễn luật đơn giản thông dụng lời Nhược: nhập nhằng + Biểu diễn tốt nhất: dùng biểu thức quy otomat hữu hạn - lớp ngơn ngữ quy a Biểu thức quy - Biểu diễn khái niệm chữ cái, chữ số, tên, phép quan hệ Slang sau: chữ → A | B | | Z | a | b | | z chữ số → | | | tên → chữ ( chữ | chữ số )* quan hệ → < | | >= - Các quy ước bổ sung: + lặp lại nhiều lần ? lặp lại không lần b Đồ thị chuyển Ví dụ: Biểu diễn tên Ví dụ: Đồ thị kết hợp c Viết chương trình cho đồ thị chuyển - Tập hợp tất mẫu từ tố - Lập phân tích từ vựng phương pháp diễn giải đồ thị chuyển - Lập phân tích từ vựng điều khiển bảng (mô otomat hữu hạn đơn định) d Tập hợp tất mẫu từ tố - Ví dụ: số thực mũ → chữ số+ ( chữ số+ ) ? ( E ( + | - ) ? chữ số+) ? số thực → chữ số+ chữ số+ số nguyên → chữ số+ e Lập phân tích từ vựng phương pháp diễn giải đồ thị chuyển - Lần theo sơ đồ, dùng câu lệnh lựa chọn if switch - Ưu điểm: dễ hiểu, dễ viết - Nhược điểm: gắn kết cấu đồ thị chuyển vào chương trình Khi thay đổi đồ thị phải viết lại chương trình nên khó bảo trì - Kết hợp đồ thị chuyển thành đồ thị chuyển - Kết hợp đồ thị chuyển thành đồ thị chuyển - Đồ thị chuyển + 24 trạng thái + Các ký tự vào từ chương trình nguồn chia thành loại: chữ cái, chữ số, E, , ,+/- (tức có loại khác nhau) + Lập bảng 10 x f Viết chương trình - Dựa vào bảng chuyển để chuyển trạng thái - Ưu điểm: tách liệu độc lập với chương trình, dễ biến đổi mà khơng cần phải sửa lại chương trình - Nhược điểm: khó hiểu khó lập bảng g Cách xử lý lỗi - Đơn giản nhất: hệ thống ngừng hoạt động báo lỗi cho người sử dụng - Tốt hiệu hơn: ghi lỗi cố gắng bỏ qua chúng để tiếp tục làm việc, nhằm phát đồng thời thêm nhiều lỗi khác - Các cách khắc phục có: + Xóa nhảy qua kí tự mà phân tích khơng tìm từ tố; + Thêm ký tự bị thiếu; + Thay ký tự sai ký tự đúng; + Tráo hai ký tự đứng cạnh 8.Các bước để xây dựng PTTV - Sưu tầm tất luật từ vựng, luật thường mô tả lời - Vẽ đồ thị chuyển cho luật Trước mơ tả chúng biểu thức quy để tiện theo dõi chỉnh sửa, làm dễ cho việc dựng đồ thị - Kết hợp luật thành đồ thị chuyển - Chuyển đồ thị thành bảng - Thêm phần chương trình để thành phân tích hoạt động - Thêm phần báo lỗi để thành phân tích từ vựng hồn chỉnh 9.Demo chương trình a Ngơn ngữ SLANG - Ngơn ngữ lập trình Slang tương tự mặt cú pháp với Java tương tự mặt chức với C (do tiếng lóng) Ngược lại với Java, cung cấp tính nâng cao nạp chồng tốn tử RAII (cả hai biết đến từ C) phụ thuộc nhiều vào tính số - SLANG gồm từ loại sau: ident_token – tên (bắt đầu chữ dấu gạch dưới,theo sau chữ cái, chữ số dấu gạch dưới) num_token – số nguyên comment_token comment */) – thích (chú thích kiểu C – cặp /* begin_token – từ khóa begin end_token – từ khóa end int_token – từ khóa kiểu int var_token – từ khóa var (khai báo biến) procedure_token – từ khóa procedure (khai báo thủ tục) call_token – từ khóa call (gọi thủ tục) read_token – từ khóa read (đọc từ bàn phím) write_token – từ khóa write (viết hình) if_token – từ khóa if then_token – từ khóa then else_token – từ khóa else fi_token – từ khóa fi (kết thúc if) while_token – từ khóa while do_token – từ khóa od_token – từ khóa od (kết thúc do) negate_token – toán tử neg absolute_token – toán tử abs open_token – dấu mở ngoặc close_token – dấu đóng ngoặc list_token – dấu phẩy period_token – dấu chấm separator_token – dấu chấm phẩy becomes_token – dấu gán (=) plus_token – dấu cộng (+) minus_token – dấu trừ (-) times_token – dấu nhân (*) over_token – dấu chia (/) modulo_token – dấu lấy phần dư (%) equal_token – dấu (==) not_equal_token – dấu khác (!=) less_than_token – dấu nhỏ (=) err_token – lỗi từ vựng - Lưu ý: SLANG phân biệt chữ hoa chữ thường b Kết