Chương trình dịch: Là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình (mã nguồn), thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ mới (gọi là ngôn ngữ đích hay mã đích) và thường là ngôn ngữ ở cấp thấp hơn, như ngôn ngữ máy Bộ phân tích cú pháp BISON: Bộ phát sinh ra trình phân tích cú pháp (Bắt nguồn từ Yacc (Yet Another Compiler Compiler), Stephen C. Johnson, Bell Lab, 1970) Bộ phân tích từ vựng FLEX: Bộ phát sinh trình phân tích từ vựng – để hỗ trợ Bison trong việc xác định các token từ chuỗi nhập (Bắt nguồn từ lex, Mike Lesk và Eric Schmidt).
Trang 1Tìm hiểu Chương trình dịch, bộ
công cụ Flex & Bison
Giảng viên hướng dẫn: TS Phạm Đăng Hải
Học viên thực hiện: 1
2
Lớp: 3
Trang 2
NỘI DUNG TÌM HIỂU
TỔNG QUAN VỀ CHƯƠNG TRÌNH DỊCH
THIẾT KẾ CHƯƠNG TRÌNH DỊCH
BỘ CÔNG CỤ FLEX VÀ BISON
DEMO
Trang 3 Là một chương trình máy tính làm công việc dịch
một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình (mã nguồn), thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ mới (gọi là ngôn ngữ đích hay mã đích) và thường là
ngôn ngữ ở cấp thấp hơn, như ngôn ngữ máy
I TỔNG QUAN VỀ CHƯƠNG TRÌNH DỊCH
Trang 4 Cấu trúc của trình biên dịch
Trang 5 Quá trình thực hiện
1 Giai đoạn tiền xử lý:
Analysis), phân tích ngữ nghĩa
2 Giai đoạn dịch:
mã máy
3 Giai đoạn liên kết (link):
khác nhau được liên kết lại với nhau để tạo thành chương trình đích duy
nhất (executable hay exe)
I TỔNG QUAN VỀ CHƯƠNG TRÌNH DỊCH
Trang 6 Quá trình dịch ngôn ngữ C
Trang 7II THIẾT KẾ CHƯƠNG TRÌNH DỊCH
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 được gọi là quá trình quét nguyên liệu) để tách ra thành các thẻ (token)
Trang 8Token Mô tả
CONSTANT Các hằng số với các kiểu dữ liệu (số nguyên, số thực,…)
STRING_VALUE Chuỗi hằng (ví dụ “hello world”)
IDENTIFIER Các danh biểu trong chương trình, bao gồm tên biến, tên hàm (bắt đầu là chữ cái, theo
sau là chữ hoặc số)
RIGHT_OP Toán tử shift right
LEFT_OP Toán tử shift left
INC_OP Toán tử ++
Bảng: Một số token của ngôn ngữ C
Phân tích từ vựng
Trang 9II THIẾT KẾ CHƯƠNG TRÌNH DỊCH
Phân tích cú pháp
Trình phân tích cú pháp (parser) nhận chuỗi các token từ
trình phân tích từ vựng và xác định rằng chuỗi này có hợp lệ hay không bằng cách tạo ra cây phân tích cú pháp
từ văn phạm của ngôn ngữ nguồn
Bảng danh biểu
cây phân tích cú pháp
token
yêu cầu token
ngôn ngữ nguồn
biểu diễn trung gian
Trang 10 Phân tích cú pháp
Phân tích cú pháp từ trên xuống (Top-Down Parsing)
hay phân tích cú pháp dự đoán (Predictive Parser): Bắt đầu từ nút gốc
Phân tích cú pháp từ dưới lên (Bottom-Up Parsing): Bắt
đầu từ chuỗi token và cố gắng tìm kiếm luật sinh thích hợp để có thể dẫn về ký tự bắt đầu của văn phạm
Trang 11II THIẾT KẾ CHƯƠNG TRÌNH DỊCH
Tổ chức bảng ký hiệu
Bảng ký hiệu là một cấu trúc dữ liệu mà mỗi phần tử là
một mẫu tin dùng để lưu trữ một token được bộ phân tích từ vựng nhận biết và các thông tin của token đó
Các thủ tục trên bảng ký hiệu chủ yếu liên quan đến việc
lưu trữ và truy xuất các trị từ vựng Khi một trị từ vựng được lưu trữ thì token kết hợp với nó cũng được lưu Hai thao tác sau được thực hiện trên bảng ký hiệu
o Insert (s, t): Trả về chỉ mục của một ô mới cho chuỗi s, token t.
o Lookup (s): Trả về chỉ mục của ô cho chuỗi s hoặc 0 nếu chuỗi s
không tồn tại.
Trang 12 Tổ chức bảng ký hiệu
Thông thường, một bảng ký hiệu gồm hai mảng :
1 Mảng lexemes (trị từ vựng) dùng để lưu trữ các chuỗi ký tự tạo ra
một danh biểu, các chuỗi này ngăn cách nhau bởi các ký tự EOS (end -
of - string).
2 Mảng symtable với mỗi phần tử là một mẩu tin (record) bao gồm hai
trường, trường con trỏ lexptr trỏ tới đầu trị từ vựng và trường token
Trang 13III BỘ CÔNG CỤ FLEX VÀ BISON
BISON: Bộ phát sinh ra trình phân tích cú pháp
(Bắt nguồn từ Yacc (Yet Another Compiler Compiler), Stephen C Johnson, Bell Lab, 1970)
FLEX: Bộ phát sinh trình phân tích từ vựng – để
hỗ trợ Bison trong việc xác định các token từ chuỗi nhập (Bắt nguồn từ lex, Mike Lesk và Eric
Schmidt).
Trang 14 FLEX: Bộ phát sinh trình phân
tích từ vựng – để hỗ trợ Bison trong việc xác định các token từ chuỗi nhập (Bắt nguồn từ lex, Mike Lesk và Eric Schmidt).
BISON: Bộ phát sinh ra trình
phân tích cú pháp (Bắt nguồn
từ Yacc (Yet Another Compiler Compiler), Stephen C Johnson, Bell Lab, 1970)
Trang 15III BỘ CÔNG CỤ FLEX VÀ BISON
FLEX
Là 1 open-source tool cho Bộ phát sinh từ vựng
Flex đọc user-specified input files
• Nếu không có file => Đọc standard file
Flex INPUT file:
• Là một mô tả của bộ scanner sinh mã
• Miêu tả là các cặp Biểu thức Regular Expressions và C
Code gọi là RULES
Trang 16 FLEX Flex Source
File (sample.l)
Flex Compiler (Flex)
Lexical Analyzer Code (lex.yy.c)
C Compiler
Lexical Analyzer executable
Input Text File
Output: Tokens
Parser
Trang 17III BỘ CÔNG CỤ FLEX VÀ BISON
FLEX & BISON
.lex
Trang 18 Flex file format
Definitions >> rules >> user-defined routines
Trang 19III BỘ CÔNG CỤ FLEX VÀ BISON
Flex Source
Rules
o Format
o <regular-expression> {<actions>}
o When a Lexical Analyzer is run (or the scanning routine yylex() is
called) it analyzes the input for the occurrences of text patterns that match the regular expressions When ever it finds one it executes the corresponding action.
o Flex stores the matched text in a global string variable called yytext
[0-9]+ { printf(“An integer %s \n”, yytext); } [a-z][a-z0-9]* { printf(“An identifier %s \n”, yytext);}
if | then | begin | end | function { printf(“A Keyword %s \n”, yytext); }
Trang 20int main(void){ /**/
yyparse();
return 0;
}
Trang 21III BỘ CÔNG CỤ FLEX VÀ BISON
BISON
Là bộ phát sinh ra trình phân tích cú pháp có nhiệm vụ
chuyển đổi một văn bản chưa có cú pháp thành một deterministic [LR or generalized LR (GLR)] parser
Có thể phát triển trên nhiều ngôn ngữ lập trinh khác
nhau
Tương thích với YACC
Dựa trên C\C++ và chạy được trên Java
Trang 23III BỘ CÔNG CỤ FLEX VÀ BISON
BISON
Bas.y (Parser Input):
o Y.tab.h (Parser Output): là file header, định nghĩa các token
như NUM, OPA, etc., và biến yylval để truyền sang bison code các giá trị của tokens
o Y.tab.c (Parser Output): chứa mã C\C++ cho bộ phân tích
(là function có tên yyparse())
Bas.l (Lexica Analyzer Input):
o Sử dụng các định nghĩa trong (Y.tab.h) để thực thi yylex() function và truyền các thông tin trả lại.
o Lex.yy.c (Lexica Analyzer Output): generated by FLEX
that contains, among other things, the definition of the yylex() function
Trang 24 Ví dụ BISON: Vidu1.y
Vidu1.y
/* Phần khai báo: Chứa các token được định nghĩa */
%token EVEN ODD
/* Phần mô tả tập luật sinh */
%%
input:
EVEN { printf("EVEN NUMBER\n"); return 0; }
|ODD { printf("ODD NUMBER\n"); return 0; }
Trang 25return 0;
} int yyerror(char *errormsg){
fprintf(stderr, "%s\n", errormsg);
exit(1);
}
Trang 26hi:
HI { printf("Xin chao!\n"); } ;
bye:
BYE { printf("Tam biet!\n"); exit(0); }
IV DEMO (2/7)
Trang 27 Ví dụ 1:
Gõ lệnh flex Hello.l
Kết quả dược file lex.yy.c
Gõ lệnh bison –dy Hello.y
Kết quả dược 2 file y.tab.c và
y.tab.h
Gõ lệnh gcc lex.yy.c y.tab.c
Kết quả dược file a.exe
Để chạy chương trình, gõ a
Gõ “xin chao” hoặc “hi”, hoặc
“hello”, hoặc “bye”,… để kiểm tra
Trang 28return 0;
} int yyerror(void){
printf("Error\n");
exit(1);
}
IV DEMO (4/7)
Trang 29EVEN { printf("EVEN NUMBER\n"); return 0; }
|ODD { printf("ODD NUMBER\n"); return 0; }
;
IV DEMO (5/7)
Trang 30 Ví dụ 2:
Gõ lệnh flex vidu2.l
Kết quả dược file lex.yy.c
Gõ lệnh bison –dy vidu2.y
Kết quả dược 2 file y.tab.c và
Trang 31 Ví dụ 3: Chương trình
Calculator
Gõ lệnh flex calculator.l
Kết quả dược file lex.yy.c
Gõ lệnh bison –dy calculator.y
Kết quả dược 2 file y.tab.c và
Trang 32CHÂN THÀNH CẢM ƠN