Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
1,89 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG VIỆT - HÀN BÁO CÁO ĐỒ ÁN CƠ SỞ ĐỀ TÀI: XÂY DỰNG CHƯƠNG TRÌNH TRÌNH BIÊN DỊCH ĐƠN GIẢN Giảng viên hướng dẫn : THS.ĐỖ CÔNG ĐỨC Sinh viên thực : NGUYỄN THỊ MỸ HÀ 18IT1 Đà Nẵng, tháng 05 năm 2020 ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG VIỆT - HÀN BÁO CÁO ĐỒ ÁN CƠ SỞ ĐỀ TÀI: XÂY DỰNG CHƯƠNG TRÌNH TRÌNH BIÊN DỊCH ĐƠN GIẢN Giảng viên hướng dẫn : THS.ĐỖ CÔNG ĐỨC Sinh viên thực : NGUYỄN THỊ MỸ HÀ 18IT1 Đà Nẵng, tháng 05 năm 2020 MỞ ĐẦU Cùng với phát triển không ngừng xã hội công nghiệp 4.0 nhu cầu cho việc phát triển sở hạ tầng vững để phát triển công nghiệp, công nghệ thông tin trở thành phần thiếu sống Tin học công cụ tiếp cận cơng nghệ thơng tin nhanh Để tính tốn, ghi nhớ, điều khiển thiết bị cách xác hiệu nhất, cần phải lập chương trình để sử dụng chúng, việc khiến tốc độ làm việc suất tăng lên nhiều Và dĩ nhiên, muốn lập trình cần có ngơn ngữ lập trình, sơ sở để hình thành nên chương trình, kết nối cần thiết cho với thiết bị điện tử thiết bị với Qua cân nhắc, tìm hiểu ngơn ngữ lập trình có kết hợp với kiến thức học ghế nhà trường mơn Trình biên dịch Em định thực chương trình trình biên dịch đơn giản nhằm cố kiến thức phục vụ việc hoàn thành học phần Đồ án - học kỳ II - năm học 2020-2021 LỜI CẢM ƠN Để hoàn thành tốt đồ án này, em xin gửi lời cảm ơn chân thành đến tất Thầy Cô giáo giảng dạy Trường Đại học Công Nghệ Thông Tin Truyền Thông Việt - Hàn giảng dạy em suốt thời gian qua Đặc biệt, em xin trân trọng cảm ơn bày tỏ lòng biết ơn sâu sắc tới thầy Đỗ Công Đức - người cung cấp cho em kiến thức liên quan tới đồ án trực tiếp hướng dẫn chúng em để hồn thành tốt đồ án Bên cạnh đó, để hoàn thành đồ án này, chúng em xin gửi lời cảm ơn đến gia đình, bạn bè anh chị động viên giúp đỡ chúng em suốt thời gian học tập nghiên cứu, đóng góp kinh nghiệm quý báu thời gian thực đề tài Tuy nhiên, kiến thức hiểu biết đồ án chưa thật đầy đủ nên dù nỗ lực mình, đồ án khó tránh khỏi thiếu sót Em mong nhận thơng cảm góp ý quý Thầy Cô bạn Xin chân th8nh c9m ơn ! NHẬN XÉT ………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………… MỤC LỤC CHƯƠNG GIỚI THIỆU 10 1.1 Tổng quan .10 1.1.1 Trình biên dịch 10 1.1.2 Các kiểu trình biên dịch .10 1.1.3 Vấn đề hướng giải 12 1.2 Phương pháp, kết 12 1.3 Cấu trúc đồ án .13 CHƯƠNG NGHIÊN CỨU TỔNG QUAN 14 2.1 Ngơn ngữ lập trình hỗ trợ .14 2.1.1 BASIC (Beginners' All-purpose Symbolic Instruction Code) 14 2.1.2 Python 16 2.2 Công cụ hỗ trợ: Sublime Text .18 CHƯƠNG PHÂN TÍCH THIẾT KẾ 20 3.1 Trình phân tích từ vựng - Lexing 20 3.1.1 Giới thiệu 20 3.1.2 Nhiệm vụ Lexer 20 3.1.3 Viết Lexer đơn giản 20 3.2 Trình phân tích cú pháp - Parsing 22 3.2.1 Giới thiệu 22 3.2.2 Nhiệm vụ Parser 22 3.2.3 Viết Parser đơn giản .23 CHƯƠNG TRIỂN KHAI THỰC HIỆN 25 4.1 Xây dựng Lexer Parse 25 4.1.1 Lexer 25 4.1.2 Parser 26 4.2 Node .26 4.3 Xây dựng chức lệnh .27 4.4 Báo lỗi 27 4.5 Hàm chạy chương trình 28 4.6 Chạy thử chương trình 28 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 29 5.1 Kết luận 29 5.2 Định hướng phát triển 29 TÀI LIỆU THAM KHẢO 30 DANH MỤC HÌNH ẢNH Hình 2.1 Python 16 Hình 2.2 Sublime Text 18 Hình 3.1 Phân tích từ vựng Lerxing .22 Hình 3.2 Phân tích cú pháp Parsing .24 Hình 4.1 Các từ khóa 25 Hình 4.2 Các biến so sánh 25 Hình 4.3 Các hàm so sánh 25 Hình 4.4 Các hàm expr() 26 Hình 4.5 Các hàm Node .26 Hình 4.6 Các chức lệnh .27 Hình 4.7 Gọi lệnh chức 27 Hình 4.8 Các lớp báo lỗi 27 Hình 4.9 Hàm chạy chương trình 28 Hình 4.10 Gọi hàm chạy 28 Hình 4.11 File test.my 28 Hình 4.12 Kết chạy thử 28 DANH MỤC TỪ VIẾT TẮT CHƯƠNG GIỚI THIỆU 1.1 Tổng quan 1.1.1 Trình biên dịch Trình biên dịch, cịn gọi phần mềm biên dịch, compiler, 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 (gọi ngơn ngữ nguồn hay mã nguồn), thành chương trình tương đương dạng ngơn ngữ máy tính (gọi ngơn ngữ đích) thường ngơn ngữ cấp thấp hơn, ngôn ngữ máy Chương trình dịch gọi mã đối tượng Hầu hết trình biên dịch chuyển dịch mã nguồn viết ngôn ngữ cấp cao thành mã đối tượng hay ngơn ngữ máy mà thi hành trực tiếp máy tính hay máy ảo Dù vậy, việc chuyển dịch từ ngôn ngữ cấp thấp sang ngôn ngữ cấp cao xảy ra; q trình thường hiểu biên dịch ngược tái tạo lại chương trình ngơn ngữ cấp cao Cũng tồn trình biên dịch chuyển đổi từ ngôn ngữ cao sang ngôn ngữ cao khác, chuyển đổi sang ngôn ngữ mà cần để tiếp tục xử lý sau; trình biên dịch biết biên dịch phân tầng Các loại trình biên dịch cho kết mã đối tượng cách bao gồm mã máy tăng cường thêm thông tin tên vị trí ngõ vào gọi ngồi (đến hàm mà khơng có sẵn bên nó) Một tập hợp tập tin đối tượng, mà không hẳn cung cấp từ trình biên dịch, liên kết với để tạo nên chương trình khả thi cuối cho người dùng Dĩ nhiên, để làm tập tin đối tượng phải thiết kế chung dạng thức Ví dụ kiểu tập đối tượng tập có là.obj dùng chung ASM, C/C++, Fortran hay tập tin.DLL kiến trúc Windows dùng chung cho nhiều ngôn ngữ 1.1.2 Các kiểu trình biên dịch Trình biên dịch b9n v8 trình biên dịch chéo b9n Tất trình biên dịch biên dịch biên dịch chéo Một trình biên dịch sản xuất mã chủ định để chạy kiểu máy tính kiểu hệ điều hành chạy máy mà trình biên dịch tự tiến hành gọi trình biên dịch Một loại khác, trình biên dịch sản xuất mã mà thiết kế để chạy kiểu máy tính khác hay hệ điều hành khác Trường hợp gọi trình biên dịch chéo Các trình biên dịch chéo có ích gặp hệ thống phần cứng lần Trình biên dịch chéo cần việc phát triển phần mềm cho hệ thống vi điều khiển, mà chúng có vừa đủ kho lưu trữ cho mã máy cuối, khơng đủ để tải trình biên dịch (như trường hợp dịch chương trình để chạy palmtop điện thoại di động chẳng hạn) Số bước chuyển dịch Tất trình biên dịch bước hay nhiều bước Trình biên dịch bước: Với loại này, chuyển dịch hoàn tất bước nhanh (Ví dụ: trình biên dịch trước cho Pascal hay Borland C ) Các trình biên dịch cần nhiều bước để hồn tất gọi trình biên dịch nhiều bước Các kiểu trình biên dịch nhiều bước bao gồm: − Trình biên dịch nguồn sang nguồn loại trình biên dịch nhận vào mã nguồn, ngôn ngữ cấp cao chuyển dịch thành ngôn ngữ cấp cao khác Ví dụ: Một trình biên dịch tự động song song hố thường xun lấy chương trình ngơn ngữ cấp cao ngõ vào chuyển dạng mã nguồn giải với giải mã song song (như OpenMP hay câu lệnh DOALL Fortran,…) − Trình biên dịch phân đoạn biên dịch sang ngơn ngữ ASM máy lý thuyết vài tiến hành Prolog Loại máy Prolog gọi máy trừu tượng Warren (hay WAM) Ví dụ: Các trình biên dịch bytecode cho Java, Python nhiều trình biên dịch khác kiểu kiểu − Trình biên dịch động (JIT) chuyển dịch ứng dụng sang bytecode, sau đó, bytecode dịch sang mã ngơn ngữ máy tương thích trước thi hành Ví dụ: Trình biên dịch JIT dùng Smalltalk, Java, dùng Ngôn ngữ trung gian thơng dụng Microsoft.NET Các đặc tính khác Đặc biệt, trình biên dịch có thêm chức sau đây: − Trình biên dịch mã liên kết loại trình biên dịch cho phép thay dòng ký tự (mã) nguồn khối mã nhị phân sẵn có Các khối mã nhị phân có nhiều cấp độ khác Ví dụ: trình biên dịch hầu hết kiến trúc FORTH Trong thực tế, vài trình biên dịch FORTH dịch chương trình mà khơng cần đến hệ điều hành − Trình biên dịch tăng tiến Trong trình biên dịch tăng tiến, hàm riêng lẻ dịch thời gian thi hành (runtime) mà hàm bao gồm chức thơng dịch Ví dụ: Kiến trúc dịch tăng tiến xuất từ 1962 sử dụng hệ thống Lisp − Trình biên dịch đa trình biên dịch điều chỉnh để tạo mã cho kiến trúc CPU khác cách tương đối dễ dàng Mã đối tượng làm trình biên dịch thường có chất lượng mã tạo từ trình biên dịch chuyên dùng cho loại CPU Trình biên dịch đa thường trình biên dịch chéo Ví dụ: GCC loại trình biên dịch đa miễn phí phổ biến Trình biên dịch song song hóa loại trình biên dịch có khả chuyển đổi chương trình vào viết theo kiểu liên tục sang dạng thuận tiện kiến trúc máy tính song song 1.1.3 Vấn đề hướng giải Hiện nay, giới có nhiều ngơn ngữ lập trình sữ dụng rộng rãi từ lâu Nỗi bật kể đến Java, C, C+ +, Python v.v Ngơn ngữ lập trình sở cần thiết để kết nối với cơng nghệ cách nhanh Vì thế, em định thực đồ án này, để nhằm tìm hiểu bước đầu xây dựng chương trình đơn giản phiên dịch từ tiếng Việt sử dụng hàng ngày sang Python thực phép tính câu lệnh, chương trình đơn giản 1.2 Phương pháp, kết qu9 Như nói trên, em bước tìm hiểu xây dựng chương trình trình biên dịch đơn giản Ở đây, em sử dụng cơng cụ Sublime Text để viết chương trình Terminal để chạy chương trình thơng qua ngơn ngữ Python Với mong muốn chương trình phân tích từ vựng đơn giản, có khả xử lý câu lệnh ngắn gọn, thực phép toán, thuật tốn đơn giản Và thơng qua đó, thân đạt được: −Tìm hiểu cách cách xây dựng trình biên dịch −Hiểu học phần Trình biên dịch áp dụng kiến thức có từ học phần vào đồ án lần −Được củng cố kiến thức phương pháp để xây dựng trình biên dịch −Xây dựng chương trình trình biên dịch xử lý câu lệnh đơn giản 1.3 Cấu trúc đồ án Chương 2: Nghiên cứu tổng quan Tìm hiểu, trình bày cơng cụ hổ trợ, ngơn ngữ lập trình trung gian để xây dựng chương trình Chương 3: Phân tích thiết kế Trình bày số lớp, hàm chức chính, cách thức triển khai chương trình Chương 4: Triển khai xây dựng Mơ tả phần triển khai demo kết demo Chương 5: Kết luận hướng phát triển Nêu đạt chưa đạt so với mục tiêu, kết đề ban đầu Những yêu cầu bổ sung cho chương trình thêm hồn thiện CHƯƠNG NGHIÊN CỨU TỔNG QUAN 2.1 Ngơn ngữ lập trình hỗ trợ 2.1.1 BASIC (Beginners' All-purpose Symbolic Instruction Code) BASIC ngơn ngữ lập trình bậc cao, đơn giản, dễ sử dụng BASIC phát minh vào năm 1963 giáo sư John George Kemeny Thomas Eugene Kurtz thuộc viện Đại học Dartmouth (Dartmouth College) để cung cấp cho sinh viên cách viết chương trình máy tính đơn giản Kể từ đó, ngơn ngữ phát triển thành ngôn ngữ mạnh mẽ sử dụng để tạo chương trình nâng cao cho hệ thống máy tính ngày Trong BASIC, câu lệnh viết chữ in Khi đánh số nhãn lệnh, thông thường người ta đánh cách quãng (chẳng hạn, 10, 20, 30, ) để thuận tiện cho việc thêm dòng lệnh (nếu cần) sau Chẳng hạn muốn chèn dòng lệnh in 10 PRINT "Gia tri can tim la: "PRINT x / Lệnh GOTO GOTO Tên_nhãn_lệnh Điều kiện - rẽ nhánh Lệnh IF IF điều_kiện THEN câu_lệnh ELSE câu_lệnh END IF Riêng câu_lệnh lệnh GOTO khơng cần THEN IF A < GOTO 80 Lệnh lặp Lệnh FOR FOR biến = giá_trị_đầu TO giá_trị_cuối [STEP bước_nhảy] câu_lệnh NEXT biến Lệnh DO WHILE LOOP DO WHILE điều_kiện câu_lệnh LOOP Lệnh DO LOOP WHILE DO câu_lệnh LOOP WHILE điều_kiện Khai báo mảng DIM X(500) Khai báo hàm FNA F(X) = X*X Gọi chương trình Trong chương trình GOSUB tên_CTC Đoạn chương trình khởi đầu SUB kết thúc RETURN (trở chương trình 12 SUB tên_CTC lệnh… RETURN 2.1.2 Python Hình 2.1 Python Python ngơn ngữ lập trình hướng đối tượng, cấp cao, mạnh mẽ, tạo Guido van Rossum Nó dễ dàng để tìm hiểu lên ngơn ngữ lập trình nhập mơn tốt cho người lần đầu tiếp xúc với ngơn ngữ lập trình Python hoàn toàn tạo kiểu động sử dụng chế cấp phát nhớ tự động Python có cấu trúc liệu cấp cao mạnh mẽ cách tiếp cận đơn giản hiệu lập trình hướng đối tượng Cú pháp lệnh Python điểm cộng vơ lớn rõ ràng, dễ hiểu cách gõ linh động làm cho nhanh chóng trở thành ngôn ngữ lý tưởng để viết script phát triển ứng dụng nhiều lĩnh vực, hầu hết tảng Python hoàn toàn tạo kiểu động dùng chế cấp phát nhớ tự động; tương tự Perl, Ruby, Scheme, Smalltalk, Tcl Python phát triển dự án mã mở, tổ chức phi lợi nhuận Python Software Foundation quản lý Ban đầu, Python phát triển để chạy Unix Nhưng theo thời gian, Python dần mở rộng sang hệ điều hành từ MS-DOS đến Mac OS, OS/2, Windows, Linux hệ điều hành khác thuộc họ Unix Mặc dù phát triển Python có đóng góp nhiều cá nhân, Guido van Rossum tác giả chủ yếu Python Ơng giữ vai trị chủ chốt việc định hướng phát triển Python Sự phát triển Python đến chia làm giai đoạn: Python 1: bao gồm phát hành 1.x − Giai đoạn này, kéo dài từ đầu đến cuối thập niên 1990 Từ năm 1990 đến 1995, Guido làm việc CWI (Centrum voor Wiskunde en Informatica - Trung tâm 13 Toán - Tin học Amsterdam, Hà Lan) Vì vậy, phiên Python CWI phát hành Phiên cuối phát hành CWI 1.2 − Vào năm 1995, Guido chuyển sang CNRI (Corporation for National Research Initiatives) Reston, Virginia Tại đây, ông phát hành số phiên khác Python 1.6 phiên cuối phát hành CNRI − Sau phát hành 1.6, Guido rời bỏ CNRI để làm việc với lập trình viên chuyên viết phần mềm thương mại Tại đây, ông có ý tưởng sử dụng Python với phần mềm tuân theo chuẩn GPL Sau đó, CNRI FSF (Free Software Foundation - Tổ chức phần mềm tự do) hợp tác để làm quyền Python phù hợp với GPL Cùng năm đó, Guido nhận Giải thưởng FSF Sự phát triển Phần mềm tự (Award for the Advancement of Free Software) − Phiên 1.6.1 đời sau phiên tuân theo quyền GPL Tuy nhiên, hoàn toàn giống 1.6, trừ số sửa lỗi cần thiết Python 2: vào năm 2000, Guido nhóm phát triển Python dời đến BeOpen.com thành lập BeOpen PythonLabs team Phiên Python 2.0 phát hành Sau phát hành Python 2.0, Guido thành viên PythonLabs gia nhập Digital Creations − Python 2.1 đời kế thừa từ Python 1.6.1 Python 2.0 Bản quyền phiên đổi thành Python Software Foundation License Từ thời điểm trở đi, Python thuộc sở hữu Python Software Foundation (PSF), tổ chức phi lợi nhuận thành lập theo mẫu Apache Software Foundation Python 3: gọi Python 3000 Py3K: Dịng 3.x khơng hồn tồn tương thích với dịng 2.x, có cơng cụ hỗ trợ chuyển đổi từ phiên 2.x sang 3.x Nguyên tắc chủ đạo để phát triển Python 3.x "bỏ cách làm việc cũ nhằm hạn chế trùng lặp mặt chức Python" Trong PEP (Python Enhancement Proposal) có mơ tả chi tiết thay đổi Python Các đặc điểm Python 3.0 trình bày phần cuối 2.2 Công cụ hỗ trợ: Sublime Text 14 Hình 2.2 Sublime Text Sublime Text phần mền soạn thảo code nhiều lập trình viên sử dụng tính hiệu mà mang lại Tuy đời sau Notepad++ Sublime Text đánh giá cao trở nên phổ biến nhờ khả hoạt động mượt mà, chiếm tài ngun máy, hỗ trợ đa ngơn ngữ lập trình đặc biệt hỗ trợ Plugin với cộng đồng hỗ trợ mạnh mẽ Khơng vừa nhẹ, vừa gọn, vừa nhanh mà cịn hỗ trợ nhiều plugins, snippets, code auto complete, highlight beautiful, tùy biến giao diện, phím tắt, nhiều thứ khác Được Jon Skinner tạo vào tháng năm 2008, viết dựa ngơn ngữ lập trình Python C++ Sublime Text phần mềm trả phí, cho phép dùng thử vô thời hạn Với giao diện người dùng trực quan, bắt mắt, nhiều chức mạnh mẽ mở rộng thêm thơng qua Package Control Hỗ trợ nhận diện tô màu từ khố (syntax highlight) cho 20 ngơn ngữ khác chẳng hạn HTML, CSS, jаvascript, C++, C#, SQL, XML … Những ưu điểm Sublime Text − Chạy nhẹ nhàng so với full IDE mà thường dùng trước Eclipse, IntelljIDEA, VS, Dremware… Mở nhiều project, file lúc… − Do Beta, nên miễn phí, nhiên n tâm phần mềm chạy ổn định, không thấy bị crashed đa tảng: Mac OSX, Linux, Windows có − Các extensions nhiều, phong phú, tiện lợi, dễ cài đặt, hầu hết miễn phí − Open file nhanh suggestion theo text gõ Khơng cần nhớ file nằm đâu, gõ tên, ST3 gợi ý file mà muốn mở 15 − Chế độ tìm kiếm, replace, highlight dễ sử dụng − Chế độ Intelligent Suggestion hoạt động smooth, phù hợp nhu cầu sử dụng (tất − Có nhiều themes text giao diện tools, chọn tuỳ chỉnh theo cách − Sử dụng thêm phím Ctrl edit lúc nhiều chỗ khác − Tích hợp sẵn terminal − Có nhiều extensions giúp cho phát triển nhanh PHP project dựa nhiên không tool chuyên dụng đủ để xài) mong muốn OpenSource framework Laravel, CakePHP… CHƯƠNG PHÂN TÍCH THIẾT KẾ 3.1 Trình phân tích từ vựng - Lexing 3.1.1 Giới thiệu Bước hầu hết ngơn ngữ lập trình Lexing “Lex” chữ viết tắt ám việc phân tích từ vựng Nói cách khác, Lexing tức chia cắt đoạn text thành token riêng biệt Tokens: Có thể hiểu Token đơn vị nhỏ ngơn ngữ Một Token variable, tên function, operator đơn giản số 3.1.2 Nhiệm vụ Lexer Lexer chia string chứa toàn file mã nguồn thành list nhiều string nhỏ chứa token khác Bởi tầng cao cấu trúc “ống nước” Pipecone không quay lấy thông tin từ mã nguồn mà Lexer đảm nhiệm cung cấp tất thông tin cần cho stage Nguyên nhân cho việc để Lexer làm nhiệm vụ xóa comments, xác định token số identifier Như giúp bạn lo lắng qui định viết ngơn ngữ lập trình Source Code TokenList [4.3: FLOAT] 4.3+2/6 {Lexer} > [+: CONG] [2: INT] [/: CHIA] [6: INT] 16 3.1.3 Viết Lexer đơn giản Token: DIGIT = ‘0123456789’ SONGUYEN = 'SONGUYEN' SOTHUC = 'SOTHUC' CONG = 'CONG' TRU = 'TRU' NHAN = 'NHAN' CHIA = 'CHIA' NG_MO = 'NG_MO' NG_DONG = 'NG_DONG' class Token: def init (self, type_, value=None, pos_start=None, pos_end=None): self.type = type_ self.value = value if pos_start: self.pos_start = pos_start.copy() self.pos_end = pos_start.copy() self.pos_end.advance() if pos_end: self.pos_end = pos_end def repr (self): if self.value: return f'{self.type}:{self.value}' return f'{self.type}' Lexer: class Lexer: def make_tokens(self): tokens = [] while self.current_char != None: if self.current_char in ' \t': self.advance() elif self.current_char in DIGITS: tokens.append(self.make_number()) elif self.current_char == '+': tokens.append(Token(CONG, pos_start=self.pos)) self.advance() elif self.current_char == '-': tokens.append(Token(TRU, pos_start=self.pos)) self.advance() elif self.current_char == '*': tokens.append(Token(NHAN, pos_start=self.pos)) self.advance() elif self.current_char == '/': tokens.append(Token(CHIA, pos_start=self.pos)) 17 self.advance() elif self.current_char == '(': tokens.append(Token(NG_MO, pos_start=self.pos)) self.advance() elif self.current_char == ')': tokens.append(Token(NG_DONG, pos_start=self.pos)) self.advance() else: return tokens, None def make_number(self): num_str = '' dot_count = pos_start = self.pos.copy() while self.current_char != None and self.current_char in DIGITS + '.': if self.current_char == '.': if dot_count == 1: break dot_count += num_str += '.' else: num_str += self.current_char self.advance() if dot_count == 0: return Token(SONGUYEN, int(num_str), pos_start, self.pos) else: return Token(SOTHUC, float(num_str), pos_start, self.pos) Kết sau chạy chương trình: Hình 3.1 Phân tích từ vựng Lerxing 3.2 Trình phân tích cú pháp - Parsing 3.2.1 Giới thiệu Trong giai đoạn này, mã thông báo tạo giai đoạn trước kiểm tra theo ngữ pháp ngơn ngữ lập trình, cho dù biểu thức có mặt cú pháp hay khơng 3.2.2 Nhiệm vụ Parser Parser thêm cấu trúc cho list tokens sau tạo lexer Để ngăn mơ hồ, phân tích cú pháp (Parser) phải đưa vào ngoặc đơn thứ tự hoạt động 18 Thật parser khơng khó ngơn ngữ phát triển Perser trở nên phức tạp TokenList Abstract Syntax Tree [4.3: FLOAT] [+: CONG] [+: CONG] {Parser} > [2: INT] [4.3: FLOAT] [/: CHIA] [/: CHIA] [6: INT] [2: INT] 3.2.3 Viết Parser đơn giản class Parser: def parse(self): res = self.expr() if not res.error and self.current_tok.type != EOF: return res.failure(InvalidSyntaxError( self.current_tok.pos_start, self.current_tok.pos_end, "Expected '+', '-', '*' or '/'" )) return res def factor(self): res = ParseResult() tok = self.current_tok if tok.type in (CONG, TRU): res.register(self.advance()) factor = res.register(self.factor()) if res.error: return res return res.success(UnaryOpNode(tok, factor)) elif tok.type in (SONGUYEN, SOTHUC): res.register(self.advance()) return res.success(NumberNode(tok)) elif tok.type == NG_MO: res.register(self.advance()) expr = res.register(self.expr()) if res.error: return res if self.current_tok.type == NG_DONG: res.register(self.advance()) return res.success(expr) else: return res.failure(InvalidSyntaxError( self.current_tok.pos_start, self.current_tok.pos_end, "Expected ')'" 19 [6: INT] )) return res.failure(InvalidSyntaxError( tok.pos_start, tok.pos_end, "Expected int or float" )) def term(self): return self.bin_op(self.factor, (NHAN, CHIA)) def expr(self): return self.bin_op(self.term, (CONG, TRU)) def bin_op(self, func, ops): res = ParseResult() left = res.register(func()) if res.error: return res while self.current_tok.type in ops: op_tok = self.current_tok res.register(self.advance()) right = res.register(func()) if res.error: return res left = BinOpNode(left, op_tok, right) return res.success(left) Kết sau chạy chương trình: Hình 3.2 Phân tích cú pháp Parsing CHƯƠNG TRIỂN KHAI THỰC HIỆN Vì lập trình Sublime Text nên chương trình chạy giao diện Terminal 4.1 Xây dựng Lexer v8 Parse 4.1.1 Lexer 20 Bổ sung thêm từ khóa cho lệnh Hình 4.1 Các từ khóa Các biến so sánh (so sánh bằng, khác, nhỏ hơn, lớn hơn, nhỏ bằng, lớn bằng) Hình 4.2 Các biến so sánh Các hàm so sánh Hình 4.3 Các hàm so sánh 4.1.2 Parser Bổ sung thêm hàm expr() cho lệnh 21 Hình 4.4 Các hàm expr() 4.2 Node Các Node cho lệnh Hình 4.5 Các hàm Node 4.3 Xây dựng chức lệnh 22 Hình 4.6 Các chức lệnh Hình 4.7 Gọi lệnh chức 4.4 Báo lỗi Hình 4.8 Các lớp báo lỗi 4.5 H8m chạy chương trình 23 Hình 4.9 Hàm chạy chương trình Hình 4.10 Gọi hàm chạy 4.6 Chạy thử chương trình Xây dựng file test.my có nội dung: Hình 4.11 File test.my Chạy gọi file test.my tạo: Hình 4.12 Kết chạy thử CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1 Kết luận 24 Kết thúc đồ án 5, lần đầu bước chân vào lĩnh vực nghiên cứu xây dựng chương trình trình biên dịch Đầu tiên, đồ án đạt mục tiêu sau: − Tìm hiểu cách cách xây dựng trình biên dịch − Hiểu học phần Trình biên dịch áp dụng học phần học phần đồ án lần − Được cố kiến thức phương pháp để xây dựng trình biên dịch − Xây dụng chương trình trình biên dịch xử lý câu lệnh đơn giản − Có thể chạy chương trình đơn giản, bước đầu sử dụng lệnh in hình, vịng lặp for, hàm trả lại giá trị định,… Ngoài thành tựu trên, chúng em hạn chế nhiều phần sau: − Chưa thực hiê n± câu lê ±nh phức tạp chương trình trình biên dịch − Chương trình chưa thực tối ưu mặt giao diện nhiều phần khác 5.2 Định hướng phát triển Với định hướng ban đầu xây dựng chương trình trình biên dịch đơn giản sử dung câu lệnh tiếng Việt để lập trình Bản thân em tìm hiểu làm tốt bước đầu Tuy nhiên cịn khơng hạn chế Và với mục tiêu xa tạo ngơn ngữ lập trình Việt, em hoàn thành tốt bước chuẩn bị bao gồm: − Xử lý chương trình tốt để biên dịch mơ t± chương trình hồn chỉnh − Phát triển chương trình trình biên dịch mơ t± cách tối ưu xử lý câu lênh ± phức tạp − Tìm hiểu sâu thực hiê ±n chương trình trình biên dịch phương pháp khác TÀI LIỆU THAM KHẢO https://hoccungchuyengia.com/3909-2/ https://helpex.vn/article/phan-tich-cu-phap-trong-python-cong-cu-va-thu-vien-phan-1- 25 5c6b1a5aae03f628d053bdc3 26