NGHIÊN CỨU ỨNG DỤNG LEXYACC ĐỄ HỖ TRỢ PHÁT SINH MÃ NGUỒN

43 292 0
NGHIÊN CỨU ỨNG DỤNG LEXYACC ĐỄ HỖ TRỢ PHÁT SINH MÃ NGUỒN

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Trong công nghệ thông tin, cùng với sự phát triển các thiết bị phần cứng là sự hình thành và phát triển của các kĩ thuật lập trình. Làm thế nào để lập trình nhanh và hiệu quả nhất cho một bài toán luôn là cơ sở để các phương pháp, kĩ thuật và ngôn ngữ lập trình ra đời. Một trong những kĩ thuật ra đời sớm và phát triển mạnh là kĩ thuật tự động phát sinh mã nguồn. Tự động phát sinh mã nguồn là một ý tưởng táo bạo và mang lại hiệu quả cao trong lập trình. Một trong những công cụ hỗ trợ phát sinh mã nguồn đó là công cụ LexYacc. LexYacc có chức năng phát sinh mã nguồn trong lĩnh vực tạo các chương trình dịch và sau này được mở rộng ra nhiều lĩnh vực khác. LexYacc sẽ dựa vào các đặt tả ngữ pháp và tự động phát sinh ra mã nguồn C hoặc Pascal. Việc này cho phép tiết kiệm rất nhiều thời gian cũng như hạn chế lỗi trong quá trình biên dịch. Trong báo cáo sau đây, giúp chúng ta phân tích, đánh giá hiệu quả trong lập trình bằng cách sử dụng công cụ LexYacc. Cung cấp tài liệu về công cụ LexYacc một cách hệ thống và đầy đủ để phục vụ cho việc phát triển ứng dụng sau này. Góp phần thúc đẩy việc ứng dụng công cụ LexYacc trong lập trình tại Việt Nam. Khi thực hiện đề tài, chúng tôi đã kết hợp giữa phương pháp nghiên cứu lý thuyết và phương pháp nghiên cứu thực nghiệm. về mặt lý thuyết, chúng tôi tiến hành nghiên cứu tổng quan về chương trình dịch, các bộ phân tích từ vựng và cú pháp, các bộ phân tích và phát sinh mã nguồn LexYacc. Về mặt thực nghiệm, chúng tôi tiến hành một số ví dụ minh họa trên một số bài toán tiêu biểu với LexYacc. Đối tượng nghiên cứu chính của đề tài là chương trình dịch, các ngôn ngữ đặc tả các công cụ hỗ trợ phát sinh mã nguồn. Tuy nhiên tôi giới hạn phạm vi nghiên cứu của mình trên LexYacc và phát sinh mã nguồn trong ngôn ngữ lập trình C.

ĐẠI HỌC ĐÀ NẴNG TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC CỦA SINH VIÊN THAM GIA XÉT GIẢI THƯỞNG NGHIÊN CỨU ỨNG DỤNG LEX/YACC ĐỄ HỖ TRỢ PHÁT SINH MÃ NGUỒN Mã số đề tài: 60.48.01 Thuộc nhóm ngành khoa học: Khoa học máy tính ĐÀ NẴNG, Tháng 4/ Năm 2016 ĐẠI HỌC ĐÀ NẴNG TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC CỦA SINH VIÊN THAM GIA XÉT GIẢI THƯỞNG NGHIÊN CỨU ỨNG DỤNG LEX/YACC ĐỄ HỖ TRỢ PHÁT SINH MÃ NGUỒN Mã số đề tài: 60.48.01 Thuộc nhóm ngành khoa học: Khoa học máy tính Sinh viên thực hiện: Nguyễn Văn Nhớ Nam, Nữ: Nam Dân tộc: Kinh Lớp, khoa: Lớp 13i2, Khoa Công Nghệ Thông Tin Năm thứ: 03 /Số năm đào tạo: 03 Ngành học: Công Nghệ Thông Tin (Ghi rõ họ tên sinh viên chịu trách nhiệm thực đề tài) Người hướng dẫn: Thạc sĩ Dương Thị Mai Nga ĐÀ NẴNG, Tháng 4/ Năm 2016 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn MỤC LỤC MỤC LỤC DANH MỤC BẢNG LỜI NÓI ĐẦU I.Các khái niệm trình biên dịch 1.Tổng quan trình biên dịch 2.Khái quát chương trình 3.Bộ phân tích từ vựng 4.Bộ phân tích cú pháp .9 5.Bộ xử lý ngữ nghĩa 13 II.Nội dung thực phân tích thực nghiệm 13 1.Nội dung lý thuyết Lex/Yacc .13 2.Nội dung phân tích ví dụ thực nghiệm .25 III.Kết Luận kiến nghị: 41 SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn DANH MỤC BẢNG Bảng 1: Pattern Matching Primitives 16 Bảng 2: Pattern Matching Examples .17 Bảng 3: Lex Predefined Variables 19 SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn ĐẠI HỌC ĐÀ NẴNG TRƯỜNG CĐ CÔNG NGHỆ THÔNG TIN THÔNG TIN KẾT QUẢ NGHIÊN CỨU CỦA ĐỀ TÀI Thông tin chung: - Tên đề tài: Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn - Sinh viên thực hiện: Nguyễn Văn Nhớ - Lớp: 13i2 Khoa: Công Nghệ Thông Tin Năm thứ: 03 Số năm đào tạo: 03 - Người hướng dẫn: Ths Dương Thị Mai Nga Mục tiêu đề tài: Ngiên cứu ứng dụng Lex/Yacc để tăng hiệu lập trình ứng dụng Sau nghiên cứu, trình bày hệ thống cách sử dụng hướng dẫn lưu ý làm việc với chương trình ứng dụng Tính sáng tạo: Ứng dụng đưa cho người lập trình nhiều lựa chọn trước tránh lỗi khó lập trình ứng dụng Tăng chất lương sản phẩm làm lập trình viên Kết nghiên cứu: Kết trình tìm hiểu nghiên cứu đề tài ứng dụng công cụ Lex/Yacc để phát sinh mã nguồn lập trình cho thấy kết tương đối tốt Có nhiều ưu điểm tiện ích cao, thích hợp cho việc áp dụng vào thực tiễn công nghiệp tin học ứng dụng Đóng góp mặt kinh tế - xã hội, giáo dục đào tạo, an ninh, quốc phòng khả áp dụng đề tài: Đóng góp to lớn vào mặt kinh tế - xã hội, giáo dục, tiết kiệm thời gian chi phí người sử dụng, giúp người sử dụng tiếp cận với tiện ích cao đặc biết xã hội có công nghệ thông tin phát triển nước ta Thúc đẩy giáo dục lên, học sinh sinh viên tiếp cận với phương pháp học tiên tiến hơn… Công bố khoa học sinh viên từ kết nghiên cứu đề tài (ghi rõ tên tạp chí có) nhận xét, đánh giá sở áp dụng kết nghiên cứu (nếu có): SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn Ngày tháng năm 2016 Sinh viên chịu trách nhiệm thực đề tài (ký, họ tên) Nguyễn Văn Nhớ Nhận xét người hướng dẫn đóng góp khoa học sinh viên thực đề tài (phần người hướng dẫn ghi): Ngày tháng năm 2016 Xác nhận đơn vị Người hướng dẫn (ký tên đóng dấu) (ký, họ tên) Ths Dương Thị Mai Nga SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn LỜI NÓI ĐẦU Trong công nghệ thông tin, với phát triển thiết bị phần cứng hình thành phát triển kĩ thuật lập trình Làm để lập trình nhanh hiệu cho toán sở để phương pháp, kĩ thuật ngôn ngữ lập trình đời Một kĩ thuật đời sớm phát triển mạnh kĩ thuật tự động phát sinh mã nguồn Tự động phát sinh mã nguồn ý tưởng táo bạo mang lại hiệu cao lập trình Một công cụ hỗ trợ phát sinh mã nguồn công cụ Lex/Yacc Lex/Yacc có chức phát sinh mã nguồn lĩnh vực tạo chương trình dịch sau mở rộng nhiều lĩnh vực khác Lex/Yacc dựa vào đặt tả ngữ pháp tự động phát sinh mã nguồn C Pascal Việc cho phép tiết kiệm nhiều thời gian hạn chế lỗi trình biên dịch Trong báo cáo sau đây, giúp phân tích, đánh giá hiệu lập trình cách sử dụng công cụ Lex/Yacc Cung cấp tài liệu công cụ Lex/Yacc cách hệ thống đầy đủ để phục vụ cho việc phát triển ứng dụng sau Góp phần thúc đẩy việc ứng dụng công cụ Lex/Yacc lập trình Việt Nam Khi thực đề tài, kết hợp phương pháp nghiên cứu lý thuyết phương pháp nghiên cứu thực nghiệm mặt lý thuyết, tiến hành nghiên cứu tổng quan chương trình dịch, phân tích từ vựng cú pháp, phân tích phát sinh mã nguồn Lex/Yacc Về mặt thực nghiệm, tiến hành số ví dụ minh họa số toán tiêu biểu với Lex/Yacc Đối tượng nghiên cứu đề tài chương trình dịch, ngôn ngữ đặc tả công cụ hỗ trợ phát sinh mã nguồn Tuy nhiên giới hạn phạm vi nghiên cứu Lex/Yacc phát sinh mã nguồn ngôn ngữ lập trình C SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn I Các khái niệm trình biên dịch Tổng quan trình biên dịch Trình biên dịch chương trình chiệu trách nhiệm dịch mã văn chương trình nguồn ngôn ngữ lập trình mã máy Mã văn chương trình nguồn dịch sang dạng mã trung gian sau mã trung gian dịch xuống mã máy mã máy thực thi Khái quát chương trình Chương giới thiệu trình biên dịch cho biểu thức số học đơn giản (trình biên dịch đơn giản) gồm hai kỳ: Kỳ đầu (Front end) kỳ sau (Back end) Nội dung chương tập trung vào kỳ đầu gồm giai đoạn: Phân tích từ vựng, phân tích cú pháp sinh mã trung gian với mục đích chuyển biểu thức số học đơn giản từ dạng trung tố sang hậu tố Kỳ sau chuyển đổi biểu thức dạng hậu tố sang mã máy ảo kiểu stack, sau thực thi đoạn mã máy ảo kiểu stack kết tính toán cuối Chương trình gồm thành phần chính: - Bộ phân tích từ vựng - Bộ phân tích cú pháp - Bộ xử lý ngữ nghĩa Bộ phân tích từ vựng Bộ phân tích từ vựng có nhiệm vụ nạp toàn văn chương trình nguồn vào nhớ Phân tích văn chương trình nguồn thành token riêng biệt Báo lỗi gặp kí hiệu không thuộc tập ký hiệu token không thỏa mãn luật danh hiệu Trước hết ta trình bày số chức cần thiết phân tích từ vựng a 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 khoảng trắng vào cú pháp khó cài đặt SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn b 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 c 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ệu 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 SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn 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 : d 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: 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 đoạn 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 SVTH: Nguyễn Văn Nhớ _ 13I2 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn tập hợp luật Mỗi luật gồm: dấu “:”, tên nằm bên trái dấu “:” (gọi phía bên trái), danh sách ký hiệu mã thực thi nằm bên phải dấu “:” (gọi phía bên phải) dấu “;” để kết thúc luật Mặc định luật luật quan trọng Bộ phân tích cố gắng tìm danh sách từ tố cho khớp với luật ban đầu Danh sách ký hiệu phía bên phải danh sách tên (không nhiều tên) Ký hiệu phía bên trái luật dùng từ tố luật khác Với luật có nhiều phần bên phải, ngăn cách chúng dấu “|” (được hiểu phép “hoặc”) Mã thực thi luật khối lệnh C nằm cặp dấu “{“ “}”, phân tích cú pháp thực thi đoạn mã luật luật so khớp Phần chương trình (subroutines): bắt đầu sau cặp dấu “%%”, trình bày chương trình người dùng, viết mã C Trong main() hàm quan trọng nhất, lặp lặp lại việc gọi hàm yyparse() nguồn Lex thực xong Hàm yyparse() phân tích cú pháp tạo Yacc, chương trình lặp lại việc phân tích liệu vào phân tích hết Dòng thích bao cặp /*…*/ giống C Quy trình chung để sử dụng Lex Yacc phát sinh ứng dụng thể qua Hình compile.y yacc (yyparse) compile.c source compile_tab.c compile_tab.h compile.l lex gcc lex.yy.c (yylex) compile.exe Compiled output Hình 4: Quy trình vận dụng cách đặt tên với Lex, Để sử dụng Lex Yacc cần cài đặt công cụ hỗ trợ biên dịch phát sinh mã nguồn tương ứng với giai đoạn Hiện có nhiều ứng dụng hỗ trợ xử lý cho Lex Yacc, nhiên thử nghiệm tác giả cài đặt công cụ sau: - Bison: phân tích cú pháp theo tiêu chuẩn đặc tả Yacc Nó phát sinh SVTH: Nguyễn Văn Nhớ _ 13I2 27 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn tự động chương trình xử lý tương ứng với tập tin đầu vào thiết kế cho Yacc - Flex: công cụ để tạo kiểm tra nhằm công nhận mẫu từ vựng tập tin đầu vào đặc tả theo tiêu chuẩn Flex - DevC++: môi trường phát triển tích hợp (IDE) đầy đủ tính dành cho ngôn ngữ lập trình C/C++ b) Ví dụ thực nghiệm áp dụng: Ví dụ 1: ví dụ ta thực chương trình máy tính thực phép tính cộng, trừ biến INTEGER Lex bao gồm tập tin sử dụng định nghĩa cho giá trị token Để có thẻ yacc gọi yylex Chức yylex có kiểu trả intmà trả mã thông báo Giá trị kết hợp với token trả lex biến yylval Ví dụ: [0-9] + { yylval = atoi (yytext); trở INTEGER; } lưu trữ giá trị số nguyên yylval , trả lại thẻ INTEGER để yacc Các loại yylval xác định YYSTYPE Kể từ loại mặc định số nguyên hoạt động tốt trường hợp Giá trị thẻ 0-255 dành riêng cho giá trị nhân vật Ví dụ, bạn có quy tắc như: [-+] return *yytext; / * Khai thác trở lại * / giá trị ký tự cho trừ cộng trả Lưu ý đặt dấu trừ để không bị nhầm lẫn với vấn thiết kế nhiều giá trị thẻ tạo thường bắt đầu khoảng 258 dự trữ lex nhiều giá trị cho end-of-file xử lý lỗi Dưới đặc điểm kỹ thuật hoàn chỉnh lex đầu vào cho máy tính chúng tôi: #include "y.tab.h" #include void yyerror(char *); %} %% [0-9]+ { SVTH: Nguyễn Văn Nhớ _ 13I2 28 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn yylval = atoi(yytext); return INTEGER; } [-+\n] return *yytext; [ \t] ; / * Bỏ qua khoảng trắng * / yyerror("invalid character"); /*nhân vật không hợp lệ*/ %% int yywrap(void) { return 1; } Bên yacc trì hai ngăn xếp nhớ; phân tích cú pháp ngăn xếp ngăn xếp giá trị Các phân tích cú pháp ngăn xếp chứa thiết bị đầu cuối thuộc đầu cuối mà đại diện cho nhà nước phân tích Các giá trị ngăn xếp mảng YYSTYPE yếu tố kết hợp giá trị với phần tử phân tích cú pháp ngăn xếp Ví dụ lex trả INTEGER ca yacc thẻ token để phân tích cú pháp ngăn xếp Đồng thời tương ứng yylval chuyển sang giá trị ngăn xếp Các phân tích cú pháp giá trị ngăn xếp luôn đồng nên việc tìm kiếm giá trị liên quan đến mã thông báo ngăn xếp dễ dàng thực Dưới đặc điểm kỹ thuật yacc đầu vào cho máy tính chúng tôi: %{ #include int yylex(void); void yyerror(char *); %} %token INTEGER SVTH: Nguyễn Văn Nhớ _ 13I2 29 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn %% program: program expr '\n' { printf("%d\n", $2); } | ; expr: INTEGER { $$ = $1; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } ; %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main(void) { yyparse(); return 0; } Phần quy tắc tương tự văn phạm BNF thảo luận trước Phía bên trái sản xuất, không thuộc đầu cuối, nhập trái lý tràng Tiếp theo phía bên tay phải sản xuất Hoạt động liên kết với nguyên tắc nhập vào dấu ngoặc Với trái đệ quy, xác định chương trình bao gồm không nhiều biểu thức Mỗi biểu thức chấm dứt với dòng Khi dòng phát hiện, in giá trị biểu thức Khi áp dụng quy tắc expr: expr '+' expr {$$ = $ + $ 3; } SVTH: Nguyễn Văn Nhớ _ 13I2 30 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn thay phía bên tay phải sản xuất phân tích cú pháp ngăn xếp với phía bên tay trái việc sản xuất giống Trong trường hợp này, bật " expr '+' expr " đẩy " expr " Chúng giảm stack cách popping ba điều khoản khỏi stack đẩy lùi nhiệm kỳ Chúng tham khảo vị trí giá trị ngăn xếp mã C cách xác định " $ " cho nhiệm kỳ phía bên tay phải sản xuất, " $ " cho phần thứ hai, " $$ " Chỉ đỉnh stack sau giảm diễn Những hành động cho biết thêm giá trị kết hợp với hai biểu thức, ba điều kiện khỏi giá trị ngăn xếp, đẩy trở lại giá trị Hậu phân tích cú pháp giá trị ngăn xếp đồng hóa Các giá trị số ban đầu nhập vào stack giảm từ INTEGER để expr Sau INTEGER chuyển vào stack áp dụng quy tắc expr: INTEGER {$$ = $ 1; } Các INTEGER token popped khỏi phân tích cú pháp ngăn xếp thúc đẩy expr Đối với giá trị ngăn xếp chúng bật giá trị số nguyên khỏi stack sau đẩy trở lại lần Nói cách khác, không làm Trong thực tế hành động mặc định không cần phải xác định Cuối cùng, dòng gặp, giá trị kết hợp với expr in Trong trường hợp có lỗi cú pháp yacc gọi người dùng cung cấp chức yyerror Nếu bạn cần thay đổi giao diện cho yyerror sau thay đổi tập tin đóng hộp mà yacc bao gồm để phù hợp với nhu cầu bạn Chức cuối đặc tả yacc trường hợp bạn tự hỏi nơi Ví dụ có văn phạm mơ hồ Mặc dù yacc phát hành ca-giảm cảnh báo xử lý ngữ pháp sử dụng thay đổi hoạt động mặc định  Ảnh minh họa trình làm việc chương trình máy tính chúng ta: Bước 1: Sử dụng phần mềm hỗ trợ BisonFlex để chuyển file Lex/Yacc thành file chạy… SVTH: Nguyễn Văn Nhớ _ 13I2 31 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn Bước 2: Sauk hi chạy xong hộp thoại xuất file chạy mà cần lex.yy.c, vidu2_tab.c chương trình máy tính vidu2.exe… Bước 3: File chạy vidu2.exe sẵn sang, chạy chương trình ta máy tính đủ điều kiện ban đầu đặt ra… SVTH: Nguyễn Văn Nhớ _ 13I2 32 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn Ví dụ 2: ví dụ thực chương trình máy tính thêm số tính thực phép tính nhân, chia biến INTEGER Tương tự Ví dụ ,trong phần này, mở rộng tính từ phần trước để kết hợp số chức Các tính bao gồm toán tử số học nhân chia.Dấu ngoặc đơn sử dụng để qua xe hành ưu tiên, biến ký tự quy định câu lệnh gán Sau minh họa đầu vào đầu máy tính mẫu: user: * (4 + 5) calc: 27 user: x = * (4 + 5) user: y = user: x calc: 27 user: y calc: user: x + 2*y calc: 37 SVTH: Nguyễn Văn Nhớ _ 13I2 33 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn Các phân tích từ vựng trả BIẾN INTEGER thẻ Đối với biến yylval xác định số để bảng biểu tượng sym Đối với chương trình sym giữ giá trị biến có liên quan Khi INTEGER thẻ trả về, yylval chứa số quét Dưới đặc điểm kỹ thuật đầu vào cho lex: %{ #include #include "y.tab.h" void yyerror(char *); %} %% /* variables */ [a-z] { yylval = *yytext - 'a'; return VARIABLE; } /* integers */ [0-9]+ { yylval = atoi(yytext); return INTEGER; } /* operators */ [-+()=/*\n] { return *yytext; } /* skip whitespace */ [ \t] ; /* anything else is an error */ yyerror("invalid character"); %% SVTH: Nguyễn Văn Nhớ _ 13I2 34 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn int yywrap(void) { return 1; } Các đặc điểm kĩ thuật đầu vào cho yacc sau Các thẻ cho INTERGER VARIABLE sử dụng yacc tạo # defines y.tab.h để sử dụng lex Tiếp theo định nghĩa cho toán tử số học Chúng xác định % left , cho trái kết hợp %right cho kết Định nghĩa liệt kê có thứ tự ưu tiên cao Do nhân chia có độ ưu tiên cao cộng trừ Tất bốn nhà khai thác trái kết hợp Sử dụng kỹ thuật đơn giản mập mờ ngữ pháp %token INTEGER VARIABLE %left '+' '-' %left '*' '/' %{ void yyerror(char *); int yylex(void); int sym[26]; %} %% program: program statement '\n' | ; statement: expr { printf("%d\n", $1); } | VARIABLE '=' expr { sym[$1] = $3; } ; expr: INTEGER SVTH: Nguyễn Văn Nhớ _ 13I2 35 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn | VARIABLE { $$ = sym[$1]; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } ; %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main(void) { yyparse(); return 0; }  Ảnh minh họa trình làm việc chương trình máy tính tương tự ví dụ1: Bước 1: Sử dụng phần mềm hỗ trợ BisonFlex để chuyển file Lex/Yacc thành file chạy… SVTH: Nguyễn Văn Nhớ _ 13I2 36 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn Bước 2: Sauk hi chạy xong hộp thoại xuất file chạy mà cần lex.yy.c, vidu2_tab.c chương trình máy tính vidu2.exe… Bước 3: File chạy vidu2.exe sẵn sang, chạy chương trình ta máy tính đủ điều kiện ban đầu đặt ra… SVTH: Nguyễn Văn Nhớ _ 13I2 37 Nghiên cứu ứng dụng Lex/Yacc để hỗ trợ phát sinh mã nguồn Phiên máy tính hai ví dụ hai phiên đơn giản nhất, phiên máy tính thực tế đáng kể phức tạp so với phiên trước Những thay đổi lớn bao gồm cấu trúc điều khiển if-else vàtrong Ngoài cú pháp xây dựng phân tích cú pháp Sau phân tích, cú pháp để sản xuất Ba phiên thói quen cung cấp: - thông dịch viên mà thực báo cáo thời gian - trình biên dịch tạo mã cho máy ngăn xếp dựa giả thuyết - phiên mà tạo cú pháp chương trình gốc Để làm cho việc cụ thể hơn, chương trình mẫu x = 0; while (x

Ngày đăng: 03/07/2017, 20:52

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan