tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu bộ công cụ Flex, Bison, ứng dụng trong phân tích từ Vựng và phân tích cú pháp của một ngôn ngữ nào đó

12 1.8K 11
tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu bộ công cụ Flex, Bison, ứng dụng trong phân tích từ Vựng và phân tích cú pháp của một ngôn ngữ nào đó

Đ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

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐÀO TẠO SAU ĐẠI HỌC =====o0o===== BÀI TẬP LỚN MÔN: NGUYÊN LÝ NGƠN NGỮ LẬP TRÌNH Giáo viên giảng dạy: TS Nguyễn Hữu Đức Đề tài: Tìm hiểu cơng cụ Flex, Bison, ứng dụng phân tích từ Vựng phân tích cú pháp ngơn ngữ NHĨM: 10 Lớp: CH2012B Sinh viên thực hiện: Nguyễn Thành Đô Nguyễn Xuân Trường Trần Văn Trung Nguyễn Thị Thùy Dương Hà Nội, tháng 12/2012 I GIỚI THIỆU Ta phải tốn nhiều thời gian để tìm hiểu xây dựng trình trình biên dịch hồn chỉnh cách thủ cơng Trên thực tế, có nhiều cơng cụ có khả phát 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 (Yet Another Compiler Compiler) – cơng trình Stephen C Johnson đời sớm hơn, có nhiệm vụ phát sinh trình phân tích cú pháp • Trong Mike Lesk Eric Schmidt thiết kế phát triển lex – phát sinh trình phân tích từ vựng – để hỗ trợ yacc việc xác định token từ chuỗi nhập FLEX[5] BISON[5, 7] 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 II PHÂN TÍCH TỪ VỰNG Phân tích từ vựng giai đoạn trình biên dịch Nhiệm vụ chủ yếu đọc ký hiệu nhập tạo chuỗi token sử dụng phân tích cú pháp Do đó, phân tích từ vựng thiết kế thủ tục gọi phân tích cú pháp, trả token gọi Trên thực tế, ta thường dùng biểu thức quy để mơ tả token Ví dụ văn nguồn thực tế : “tôi ăn cơm”, qua trình phân tích từ vựng thành : danh từ - động từ - danh từ Như vậy, trình biên dịch khơng quan tâm ngữ nghĩa chữ “tôi”, “ăn”, “cơm” theo cách người (sử dụng tiếng Việt) nghĩ mà hiểu xuất có thứ tự đơn vị từ vựng (gọi token) Một số loại token trình biên dịch C : Token Bảng Mô Mô tả Các số với kiểu liệu (số nguyên, số thực, CONSTANT …) tả số Chuỗi (ví dụ “hello world”) STRING_VALUE Các danh biểu chương trình, bao gồm tên biến, IDENTIFIER tên hàm (bắt đầu chữ cái, theo sau chữ số) IF Lệnh if ELSE Lệnh else WHILE Lệnh while RIGHT_OP Toán tử shift right LEFT_OP Toán tử shift left INC_OP Toán tử ++ token ngơn ngữ C Ví dụ 1: Với câu nhập COUNT = COUNT + 1; Khi qua trình phân tích từ vựng, kết nhận chuỗi token sau : IDENTIFIER ASSIGN_OP IDENTIFIER ADD_OP CONSTANT PUNC Trình phân tích từ vựng giao tiếp trực tiếp với trình phân tích cú pháp qua giao thức đơn giản định nghĩa đầy đủ Giao thức thể qua hình vẽ : Hình Giao thức liên hệ phân tích từ vựng Qua đó, trình phân tích từ vựng nhận định nghĩa token từ trình phân tích cú pháp trả token phù hợp Chính giao tiếp đơn giản khiến cho phân tích từ vựng tỏ độc lập so với phần cịn lại trình biên dịch Theo giao thức trình bày Hình , trình phân tích từ vựng liên hệ trực tiếp với trình phân tích cú pháp vai trò thủ tục Do đó, thay đổi dù lớn hay nhỏ trình phân tích từ vựng khơng gây ảnh hưởng đến hoạt động chung trình biên dịch Tuy nhiên, có số trường hợp mà trình phân tích từ vựng, trình phân tích cú pháp bảng danh biểu cần có liên hệ mật thiết với để xử lý Ví dụ 2: Khai báo kiễu liệu người dùng tự định nghĩa typedef int Dummy; Hoặc struct Dummy { int first, second; }; Từ cấu trúc khai báo trở đi, Dummy sử dụng không hiểu danh biểu mà phải từ dành riêng, kiểu liệu người dùng định nghĩa Vì vậy, phân tích từ vựng trả token đặc biệt khác để phân tích cú pháp nhận dạng Dummy kiểu liệu Một công việc phân tích từ vựng xác định loại số chuyển sang dạng lưu trữ thích hợp (từ dạng liệu nhập chuỗi) Ví dụ 3: Với biễu diễn: 0b1010 : biểu diễn nhị phân số 10 012 : biểu diễn bát phân số 10 10 : biểu diễn thập phân số 10 0x10 : biểu diễn thập lục phân số 10 ta phải chuyển sang dạng lưu trữ với giá trị số thích hợp III PHÂN TÍCH CÚ PHÁP 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 có định dạng Các cấu trúc cú pháp mô tả văn phạm phi ngữ cảnh (Context Free Gramma – CFG) Trình phân tích cú pháp (parser) nhận chuỗi token từ trình phân tích từ vựng (Hình ), xác định chuỗi có hợp lệ hay khơng cách tạo phân tích cú pháp từ văn phạm ngơn ngữ nguồn Có phương pháp dùng để phân tích cú pháp theo tập văn phạm định nghĩa: • Phân tích cú pháp từ xuống (Top-Down Parsing) hay phân tích cú pháp dự đốn (Predictive Parser): ta cố gắng tìm kiếm chuỗi dẫn xuất trái cho chuỗi nhập cách xây dựng phân tích cú pháp nút gốc • Phân tích cú pháp từ lên (Bottom-Up Parsing): phân tích cú pháp chuỗi token cố gắng tìm kiếm luật sinh thích hợp để dẫn ký tự bắt đầu văn phạm ngơn ngữ nguồn token Trình phân tích từ vựng phân tích cú pháp Trình phân tích cú pháp biểu diễn trung gian Phần lại chuyến trước u cầu token Bảng danh biểu Hình Vị trí trình phân tích cú pháp chuyến trước trình biên dịch IV Bộ cơng cụ Flex Bison Bộ phát sinh trình phân tích từ vựng FLEX a Cấu trúc Cấu trúc chương trình FLEX : Phần khai báo (định nghĩa, khai báo biến, prototype) %% Biểu thức quy người dùng định nghĩa nhằm xác định token %% Các hàm hỗ trợ Phần khai báo chủ yếu phần định nghĩa biến, hàm khởi tạo mà ta đưa trực tiếp vào chương trình (mã C) Phần mã C giới hạn ký hiệu “%{“ “%}” FLEX copy tồn ký hiệu “%{“ “%}” trực tiếp vào file Lexer.c sau chạy FLEX Phần thứ hai biểu thức quy người dùng định nghĩa hay luật nhằm xác định loại token từ ký tự nhập vào Những luật phần bao gồm phần: biểu thức quy phương thức thực chuỗi nhập phù hợp với mẫu định nghĩa biểu thức quy Phương thức thực xác định nhờ cặp ngoặc “{“ “}” Ví dụ 1: Biểu thức quy phương thức thực xác định số thập lục 0[xX][a-fA-F0-9]+ { return CONSTANT; } Phần cuối hàm hỗ trợ cho trình phân tích từ vựng viết mã C đưa trực tiếp vào chương trình b Quy trình vận hành FLEX nhận định nghĩa token người dùng biểu thức quy, từ biên dịch (bằng trình biên dịch FLEX) sang ngơn ngữ C để chạy chương trình File mơ tả nguồn lex.l FLEX Compiler lex.yy.c C Compiler lex.out lex.out chuỗi token Chương trình nguồn lex.yy.c Hình Q trình phân tích từ vựng Sau phát sinh từ tập biểu thức quy, phân tích từ vựng định nghĩa hàm trả token (TOKEN yylex();) Khi yylex() gọi, phân tích chương trình nguồn thành đơn vị từ vựng tìm biểu thức quy phù hợp với đơn vị từ vựng Khi có đối sánh xuất hiện, yylex() thực phần mã C tương ứng với biểu thức quy chọn c Một số hàm hỗ trợ int main() : Thường ngầm hiểu khơng có người dùng nên tự định nghĩa hàm main riêng cho char *yytext Chuỗi giữ lexeme tại, kết thúc ký tự ‘\0’ int yyleng Chiều dài chuỗi yytext int yylineno Dòng chứa lexeme mà ta xét Nếu lexeme có nhiều dịng yylineno dịng cuối lexeme int input() Đọc, trả ký tự nhập ký tự cuối lexeme Ký tự thêm vào cuối lexeme (yytext) yyleng tự tăng lên đơn vị Hàm trả kết thúc file void unput(int c) unput đưa ký tự c ngược trở lại chuỗi nhập Khi lexeme giảm ký tự, yyleng giảm đơn vị Khi gọi input() ký tự c trả void yyless (int n) Tương tự unput đưa n ký tự trở lại chuỗi nhập n khơng vượt q yyleng void yymore() Biểu thức quy bỏ qua trường hợp đối sánh mà tiếp tục xét tiếp Ứng dụng yymore trường hợp xác định kiểu liệu chuỗi constant mà có chứa dấu nháy kép, chuỗi : “string with a \” in it” Khi đó, biểu thức quy phương thức thực : \”[^\”]\” { if (yytext[yyleng – 2] == ‘\\’) yymore(); else return STRING; } Trong đó, biểu thức quy \”[^\”]\” nhận chuỗi bắt đầu ký tự “, kết thúc ký tự “ chưa xét tới trường hợp chuỗi chứa ký tự “ “string with a \” in it” Rõ ràng chuỗi hợp lệ ta nhận dạng ký tự ” ký tự \ Do đó, yytext[yyleng – 2] == ‘\\’, tức ký tự trước ký tự nháy kép ký tự \ ta khơng dừng lại mà tiếp tục xét chuỗi nhập gặp ký báo hiệu kết thúc chuỗi thực (yymore()) ECHO Xuất lexeme hình console (stdout) Bộ phát sinh trình phân tích cú pháp BISON a Cấu trúc Tương tự FLEX, Bison nhận input file 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 file đặc tả ngơn ngữ gồm phần : - Phần khai báo: a Khai báo C thông thường (biến, prototype hàm, cấu trúc, đĩnh nghĩa ), giới hạn %{ %} FLEX b Khai báo kiểu liệu thuộc tính tổng hợp c Khai báo token thuộc tính kết hợp với token (nếu có) d Khai báo thuộc tính kết hợp với ký hiệu khơng kết thúc Ví dụ 1: Văn phạm thuộc tính số ký hiệu không kết thúc file input Bison %union { struct symbol *sym; struct value *val; struct operand *op; struct sym_link *lnk ; char yychar[255]; int yyint; } %token ID TYPE_NAME %type stmt_list stmt %type unary_op assignment_op %type id Khi đó, ký tự không kết thúc stmt, stmt_list… có thuộc tính biến struct operand*, ký tự khơng kết thúc unary_op, assignment_op có thuộc tính biến kiểu liệu sở int Ngoài ra, token (ký tự kết thúc) ID, TYPE_NAME khai báo kèm theo thuộc tính char[] để biểu diễn kiểu liệu dạng chuỗi - Phần mơ tả tập luật sinh hình thành nên ngôn ngữ: Trong luật sinh, ký tự nằm cặp dấu nháy đơn 'c' ký hiệu kết thúc c, chuỗi chữ chữ số không nằm cặp dấu nháy đơn không khai báo token ký hiệu chưa kết thúc Hành vi ngữ nghĩa Bison chuỗi lệnh mã C với: • $$ Giá trị thuộc tính kết hợp với ký hiệu chưa kết thúc bên vế trái luật sinh • $n Giá trị thuộc tính kết hợp với ký hiệu văn phạm thứ n (ký hiệu kết thúc chưa kết thúc) vế phải - Các hàm hỗ trợ Ngôn ngữ chủ yếu để mơ tả luật hình thành nên parser CFG (văn phạm phi ngữ cảnh) Và dạng tiêu chuẩn để mô tả CFG mà BISON áp dụng BNF (Backus-Naur Form) [5]– dùng để miêu tả ngơn ngữ Algol 60 Ví dụ 3: Mơ tả dạng BNF cho ngôn ngữ xây dựng biểu thức đơn giản ::= ::= ‘+’ | ::= ‘*’ | ::= ‘(‘ ‘)’ | NUM Mỗi dòng luật sinh cách hình thành nên nhánh phân tích cú pháp Bison đơn giản hóa BNF để dễ sử dụng Ví dụ 2: Mơ tả Bison cho ngơn ngữ đưa Ví dụ s e t f | : : | : | : NUM e e ‘+’ t t t ‘*’ f f ‘(‘ e’)’ Văn phạm thuộc tính Bison thể phần khai báo Ta gán cho ký hiệu kết thúc ký hiệu khơng kết thúc thuộc tính kiểu liệu sở, cấu trúc tự định nghĩa b Quy trình vận hành Bison nhận tập tin mô tả ngữ pháp (luật sinh, luật ngữ nghĩa) để qua phát sinh phân tích cú pháp (viết ngơn ngữ C) Bộ phân tích cú pháp biên dịch chung với chương trình defines sử dụng thủ tục (yyparse()) Mô tả tập luật sinh, luật ngữ nghĩa (*.y) verbose Bản mô tả trạng thái (y.out) Bison Bản định nghĩa token Bộ phân (yyout.h) tích cú pháp mã C (yyout.c) Hình Quá trình phân tích cú pháp BISON Khi yyparse() gọi, dựa vào trạng thái bảng ACTION-GOTO để chọn hành vi thích hợp, đồng thời, thực luật ngữ nghĩa ứng với văn phạm sau rút gọn Ngồi ra, BISON tạo file định nghĩa token (đã khai báo) sử dụng chung trình phân tích từ vựng trình phân tích cú pháp Phương pháp phân tích lên sử dụng Stack để lưu trữ thông tin phân tích Chúng ta mở rộng Stack để lưu trữ giá trị thuộc tính tổng hợp Stack cài đặt cặp mảng trạng thái giá trị Ví dụ 5: Hoạt động stack lưu trữ trạng thái giá trị (val) stmt_list1 : stmt_list2 stmt Trước stmt_list2 stmt rút gọn thành stmt_list thì: stack[top].val = stmt.op stack[top - 1].val = stmt_list2.op Sau rút gọn, top giảm đơn vị ( top = top – 1), stack[top].val = stmt_list1.op Với cách xử lý này, Bison sử dụng thuộc tính ký hiệu thơng qua stack value Khi muốn sử dụng thuộc tính op stmt_list2 ta cần gọi $1, tương tự gọi $2 stmt.Khi biên dịch qua ngôn ngữ C, Bison đối xử với $1 yyvsp[1].op, $2 yyvsp[0].op Sau rút gọn, trỏ yyvsp cập nhật để đẩy stmt_list1.op vào stack nằm đỉnh stack (yyvsp[0]) ... cách tạo phân tích cú pháp từ văn phạm ngơn ngữ nguồn Có phương pháp dùng để phân tích cú pháp theo tập văn phạm định nghĩa: • Phân tích cú pháp từ xuống (Top-Down Parsing) hay phân tích cú pháp. .. ngôn ngữ nguồn token Trình phân tích từ vựng phân tích cú pháp Trình phân tích cú pháp biểu diễn trung gian Phần lại chuyến trước yêu cầu token Bảng danh biểu Hình Vị trí trình phân tích cú pháp. .. ta cố gắng tìm kiếm chuỗi dẫn xuất trái cho chuỗi nhập cách xây dựng phân tích cú pháp nút gốc • Phân tích cú pháp từ lên (Bottom-Up Parsing): phân tích cú pháp chuỗi token cố gắng tìm kiếm luật

Ngày đăng: 17/04/2016, 21:22

Từ khóa liên quan

Mục lục

  • I. GIỚI THIỆU

  • II. PHÂN TÍCH TỪ VỰNG

  • III. PHÂN TÍCH CÚ PHÁP

  • 1. Bộ phát sinh trình phân tích từ vựng FLEX

    • a. Cấu trúc.

    • b. Quy trình vận hành.

    • c. Một số hàm hỗ trợ.

    • 2. Bộ phát sinh trình phân tích cú pháp BISON

      • a. Cấu trúc.

        • - Phần khai báo:

        • Phần mô tả tập luật sinh hình thành nên ngôn ngữ:

        • Các hàm hỗ trợ.

        • b. Quy trình vận hành.

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

Tài liệu liên quan