Phân tích từ vựng (lexical analysis):

Một phần của tài liệu Giáo trình lý thuyết ngôn ngữ hình thức và ôtômát (Trang 78)

7) Sinh mã đối tượng.

5.2.2. Phân tích từ vựng (lexical analysis):

Dòng nhập vào trình biên dịch là chuỗi các ký tự cho phép của một ngôn ngữ lập trình, cũng là chuỗi nhập vào bộ phân tích từ vựng.

Chẳng hạn, đối với ngôn ngữ Pascal, các ký tự alphabet là các ký tự sau: A…Z, a…z, $ @ 0 1 2…9 dấu trống − + = := / ∗ ( ), & >=…

Trong chương trình nguồn, sự kết hợp một số ký tự alphabet sẽ tạo nên một thực thể của ngôn ngữ. Chẳng hạn, BEGIN là sự kết hợp 5 ký tự B, E, G, I, N tạo nên thực thể là từ khoá BEGIN.

Các thực thể

1. Ký hiệu trống, dấu tab, dấu xuống hàng,

2. Từ khoá: begin, end, goto, while, do, integer…, 3. Chuỗi các ký tự số tượng trưng cho hằng số,

4. Danh biểu, dùng đểđặt tên cho các biến, hàm thủ tục, nhãn, 5. Các ký hiệu đặc biệt: +, −, /, ∗, :=, ;, =, >, >=, <, <=,

được gọi là các token.

Nhiệm vụ của bộ phân tích từ vựng là khi tiếp nhận chuỗi ký tự nhập phải biết nhóm các ký tự thành các thực thể cú pháp token. Token là ký hiệu kết thúc, mỗi token sẽ có một cấu trúc từ vựng. Cấu trúc từ vựng này là một cặp (loại token, dữ liệu), gồm hai thành phần:

Thành phần thứ nhất là phạm trù cú pháp: hằng, biến.

Thành phần thứ hai là con trỏ, chỉ đến thông tin của token, được cất giữ trong bảng, được gọi là bảng danh biểu (symbol table).

Với ngôn ngữ lập trình cho trước, số lượng loại token là hữu hạn. Tóm lại bộ phân tích từ vựng là bộ dịch (translator) mà đầu nhập của nó là chuỗi các ký tự, tượng trưng cho chương trình nguồn, đầu ra là các token. Dạng đầu ra này là đầu nhập của bộ phân tích cú pháp.

Thí dụ 3: Chương trình nguồn là phát biểu gán trong ngôn ngữ Pascal: COST:=(PRICE+TAX)∗65

Bộ phân tích từ vựng có nhiệm vụ nhận biết: COST, PRICE, TAX là nhóm token thuộc loại danh biểu, 65 là token thuộc loại hằng. Các ký tự :=, (, ), +, ∗ tự bản thân là token.

Giả sử tất cả các hằng, danh biểu là các token có loại <num> và <id>. Thành phần thứ hai là dữ liệu, ở đây chính là con trỏ chỉ đến vị trí của các token đó trong bảng danh biểu, chứa đựng trị từ vựng (lexeme) của token và các thuộc tính khác của token. Thành phần thứ nhất của token sẽ được dùng trong giai đoạn phân tích cú pháp. Thành phần thứ hai của token được dùng trong giai đoạn xử lý ngữ nghĩa và sinh mã đối tượng.

(<id>, 1):=(<id>, 2)+(<id>, 3)∗(<num>, 4) Để đơn giản ta viết lại như sau:

id1:=(id2+id3)∗num4

Các chỉ số 1, 2, 3, 4 là con trỏ của token tương ứng trong bảng danh biểu. Các ký hiệu :=, (, ), +, ∗ là các token, loại token sẽ được hiểu là chính nó, không có dữ liệu, nên chúng không có thành phần thứ hai là con trỏ.

Sự phân tích từ vựng sẽđơn giản nếu token có nhiều hơn một ký tự, được cô lập bởi các ký tự mà tự chúng là token. Ở thí dụ trên, ta thấy COST, PRICE, TAX, 65 là các token, được tạo bởi nhiều hơn một ký tự được cô lập bởi các token :=, (, +, ), ∗. Rõ ràng :=, (, +, ), ∗ không thể là một thành phần trong COST, PRICE, TAX, 65. Song trong các trường hợp khác thì phân tích từ vựng không phải đơn giản như vậy.

Thí dụ 4: Trong Fortran ta có hai phát biểu sau: (1) DO 10 I=1.15

(2) DO 10 I=1,15

Giả sử dấu trống được bỏ qua khi bộ phân tích từ vựng xét các ký tự. Như vậy ở trường hợp (1) DO10I là biến và 1.15 là hằng và (1) là phát biểu gán. Trong trường hợp (2) DO là từ khoá, I là biến vòng DO, 1 và 15 là hằng. Trong hai trường hợp trên, bộ phân tích từ vựng chỉ xác định được token kế tiếp khi gặp dấu ‘.’ trong (1) và dấu ‘,’ trong (2).

Như vậy bộ phân tích từ vựng cần phải nhìn thấy trước một token. Nhưng nhìn thấy trước một token nhiều khi cũng chưa đủ.

Chẳng hạn, DECLARE(X1, X2, …, Xn) trong ngôn ngữ PL/I. Bộ phân tích từ vựng sẽ không thể nói được DECLARE là tên hàm và X1, X2, …, Xn là các đối số của hàm hay DECLARE là từ khoá khai báo biến, X1, X2, …, Xn là các danh biểu mà kiểu dữ liệu của chúng sẽ đứng ngay sau dấu đóng ngoặc ‘)’. Muốn kết luận được một trong hai trường hợp là đúng, bộ phân tích từ vựng phải có khả năng nhìn trước một khoảng cách bất kỳ. Tuy nhiên, ta có thể nghĩ đến cách phân tích từ vựng khác, tránh được vấn đề nhìn trước một khoảng bất kỳ. Từ những suy nghĩ trên mà ta có hai cách tiếp cận với việc phân tích từ vựng. Hầu hết các kỹ thuật được sử dụng để phân tích từ vựng cũng nằm một trong hai phạm trù trên.

Bộ phân tích từ vựng thao tác trực tiếp: Nếu có một chuỗi ký tự của văn bản nhập và có con trỏ trong văn bản, đánh dấu vị trí bắt đầu tìm token thì bộ phân tích từ vựng sẽ xác định được ngay token nằm phía bên phải của vị trí con trỏ. Sau đó nó sẽ chuyển vị trí con trỏ về bên phải, ở vị trí ký tự đầu tiên, đứng sau ký tự cuối cùng của token vừa được xác định.

Bộ phân tích từ vựng thao tác không trực tiếp: Nếu với chuỗi ký tự của văn bản nhập cho trước, có con trỏ trong văn bản và loại token cho trước, bộ phân tích từ vựng sẽ xác định được token nếu các ký tự đứng ngay sau con trỏ tạo nên token của loại token cho trước. Nếu đúng, con trỏ sẽ được chuyển đến ký tự đứng ngay sau token vừa được xác định.

Một phần của tài liệu Giáo trình lý thuyết ngôn ngữ hình thức và ôtômát (Trang 78)

Tải bản đầy đủ (PDF)

(90 trang)