Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
474,79 KB
Nội dung
Nghiên cứu tổng quan chương trình dịch Trần Thị Hoa Trường Đại học Khoa học Tự nhiên Khoa Toán – Cơ – Tin học Luận văn ThS ngành: Đảm bảo toán học cho máy tính hệ thống tính toán Mã số: 60 46 35 Người hướng dẫn: TS Nguyễn Thị Minh Huyền Năm bảo vệ: 2012 Abstract Chương 1: Giới thiệu chương trình dịch Chương 2: Phân tích từ vựng, cú pháp ngữ nghĩa (ngôn ngữ văn phạm hình thức; phân tích từ vựng; phân tích cú pháp; phân tích ngữ nghĩa) Chương 3: Các công cụ hỗ trợ xây dựng chương trình dịch (bộ sinh trình phân tích từ vựng FLEX, sinh trình phân tích cú pháp BISON) Chương 4: Xây dựng chương trình dịch cho ngôn ngữ Minipas Keywords Ngôn ngữ lập trình; Ngôn ngữ máy tính; Chương trình dịch; Toán tin; Hệ thống tính toán Content MỞ ĐẦU Từ ngàn xưa người muốn giao tiếp với phải dùng ngôn ngữ, người giao tiếp với máy tính tất nhiên phải thông qua ngôn ngữ Con người muốn máy tính thực công việc, phải viết yêu cầu đưa cho máy ngôn ngữ máy hiểu Việc viết yêu cầu gọi lập trình Ngôn ngữ dùng để lập trình gọi ngôn ngữ lập trình Việc viết chương trình dễ dàng tự nhiên ngôn ngữ lập trình gần với cách diễn đạt vấn đề cần giải Có nghĩa là, ngôn ngữ phải chứa đựng cấu trúc thuật ngữ - phần tử dùng để miêu tả vấn đề, không phụ thuộc vào máy tính cụ thể Những ngôn ngữ lập trình có tính chất gọi ngôn ngữ bậc cao Việc phân cấp ngôn ngữ lập trình dựa sở tính độc lập với máy tính ngày cao ngôn ngữ, bao gồm: – Ngôn ngữ máy (machine language) – Hợp ngữ (assembly language) – Ngôn ngữ bậc cao (high level language) Để giải vấn đề tin học, lập trình viên phải tạo chương trình nguồn ngôn ngữ bậc cao – ngôn ngữ gần với ngôn ngữ nói Nhưng máy tính hiểu, chấp nhận ngôn ngữ bậc thấp, riêng mình, chuỗi số 1, nhiên chuỗi số lại không gần gũi với người chút Bởi máy tính hiểu ngôn ngữ máy chương trình viết ngôn ngữ bậc cao cuối dịch sang ngôn ngữ máy Do cần phải có công cụ để thực việc chuyển đổi này, công cụ gọi chương trình dịch Để đáp ứng nhu cầu phần mềm ngày gia tăng số lượng chất lượng, thiết kế ngôn ngữ lập trình có nhiều thay đổi dẫn đến ngôn ngữ lập trình trở nên phức tạp Vì việc thiết kế chương trình dịch tiếp tục thay đổi Thiết kế cài đặt chương trình dịch chủ đề nghiên cứu phát triển thiết thực Do mục tiêu đề tài tìm hiểu bước để thiết kế chương trình dịch xây dựng chương trình dịch cho ngôn ngữ cụ thể tự định nghĩa Việc xây dựng thành công chương trình dịch hoàn chỉnh phức tạp, tốn nhiều thời gian cần nhiều kiến thức Luận văn trình bày thành bốn chương: + Chương I: Giới thiệu chương trình dịch + Chương II: Phân tích từ vựng, cú pháp phân tích ngữ nghĩa + Chương III: Các công cụ hỗ trợ xây dựng chương trình dịch +Chương IV: Xây dựng chương trình dịch cho ngôn ngữ Minipas.Trong trình nghiên cứu tác giả khó tránh khỏi sai sót, mong nhận nhiều ý kiến đóng góp từ thầy giáo, cô giáo bạn đọc để luận văn hoàn thiện Chƣơng - GIỚI THIỆU VỀ CHƢƠNG TRÌNH DỊCH Chương trình bày kiến thức tổng quan chương trình dịch, trích từ tài liệu tham khảo [2, 4, 5] 1.1 Chương trình dịch Chương trình dịch, gọi phần mềm biên dịch, chương trình máy tính làm công việc dịch chuỗi câu lệnh viết ngôn ngữ lập trình (ngôn ngữ nguồn hay mã nguồn), thành chương trình tương đương dạng ngôn ngữ (gọi ngôn ngữ đích hay mã đích) thường ngôn ngữ cấp thấp hơn, ngôn ngữ máy 1.2 Các bước thiết kế chương trình dịch Chương trình nguồn ngôn ngữ lập trình chuỗi ký tự Chương trình dịch có nhiệm vụ chuyển chuỗi ký tự sang chuỗi ký tự khác Quá trình bao gồm trình nhỏ đặt tên sau: 1.2.1 Phân tích từ vựng Là công việc đọc chương trình nguồn từ trái sang phải (hay gọi trình quét nguyên liệu) để tách thành thẻ từ (token) Nói cách khác, trình phân tích từ vựng trình dịch mà đầu nhập chuỗi ký tự, tượng trưng cho chương trình nguồn, đầu token Dạng đầu lại đầu nhập trình phân tích cú pháp sau 1.2.2 Tổ chức bảng ký hiệu Bảng ký hiệu cấu trúc liệu mà phần tử mẫu tin dùng để lưu trữ token phân tích từ vựng nhận biết thông tin token đó, bao gồm trường lưu giữ ký hiệu thuộc tính Cấu trúc cho phép tìm nhanh chóng mẫu tin token lưu trữ truy xuất token cách nhanh chóng 1.2.3 Phân tích cú pháp Các token xuất từ trình phân tích từ vựng có dạng (loại token, thuộc tính), chuỗi nhập vào phân tích cú pháp Trong trình phân tích cú pháp, token kiểm tra xem biểu diễn cấu trúc cú pháp ngôn ngữ lập trình cho trước hay không? 1.2.4 Phân tích ngữ nghĩa Bộ phân tích ngữ nghĩa kiểm tra lỗi ngữ nghĩa chương trình nguồn thu nhận thông tin kiểu cho giai đoạn sau Giai đoạn sử dụng cú pháp xác định giai đoạn phân tích cú pháp với nút cú pháp kết hợp với tập thuộc tính để xác định toán tử toán hạng biểu thức câu lệnh 1.2.5 Sinh mã trung gian Sau giai đoạn phân tích cú pháp phân tích ngữ nghĩa, số chương trình dịch tạo dạng biểu diễn trung gian chương trình nguồn 1.2.6 Tối ưu mã Giai đoạn tối ưu mã cố gắng cải thiện mã trung gian cách thu giảm số bước mã trung gian để có mã máy thực nhanh 1.2.7 Sinh mã đích Giai đoạn cuối chương trình dịch sinh mã đích Mã đích mã máy hay 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 1.2.8 Phát thông báo lỗi Mỗi giai đoạn trình dịch gặp lỗi Tuy nhiên sau phát lỗi, giai đoạn phải có cách xử lý lỗi để tiếp tục dịch chương trình, cho phép phát thêm nhiều lỗi khác chương trình nguồn Một chương trình dịch phải dừng lại phát lỗi không cho hữu ích Chƣơng - PHÂN TÍCH TỪ VỰNG , CÚ PHÁP VÀ NGỮ NGHĨA Như Chương trình bày, trình xây dựng chương trình dịch gồm tám bước Trong chương đề cập chuyên sâu bước phân tích từ vựng, phân tích cú pháp phân tích ngữ nghĩa Trước vào tìm hiểu ba bước nhắc lại kiến thức ngôn ngữ văn phạm tham khảo từ [1] 2.1 Ngôn ngữ văn phạm hình thức 2.1.1 Bảng chữ Là tập hữu hạn ký hiệu, tập thường ký hiệu 2.1.2 Chuỗi (từ) Cho bảng chữ cái, chuỗi (hay từ) w dãy hữu hạn ký hiệu thuộc xếp liền kề Độ dài chuỗi w số ký hiệu hợp thành w ký hiệu w Chuỗi rỗng ký hiệu , chuỗi có độ dài không Tập tất chuỗi kể chuỗi rỗng ký hiệu * Tập tất chuỗi không kể chuỗi rỗng ký hiệu 2.1.3 Ngôn ngữ Ta gọi ngôn ngữ tập hợp chuỗi bảng chữ Chẳng hạn ngôn ngữ chữ Tập tất chuỗi bảng chữ ký hiệu * ngôn ngữ Mỗi ngôn ngữ bảng chữ tập * 2.1.4 Văn phạm hình thức Định nghĩa văn phạm: Một văn phạm G ( N , , P, S ) bốn, đó: • N : tập hữu hạn ký hiệu chưa kết thúc hay biến, • : tập hữu hạn ký hiệu kết thúc, • P : tập luật sinh văn phạm, • S N : ký hiệu bắt đầu văn phạm Ngôn ngữ sinh văn phạm: Với văn phạm G có ký hiệu bắt đầu S Ta dùng quan hệ để định nghĩa L(G) ngôn ngữ sinh G Chuỗi L(G) chứa ký hiệu kết thúc G Chuỗi ký hiệu kết thúc w thuộc L(G) S * w , chuỗi w gọi câu G 2.1.5 Phân loại văn phạm Dựa vào dạng luật sinh P để chia thành lớp văn phạm sau: Văn phạm quy Văn phạm phi ngữ cảnh Văn phạm cảm ngữ cảnh Văn phạm tổng quát Trong luận văn, đề cập đến hai lớp văn phạm văn phạm quy sử dụng bước phân tích từ vựng văn phạm phi ngữ cảnh sử dụng bước phân tích cú pháp 2.1.5.1 Văn phạm quy Một văn phạm G ( N , , P, S ) gọi tuyến tính phải tất luật sinh có dạng: X xB X x , đó: X , B N x * Một văn phạm G ( N , , P, S ) gọi tuyến tính trái tất luật sinh có dạng: X Bx X x , đó: X , B N x * Một văn phạm gọi văn phạm quy văn phạm tuyến tính trái tuyến tính phải 2.1.5.2 Văn phạm phi ngữ cảnh Văn phạm G ( N , , P, S ) gọi văn phạm phi ngữ cảnh tất luật sinh tập P có dạng: A x , A N x ( N )* 2.2 Phân tích từ vựng 2.2.1 Vai trò phân tích từ vựng Phân tích từ vựng giai đoạn chương trình dịch Nhiệm vụ chủ yếu đọc chuỗi ký tự nhập vào nhóm ký tự thành thẻ từ hay gọi token 2.3 Phân tích cú pháp 2.3.1 Vai trò phân tích cú pháp Bộ phân tích cú pháp nhận chuỗi token xuất từ phân tích từ vựng xác nhận chuỗi sinh từ văn phạm ngôn ngữ nguồn hay không cách tạo cú pháp cho chuỗi Mỗi ngôn ngữ lập trình có quy tắc diễn tả cấu trúc cú pháp chương trình định dạng Các cấu trúc cú pháp mô tả văn phạm phi ngữ cảnh Các chiến lƣợc phân tích cú pháp Có hai chiến lược để thực việc phân tích cú pháp: Chiến lược phân tích cú pháp từ xuống (top – down), Chiến lược phân tích cú pháp từ lên (bottom – up) 2.3.1.1 Chiến lƣợc phân tích từ xuống Cho văn phạm phi ngữ cảnh G ( N , , P, S ) câu cần phân tích w Ta xuất phát từ điểm khởi đầu, nghĩa từ S , áp dụng suy dẫn trái, tiến từ trái qua phải thử tạo câu đưa vào phân tích w Một số thuật toán sử dụng chiến lược phân tích từ xuống thuật toán phân tích cú pháp Earley1 2.3.1.1.1 Giới thiệu thuật toán Earley Earley thuật toán thuộc loại phân tích cú pháp từ xuống xây dựng dẫn xuất trái chuỗi ký tự nhập Khi sử dụng thuật toán Earley đưa văn phạm dạng chuẩn 2.3.1.1.2 Thuật toán phân tích cú pháp Earley Input: Văn phạm phi ngữ cảnh G ( N , , P, S ) , chuỗi w a1a2 an thuộc * Output: Danh sách tập Earley: I , I1 , , I n Thuật toán: Đầu tiên xây dựng tập I sau: (1) Nếu S luật sinh P ta cho S ,0 vào I , sau thực bước (2) (3) thêm mục vào I http://en.wikipedia.org/wiki/Earley_parser (2) Nếu B ,0 thuộc I (chú ý: ) đưa vào tập I mục A B ,0 cho tất mục có dạng A B ,0 có I0 (3) Nếu A B ,0 mục tập I ta đưa vào I mục B ,0 cho tất luật sinh có dạng B P Bây xây dựng tập I j sau có tập I , I1 , , I j 1 (4) Bước quét (Scan): Với mục I j 1 có dạng B a , i (với a a j ) cho mục B a , i vào I j Thực bước (5) (6) không mục thêm vào (5) Bước hoàn thành (Complete): Nếu A , i mục I j , kiểm tra xem tập I i mục có dạng B A , k , với mục tìm ta cho vào I j mục B A , k (6) Bước dự báo (Predict): Nếu A B , i mục I j , tìm P tất luật sinh có dạng B ta thêm mục B , j vào I j Kết thúc thuật toán j n 2.3.1.1.3 Độ phức tạp thời gian theo chiều dài chuỗi nhập Thuật toán có độ phức tạp 0( n ) 2.3.1.2 Chiến lƣợc phân tích dƣới lên Quá trình ngược lại với phân tích từ xuống, xuất phát từ câu cần phân tích w , cách áp dụng thu gọn suy dẫn phải, tiến hành từ trái qua phải để tới ký hiệu đầu văn phạm Một số thuật toán sử dụng chiến lược phân tích từ xuống thuật toán phân tích cú pháp CYK2 Đây thuật toán phân tích cú pháp văn phạm phi ngữ cảnh tổng quát Thuật toán mang tên ba người tìm nó, J Cocke, D H Younger T Kasami 2.3.1.2.1 Ý tƣởng thuật toán Ý tưởng thuật toán sau: Giả sử có văn phạm phi ngữ cảnh G ( N , , P, S ) dạng chuẩn Chomsky3 chuỗi nhập w a1a2 an http://en.wikipedia.org/wiki/CYK_algorithm Thuật toán CYK xây dựng bảng phân tích cú pháp ij (có hình tam giác), phần tử ij với i n j n i có giá trị tập N Một kí hiệu không kết thúc A thuộc ij A * ai 1 j 1 Chuỗi nhập w thuộc ngôn ngữ L(G) S t1n 2.3.1.2.2 Thuật toán phân tích cú pháp CYK Thuật toán CYK (1) FOR i : TO n DO (2) i1 := { A | A a luật sinh a ký hiệu thứ i x } (3) FOR j : TO n DO (4) FOR i : TO n j DO (5) (6) (7) BEGIN ij = FOR k : TO j DO ij := ij { A | A BC luật sinh, B ik C i k , j k } END 2.4 Phân tích ngữ nghĩa Khi viết chương trình ngôn ngữ lập trình đó, việc quan tâm đến cấu trúc cú pháp chương trình, ta phải ý đến ý nghĩa chương trình Tức chương trình dịch phải kiểm tra ngữ nghĩa hay xử lý ngữ nghĩa chương trình nguồn Để biểu diễn ngữ nghĩa, ta bổ sung thông tin ngữ nghĩa trực tiếp vào văn phạm biểu diễn lược đồ dịch 2.4.1 Định nghĩa ngữ nghĩa trực tiếp văn phạm Để bổ sung ngữ nghĩa vào văn phạm ta dùng văn phạm phi ngữ cảnh, ký hiệu văn phạm kết hợp với tập thuộc tính Mỗi luật sinh kết hợp với tập luật ngữ nghĩa Việc đánh giá luật ngữ nghĩa sử dụng để thực công việc tạo mã trung gian, lưu thông tin vào bảng ký hiệu, xuất thông báo lỗi Thuộc tính văn phạm phần liệu liên kết với ký hiệu kết thúc ký hiệu không kết thúc Thuộc tính lưu thông tin số, chuỗi, trỏ, cấu trúc người dùng tự định nghĩa 2.4.2 Lƣợc đồ dịch Là văn phạm phi ngữ cảnh thuộc tính kết hợp với ký hiệu văn phạm hành vi ngữ nghĩa nằm cặp dấu { } chèn vào bên phải luật sinh Chƣơng - CÁC CÔNG CỤ HỖ TRỢ XÂY DỰNG CHƢƠNG TRÌNH DỊCH 3.1 Giới thiệu Trên thực tế, có nhiều công cụ có khả sinh phân tích từ vựng phân tích cú pháp Một cổ điển lex yacc – phát minh Bell Lab thập niên 1970 Yacc [6] (Yet Another Compiler Compiler) – công trình Stephen C Johnson đời sớm hơn, có nhiệm vụ sinh trình phân tích cú pháp Trong Mike Lesk Eric Schmidt thiết kế phát triển Lex [6]– sinh trình phân tích từ vựng – để hỗ trợ yacc việc xác định token từ chuỗi nhập Flex4 Bison5 phiên cải tiến lex yacc, có khả phân tích văn phạm rộng hơn, quản lý nhớ tốt sử dụng nhiều tảng 3.2 Bộ sinh trình phân tích từ vựng Flex 3.2.1 Cấu trúc Flex nhận đầu vào tệp bao gồm đặc tả token Cấu trúc chương trình viết ngôn ngữ Flex gồm ba phần: Phần khai báo %% Phần quy tắc dịch %% Các hàm hỗ trợ 3.2.2 Quy trình vận hành Việc tạo phân tích từ vựng thực ba bước Bước đầu tạo chương trình flex.l ngôn ngữ Flex Sau chương trình flex.l chương trình dịch Flex xử lý tạo sản phẩm đầu flex-yy.c, xây dựng từ biểu thức quy flex.l thủ tục chuẩn Flex dùng bảng để nhận dạng trị từ vựng Các hành vi có liên quan đến biểu thức quy flex.l chương trình ngôn ngữ C chúng chuyển thẳng sang chương trình flex-yy.c Cuối lex-yy.c chương trình dịch C dịch sinh chương trình đối tượng a.out Nó phân tích từ vựng, có khả chuyển dòng nhập thành token ngôn ngữ, xác định biểu thức quy, đặc tả ngôn ngữ Flex http://flex.sourceforge.net http://gnuwin32.sourceforge.net/packages/bison.htm 3.3 Bộ sinh trình phân tích cú pháp Bison 3.3.1 Cấu trúc Tương tự Flex, Bison nhận đầu vào tệp bao gồm đặc tả ngôn ngữ Từ đó, Bison biên dịch phân tích cú pháp mã C để chạy với chương trình Cấu trúc tệp đặc tả ngôn ngữ gồm ba phần: Phần khai báo %% Phần luật dịch %% Các thủ tục 3.3.2 Quy trình vận hành Một chương trình dịch xây dựng nhờ Bison phương thức minh họa hình 3.2 Trước tiên, cần chuẩn bị tập tin, chẳng hạn translate.y, chứa đặc tả Bison chương trình dịch Lệnh bison translate.y biến đổi tập tin translate.y thành chương trình C có tên y.tab.C Bằng cách dịch y.tab.C với thư viện ly nhờ lệnh cc y.tab.C - ly thu chương trình đối tượng a.out thực trình dịch đặc tả chương trình Bison ban đầu Nếu cần thêm thủ tục khác, chúng biên dịch tải vào y.tab.C giống chương trình C khác Chƣơng - XÂY DỰNG CHƢƠNG TRÌNH DỊCH CHO NGÔN NGỮ MINIPAS Trong chương này, luận văn định nghĩa ngôn ngữ tựa Pascal có tên gọi Minipas sau sử dụng công cụ giới thiệu chương ba để xây dựng phân tích từ vựng phân tích cú pháp cho ngôn ngữ Minipas 4.1 Yêu cầu Minipas xây dựng dựa ngôn ngữ Pascal Mặc dù đơn giản Pascal nhiều Minipas đáp ứng yêu cầu sau: - Đơn giản, gọn nhẹ, dễ học - Đủ dùng để diễn tả số thuật toán đơn giản cho người làm quen với ngôn ngữ lập trình 4.2 Ngôn ngữ Minipas 4.2.1 Giới thiệu sơ lƣợc Ngôn ngữ xây dựng đặt tên Minipas có số đặc điểm: - Có năm kiểu liệu đơn giản: nguyên (integer), thực (double), logic (bool), kí tự (char), chuỗi ký tự (string) Hỗ trợ phép toán số học - logic ba kiểu Kiểu char hỗ trợ phép gán so sánh - Có kiểu cấu trúc kiểu mảng chiều với số nguyên, kiểu phần tử kiểu đơn giản - Có ba cấu trúc điều khiển: tuần tự, rẽ nhánh (if… then… else) vòng lặp (for…to…do, while do) - Có kiểu chương trình hàm Chương trình có tối đa ba tham số - Có hai lệnh nhập liệu từ bàn phím xuất liệu hình - Cho phép hai dạng thích: thích khối thích dòng - Ngôn ngữ Minipas có phân biệt chữ hoa chữ thường Ngôn ngữ Minipas tương đối đủ cho người bắt đầu làm quen với việc học lập trình Một số chi tiết phức tạp ngôn ngữ Pascal (con trỏ, kiểu liệu cấu trúc, unit, đồ hoạ, tham biến ) lược bỏ giúp Minipas đơn giản 4.3 Xây dựng chƣơng trình dịch cho Minipas 4.3.1 Xây dựng trình phân tích từ vựng cho Minipas Bảng sau liệt kê danh sách token ngôn ngữ Minipas biểu thức quy xác định token đó: Token Biểu thức quy CHAR \'.\' STRING \".*\" DIGIT [0-9]+|\-[0-9]+ DOUBLE [0-9]+\.[0-9]*|\-[0-9]+\.[0-9]* BOOLEAN true | false IDENTIFIER [a-zA-Z_][a-zA-Z0-9_]* BEGIN Begin END End LET Var CONST Const READ Read WRITE Write WRITELINE Writeline IF If THEN Then ELSE Else FOR For TO To DO Do ENDFOR Endfor WHILE while ENDWHILE Endwhile NUMBER_VAL {DIGIT} NUMBERD_VAL {DOUBLE} CHR_VAL {CHAR} STR_VAL {STRING} FUNCTION Function RETURN Return ENDFUNCTION endfunction WAIT wait 10 ARRAY_I ARRAY_B ARRAY_C ARRAY_D ARRAY_S ASSGNOP comment comment whitespace "array integer" "array bol" "array char" "array double" "array string" ":=" "//" "/*" [ \t\n]+ Bảng 4.1 Biểu thức quy đặc tả token 4.3.2 Xây dựng trình phân tích cú pháp cho Minipas Văn phạm phi ngữ cảnh sinh ngôn ngữ Minipas: // Luật sinh sinh chƣơng trình program var declarations constant const_declarations func_decls BEGIN commands END ‘.’ // Các luật sinh khai báo identifier var | LET declarations | declarations declaration declaration INTEGER id_seq_int IDENTIFIER ‘;’ | CHAR id_seq_chr IDENTIFIER ‘;’ | DOUBLE id_seq_dou IDENTIFIER ‘;’ | STRING id_seq_str IDENTIFIER ‘;’ | BOOLEAN id_seq_bol IDENTIFIER ‘;’ | ARRAY_I IDENTIFIER '[' NUMBER_VAL ']'‘;’ | ARRAY_D IDENTIFIER '[' NUMBER_VAL ']'‘;’ | ARRAY_C IDENTIFIER '[' NUMBER_VAL ']'‘;’ | ARRAY_B IDENTIFIER '[' NUMBER_VAL ']'‘;’ id_seq_int | id_seq_int IDENTIFIER‘,’ id_seq_chr | id_seq_chr IDENTIFIER‘,’ id_seq_dou | id_seq_dou IDENTIFIER’,’ id_seq_bol | id_seq_bol IDENTIFIER‘,’ id_seq_str | id_seq_str IDENTIFIER‘,’ // Các luật sinh khai báo constant | CONST const_declarations | const_declarations const_declaration const_declaration INTEGER IDENTIFIER ASSGNOP NUMBER_VAL‘;’ | CHAR IDENTIFIER ASSGNOP CHR_VAL ‘;’ 11 | DOUBLE IDENTIFIER ASSGNOP NUMBERD_VAL ‘;’ | STRING IDENTIFIER ASSGNOP STR_VAL ‘;’ | BOOLEAN IDENTIFIER ASSGNOP NUMBERB_VAL‘;’ // Các luật sinh khai báo hàm func_decls | func_decl func_decl FUNCTION IDENTIFIER '(' func_var_decls ')' var func_declarations IN commands ENDFUNCTION ‘;’ func_var_decls | func_var_decls func_var_decl func_var_decl var_seq INTEGER IDENTIFIER | var_seq CHAR IDENTIFIER | var_seq DOUBLE IDENTIFIER | var_seq TRING IDENTIFIER | var_seq BOOLEAN IDENTIFIER var_seq | var_seq INTEGER IDENTIFIER ‘,’ | var_seq CHAR IDENTIFIER ‘,’ | var_seq DOUBLE IDENTIFIER ‘,’ | var_seq STRING IDENTIFIER ‘,’ | var_seq BOOLEAN IDENTIFIER ‘,’ func_declarations | func_declarations func_declaration func_declaration INTEGER fun_id_seq_int IDENTIFIER ‘;’ | CHAR fun_id_seq_chr IDENTIFIER ‘;’ | DOUBLE fun_id_seq_dou IDENTIFIER ‘;’ | STRING fun_id_seq_str IDENTIFIER ‘;’ | BOOLEAN fun_id_seq_bol IDENTIFIER ‘;’ | ARRAY_I IDENTIFIER '[' NUMBER_VAL ']' ‘;’ | ARRAY_D IDENTIFIER '[' NUMBER_VAL ']' ‘;’ | ARRAY_C IDENTIFIER '[' NUMBER_VAL ']' ‘;’ | ARRAY_B IDENTIFIER '[' NUMBER_VAL ']' ‘;’ fun_id_seq_int | fun_id_seq_int IDENTIFIER ‘,’ fun_id_seq_chr | fun_id_seq_chr IDENTIFIER ‘,’ fun_id_seq_dou | fun_id_seq_dou IDENTIFIER ‘,’ fun_id_seq_str | fun_id_seq_str IDENTIFIER ‘,’ fun_id_seq_bol | fun_id_seq_bol IDENTIFIER ‘,’ // Các luật sinh câu lệnh commands | commands command ‘;’ command READ IDENTIFIER read_exp | READ IDENTIFIER '[' index ']' read_array_exp | WRITE IDENTIFIER | WRITE STR_VAL | WRITE exp 12 | WRITELINE | RETURN exp | IDENTIFIER ASSGNOP exp | IDENTIFIER '[' index ']' ASSGNOP exp | WAIT | IF exp THEN commands else_exp ENDIF | WHILE exp DO commands ENDWHILE |FOR IDENTIFIER ASSGNOP exp TO exp DO commands ENDFOR read_exp | read_exp ‘,’ IDENTIFIER read_array_exp | read_array_exp ‘,’ IDENTIFIER else_exp | ELSE commands // Luật sinh biểu thức exp NUMBER_VAL | NUMBERD_VAL | STR_VAL | CHR_VAL | NUMBERB_VAL | IDENTIFIER | IDENTIFIER '(' values ')' | exp '''=' exp | exp '' exp | exp '+' exp | exp '-' exp | exp '*' exp | exp '/' exp | exp '&' exp | exp '|' exp | exp '%' exp | '!' exp | arr_exp | '(' exp ')' arr_exp IDENTIFIER '[' index ']' values | exp value_seq value_seq | value_seq ',' exp index NUMBER_VAL | IDENTIFIER 4.3.3 Xử lý ngữ nghĩa cho ngôn ngữ Minipas Khi phân tích cú pháp nhận dạng luật sinh (khai báo, biểu thức, câu lệnh ) gọi đến chương trình xử lý ngữ nghĩa tương ứng nằm phía bên phải luật sinh KẾT LUẬN Sau trình nghiên cứu, luận văn đạt kết sau: Tìm hiểu tổng quan chương trình dịch gồm bước để thiết kế chương trình dịch Đi sâu vào tìm hiểu ba bước phân tích từ vựng, phân tích cú pháp phân tích ngữ nghĩa Tìm hiểu hai thuật toán để phân tích cú pháp thuật toán Earley thuật toán CYK Tìm hiểu công cụ để xây dựng chương trình dịch công cụ xây dựng trình phân tích từ vựng Flex công cụ xây dựng trình phân tích cú pháp Bison Sử dụng công cụ để viết chương trình dịch mức độ vừa phải cho ngôn ngữ tựa Pascal Minipas Chương trình dịch sử dụng làm công cụ lập trình mức đơn giản cho người làm quen với ngôn ngữ lập trình Hướng phát triển công cụ là: 13 Cải tiến ngôn ngữ: thêm hàm chuẩn xử lí kiểu liệu Thêm phép toán cho kiểu kí tự mảng kí tự Hỗ trợ tham biến cho chương trình Cho phép sử dụng mảng nhiều chiều kiểu liệu tự định nghĩa Tìm hiểu tiếp giai đoạn sau trình thiết kế chương trình dịch tối ưu mã References [1] Nguyễn Văn Ba (2002), Ngôn ngữ hình thức, Nhà xuất Khoa học kỹ thuật [2] Trần Đức Quang (biên dịch, 2000), Trình biên dịch – Nguyên lý, kỹ thuật công cụ Tập 1, Nhà xuất Thống kê [3] Thái Thuần Thạch (2000), Xây dựng công cụ thực số thuật toán lý thuyết ngôn ngữ hình thức automat, Luận văn tốt nghiệp, Đại học Bách khoa Đà Nẵng [4] Phan Thị Tươi (2009), Giáo trình Trình biên dịch, Nhà xuất Đại học Quốc Gia thành phố Hồ Chí Minh [5] Alfred V Aho, Ravi Sethi, Jeffrey D Ullman (2002), Compilers: Principles, Techniques and Tools, Addison – Wesley Publishing Company [6] John R.Levine, Tony Mason & Doug Brown (1992), Lex and Yacc, O’Reilly & Associates, Inc 14 [...]... ) thì nó sẽ gọi đến một chương trình con xử lý ngữ nghĩa tương ứng nằm ở phía bên phải luật sinh đó KẾT LUẬN Sau quá trình nghiên cứu, luận văn đã đạt được những kết quả như sau: Tìm hiểu được tổng quan về chương trình dịch gồm các bước để thiết kế một chương trình dịch Đi sâu vào tìm hiểu ba bước chính là phân tích từ vựng, phân tích cú pháp và phân tích ngữ nghĩa Tìm hiểu về hai thuật toán để phân... toán CYK Tìm hiểu về các công cụ để xây dựng chương trình dịch là công cụ xây dựng trình phân tích từ vựng Flex và công cụ xây dựng trình phân tích cú pháp Bison Sử dụng các công cụ để viết được một chương trình dịch ở mức độ vừa phải cho một ngôn ngữ tựa Pascal là Minipas Chương trình dịch có thể sử dụng làm công cụ lập trình ở mức đơn giản cho người mới làm quen với ngôn ngữ lập trình Hướng phát triển... kiểu kí tự và mảng kí tự Hỗ trợ tham biến cho chương trình con Cho phép sử dụng mảng nhiều chiều và kiểu dữ liệu tự định nghĩa Tìm hiểu tiếp về các giai đoạn sau của quá trình thiết kế chương trình dịch như tối ưu mã References [1] Nguyễn Văn Ba (2002), Ngôn ngữ hình thức, Nhà xuất bản Khoa học và kỹ thuật [2] Trần Đức Quang (biên dịch, 2000), Trình biên dịch – Nguyên lý, kỹ thuật và công cụ Tập 1,... Thuần Thạch (2000), Xây dựng bộ công cụ thực hiện một số thuật toán trong lý thuyết ngôn ngữ hình thức và automat, Luận văn tốt nghiệp, Đại học Bách khoa Đà Nẵng [4] Phan Thị Tươi (2009), Giáo trình Trình biên dịch, Nhà xuất bản Đại học Quốc Gia thành phố Hồ Chí Minh [5] Alfred V Aho, Ravi Sethi, Jeffrey D Ullman (2002), Compilers: Principles, Techniques and Tools, Addison – Wesley Publishing Company... "array integer" "array bol" "array char" "array double" "array string" ":=" "//" "/*" [ \t\n]+ Bảng 4.1 Biểu thức chính quy đặc tả token 4.3.2 Xây dựng trình phân tích cú pháp cho Minipas Văn phạm phi ngữ cảnh sinh ngôn ngữ Minipas: // Luật sinh sinh chƣơng trình program var declarations constant const_declarations func_decls BEGIN commands END ‘.’ // Các luật sinh khai báo identifier var | LET declarations