Tài liệu Hướng dẫn tạo bộ phân tích từ vựng cho ngôn ngữ Pascal - Pdf 86

Hướng dẫn tạo bộ phân tích từ vựng cho ngôn ngữ Pascal

Xin hướng dẫn tạo bộ phân tích từ vựng cho ngôn ngữ Pascal, tức là
chương trình đọc tệp .pas và in kết quả phân tích từ vựng ra màn hình.
Cách dễ dàng và nhanh chóng nhất để xây dựng bộ phân tích từ vựng cho 1
ngôn ngữ nào đó là dùng ngôn ngữ Lex (Lexical Analyzer Generator). File
Lex chứa các biểu thức chính quy, mỗi biểu thức chính quy miêu tả 1 token cụ thể của ngôn ngữ,
định dạng tổng quát của file Lex như sau:

%{
//các lệnh định nghĩa viết bằng C hay C++
%}
%%
//các biểu thức chính quy nhận dạng các token
%%
//các đoạn code C hay C++ miêu tả ứng dụng

Sau đây là file Lex đọc file mã nguồn pascal rồi xuất ra danh sách các token tương ứng:
%{
#include <stdlib.h>
//định nghĩa các biến cần dùng
unsigned char ch;
unsigned yline = 1;
char buff[2048];
//hàm dò chuỗi chú thích
void scan_comment() {
unsigned char ch;
while ((ch=input())>0 && ch != '}')
if (ch == '\n') yline++;
if (ch == '}') return;
fprintf (stderr,"EOF duoc tim thay trong luc do chu thich (hang %d)\n",yline);

">" { printf ("[thanop] "); }
"(" { printf ("[lparent] "); }
")" { printf ("[rparent] "); }
"," { printf ("[comma] "); }
";" { printf ("[pcomma] "); }
":" { printf ("[toodot] "); }
":=" { printf ("[assign] "); }
"=" { printf ("[equal] "); }
"." { printf ("[dot] "); }
[-][0-9]+ |
[0-9]+ { printf ("[iconst,%s] ", yytext); }
[0-9]*[.][0-9]* |
[-][0-9]*[.][0-9]* |
[0-9]*[.][0-9]*[eE][-]*[0-9]+ |
[-][0-9]*[.][0-9]*[eE][-]*[0-9]+ { printf ("[rconst,%s] ", yytext); }
[pP][rR][oO][gG][rR][aA][mM] { printf ("[program] "); }
[uU][sS][eE][sS] { printf ("[uses] "); }
[vV][aA][rR] { printf ("[var] "); }
[tT][yY][pP][eE] { printf ("[type] "); }
[bB][eE][gG][iI][nN] { printf ("[begin] "); }
[eE][nN][dD] { printf ("[end] "); }
[fF][uU][nN][cC][tT][iI][oO][nN] { printf ("[function] "); }
[pP][rR][oO][cC][eE][dD][uU][rR][eE] { printf ("[procedure] "); }
[iI][fF] { printf ("[if] "); }
[tT][hH][eE][nN] { printf ("[then] "); }
[eE][lL][sS][eE] { printf ("[else] "); }
[dD][oO] { printf ("[do] "); }
[rR][eE][pP][eE][aA][tT] { printf ("[repeat] "); }
[uU][nN][tT][iI][lL] { printf ("[until] "); }
[a-zA-Z][a-zA-Z0-9\_]* { printf ("[ident,%s] ", yytext);}

"output" để tham khảo sau đó.

Lưu ý rằng chuỗi token nhận dạng được bởi bộ phân tích từ vựng thường được gửi tới bộ phân
tích cú pháp chứ ít ai hiển thị hay xuất ra file như thí dụ trên.

Bạn có thể tải tiện ích FLEX trên Internet (đây là ứng dụng mã nguồn mở).

Tôi muốn viết một ứng dụng đọc và hiển thị file TXT dạng Unicode trên Windows, nhưng tôi
không thể hiển thị đúng các ký tự Unicode mặc dù đã sử dụng kiểu widestring và widechar.

Mặc dù mã Unicode đã được chuẩn hóa và tổng quát để miêu tả đồng thời nhiều ký tự củ
a nhiều
ngôn ngữ, nhưng hiện nay việc hiện thực xử lý mã Unicode không hoàn hảo, tùy vào môi trường
lập trình và ngôn ngữ lập trình được dùng mà mức độ hỗ trợ mã Unicode rất khác nhau. Thí dụ
nếu bạn dùng môi trường .Net (VC#, VJ#, VB .Net) thì mức độ hỗ trợ mã Unicode là rất tốt, hầu
như trong suốt hoàn toàn với code mà bạn viết. Tuy nhiên nếu bạn dùng VB hay tệ hơn là VC++
thì mức độ hỗ trợ mã Unicode còn khá thấp và chưa được trong suốt cho người lập trình. Thí dụ
các đối tượng giao diện có sẵn của môi trường VB 6.0 trở xuống không thể hiển thị đúng được
chuỗi Unicode, bạn phải dùng các đối tượng tương ứng trong thư viện Form2 kèm theo VB. Còn
trong VC++, nếu bạn dịch ứng dụng ở chế độ mặc định (ANSI) thì ứng dụng sẽ không xử lý
được chuỗi Unicode. Điều kiện tiên quyết để viết ứng dụng xử lý tốt chuỗi Unicode trong VC++
là phải dịch ứng dụng ở chế độ Unicode (dùng macro dịch là -D "Unicode"). Về mặt lập trình
VC++, nếu bạn muốn xử lý chuỗi Unicode cấp thấp hay muốn gọi các hàm API Windows để xử
lý chuỗi Unicode, bạn sẽ dùng kiểu dữ liệu widechar và widestring để định nghĩa các biến chứa
ký tự hay chuỗi Unicode. Lưu ý rằng Windows chia tập các hàm có thông số chuỗi ra thành 2
loại: loại chỉ xử lý chuỗi ANSI và loại chỉ xử lý chu
ỗi Unicode. Thí dụ hàm TextOut() chỉ hiển
thị chuỗi ANSI, còn hàm TextOutW() chỉ hiển thị chuỗi Unicode. Việc chuyển chuỗi ANSI về
mã Unicode luôn thành công, nhưng ngược lại, việc chuyển chuỗi Unicode về ANSI có thể làm
mất thông tin.

buf[4] = 0x1ec5; buf[5] = 'n';
buf[6] = ' '; buf[7] = 'V';
buf[8] = 0x103; buf[9] = 'n';
buf[10] = ' '; buf[11] = 'H';
buf[12] = 'i'; buf[13] = 0x1ec7;
buf[14] = 'p'; buf[15] = 0;
//xuất chuỗi Unicode "Nguyễn Văn Hiệp" ra tọa độ (10,100)
TextOutW(hDC,10,100,buf, wcslen(buf));
//xuất chuỗi Unicode "Nguyễn Văn Hiệp" ra TextBox
UpdateData(TRUE);
m_edit = buf;
UpdateData(FALSE);
 


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status