Phân tích từ vựng

Trong ngành khoa học máy tính, phân tích từ vựng (Tiếng Anh::Lexical analysis, còn được gọi là scanning hoặc lexing) là một quá trình chuyển đổi chuỗi ký tự nguồn thành một chuỗi liên tiếp các đoạn ký tự ngắn hơn đã được phân loại, gọi là dấu hiệu. Chương trình dùng để phân tích từ vựng được gọi là bộ phân tích từ vựng (tiếng Anh là lexer).

Quá trình phân tích từ vựng trong các giai đoạn xử lý.

Dấu hiệu từ vựngSửa đổi

Dấu hiệu từ vựng (lexical token), hay đơn giản là dấu hiệu, tương tự như loại từ trong ngôn ngữ học. Nó được xây dựng thành cặp gồm mọt tên dấu hiệu và một giá trị dấu hiệu tuỳ chọn. Tên dấu hiệu là một loại đơn vị từ vựng.[1] Tương tự như danh từ, tính từ và động từ, dấu hiệu sẽ được nhiều loại tùy theo đặc điểm của trình biên dịch. Một số tên dấu hiệu phổ biến gồm:

Tên dấu hiệu Ví dụ
định danh

(identifier)

x, color, UP
từ khoá

(keyword)

if, while, return
dấu ngăn cách

(separator)

}, (, ;
toán tử

(operator)

+, <, =
nguyên văn

(literal)

true, 6.02e23, "âm nhạc"
chú thích

(comment)

/* Lấy dữ liệu người dùng */, // phải là số nguyên âm

Ngữ pháp từ vựngSửa đổi

Phần đặc tả của một ngôn ngữ lập trình thường bao gồm một tập hợp các quy tắc, gọi là ngữ pháp từ vựng, định nghĩa các cú pháp từ vựng. Cú pháp từ vựng thường là một ngôn ngữ chính quy, với các quy tắc ngữ pháp gồm các biểu thức chính quy; chúng định nghĩa tập hợp các chuỗi kí tự có thể (vị từ) của một dấu hiệu. Một bộ phân tích từ vựng nhận diện các xâu, và với mỗi loại xâu tìm thấy thì thực hiện một hành động, chủ yếu chỉ đơn giản là tạo ra một dấu hiệu.

Quá trìnhSửa đổi

 
Quá trình phân tích từ vựng tạo ra các dấu hiệu (token) cho bước phân tích cú pháp tiếp theo.

Các nhiệm vụ của quá trình phân tích từ vựng gồm:

  • Đọc các ký tự đầu vào
  • Phát sinh các chuỗi dấu hiệu đầu ra
  • Bỏ khoảng trắng, cách dòng, tab
  • Ghi lại vị trí các dấu hiệu được dùng cho bước xử lý tiếp theo.

Các công cụ phát sinh mã phân tích từ vựngSửa đổi

  • ANTLR - ANTLR phát sinh cú pháp predicated-LL(k).
  • Flex - Biến thể thay thế của dạng cổ điển "lex" (C/C++).
  • JFlex - Viết lại của JLex.
  • Ragel - Máy quét từ vựng hỗ trợ đầu ra cho mã nguồn C, C++, C#, Objective-C, D, Java, GoRuby.

Các công cụ phát sinh có thể xử lý Unicode:

  • JavaCC - JavaCC phát sinh phân tích từ vựng viết trong Java.
  • JLex - Công cụ phát sinh phân tích từ vựng dành cho Java.
  • Quex (hoặc "Queχ") - Công cụ phát sinh phân tích từ vựng nhanh cho CC++.

Xem thêmSửa đổi

Tham khảoSửa đổi

  1. ^ page 111, "Compilers Principles, Techniques, & Tools, 2nd Ed." (WorldCat) by Aho, Lam, Sethi and Ullman, as quoted in https://stackoverflow.com/questions/14954721/what-is-the-difference-between-token-and-lexeme

Liên kết ngoàiSửa đổi