Phân tích từ vựng trong thiết kế trình biên dịch với ví dụ

Mục lục:

Anonim

Phân tích Lexical là gì?

PHÂN TÍCH PHÁP LÝ là giai đoạn đầu tiên trong quá trình thiết kế trình biên dịch. Lexer lấy mã nguồn đã sửa đổi được viết dưới dạng câu. Nói cách khác, nó giúp bạn chuyển đổi một chuỗi ký tự thành chuỗi mã thông báo. Trình phân tích từ vựng chia cú pháp này thành một loạt các mã thông báo. Nó loại bỏ bất kỳ không gian thừa hoặc nhận xét nào được viết trong mã nguồn.

Các chương trình thực hiện phân tích từ vựng được gọi là máy phân tích từ vựng hoặc máy phân tích từ vựng. Một lexer chứa tokenizer hoặc máy quét. Nếu trình phân tích từ vựng phát hiện ra rằng mã thông báo không hợp lệ, nó sẽ tạo ra lỗi. Nó đọc các luồng ký tự từ mã nguồn, kiểm tra các mã thông báo hợp pháp và chuyển dữ liệu đến trình phân tích cú pháp khi nó yêu cầu.

Thí dụ

How Pleasant Is The Weather?

Xem ví dụ này; Ở đây, chúng ta có thể dễ dàng nhận ra đó là 5 từ How Pleasant, The, Weather, Is. Điều này là rất tự nhiên đối với chúng tôi vì chúng tôi có thể nhận ra các dấu phân cách, khoảng trống và ký hiệu dấu câu.

 HowPl easantIs Th ewe ather?

Bây giờ, hãy kiểm tra ví dụ này, chúng ta cũng có thể đọc điều này. Tuy nhiên, sẽ mất một thời gian vì các dải phân cách được đặt ở các Vị trí Kỳ quặc. Nó không phải là một cái gì đó đến với bạn ngay lập tức.

Trong hướng dẫn này, bạn sẽ học

  • Các thuật ngữ cơ bản:
  • Kiến trúc máy phân tích Lexical: Cách mã thông báo được nhận dạng
  • Vai trò của máy phân tích Lexical
  • Lỗi Lexical
  • Khôi phục lỗi trong Lexical Analyzer
  • Lexical Analyzer so với Parser
  • Tại sao phải tách Lexical và Parser?
  • Ưu điểm của phân tích Lexical
  • Nhược điểm của phân tích Lexical

Các thuật ngữ cơ bản

Lexeme là gì?

Lexeme là một chuỗi các ký tự được đưa vào chương trình nguồn theo mẫu khớp của mã thông báo. Nó không là gì ngoài một ví dụ của mã thông báo.

Mã thông báo là gì?

Mã thông báo là một chuỗi các ký tự đại diện cho một đơn vị thông tin trong chương trình nguồn.

Mẫu là gì?

Mẫu là một mô tả được sử dụng bởi mã thông báo. Trong trường hợp từ khóa sử dụng làm mã thông báo, mẫu là một chuỗi các ký tự.

Kiến trúc máy phân tích Lexical: Cách mã thông báo được nhận dạng

Nhiệm vụ chính của phân tích từ vựng là đọc các ký tự đầu vào trong mã và tạo ra các mã thông báo.

Lexical analyzer quét toàn bộ mã nguồn của chương trình. Nó xác định từng mã thông báo một. Máy quét thường được triển khai để tạo mã thông báo chỉ khi được trình phân tích cú pháp yêu cầu. Đây là cách nó hoạt động-

  1. "Nhận mã thông báo tiếp theo" là một lệnh được gửi từ trình phân tích cú pháp đến trình phân tích từ vựng.
  2. Khi nhận được lệnh này, trình phân tích từ vựng sẽ quét đầu vào cho đến khi tìm thấy mã thông báo tiếp theo.
  3. Nó trả lại mã thông báo cho Trình phân tích cú pháp.

Lexical Analyzer bỏ qua khoảng trắng và nhận xét trong khi tạo các mã thông báo này. Nếu có bất kỳ lỗi nào, thì bộ phân tích Lexical sẽ tương quan lỗi đó với tệp nguồn và số dòng.

Vai trò của máy phân tích Lexical

Máy phân tích Lexical thực hiện các tác vụ dưới đây:

  • Giúp xác định mã thông báo vào bảng ký hiệu
  • Loại bỏ khoảng trắng và nhận xét khỏi chương trình nguồn
  • Tương quan các thông báo lỗi với chương trình nguồn
  • Giúp bạn mở rộng macro nếu nó được tìm thấy trong chương trình nguồn
  • Đọc các ký tự đầu vào từ chương trình nguồn

Ví dụ về Phân tích Lexical, Mã thông báo, Không phải Mã thông báo

Hãy xem xét đoạn mã sau được cung cấp cho Lexical Analyzer

#include int maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}

Ví dụ về các mã thông báo được tạo

Lexeme Mã thông báo
int Từ khóa
tối đa Định danh
( Nhà điều hành
int Từ khóa
x Định danh
, Nhà điều hành
int Từ khóa
Y Định danh
) Nhà điều hành
{ Nhà điều hành
Nếu Từ khóa

Ví dụ về Nontokens

Kiểu Các ví dụ
Bình luận // Thao tác này sẽ so sánh 2 số
Chỉ thị tiền xử lý #include
Chỉ thị tiền xử lý #define NUMS 8,9
Macro NUMS
Khoảng trắng / n / b / t

Lỗi Lexical

Một chuỗi ký tự không thể quét thành bất kỳ mã thông báo hợp lệ nào là lỗi từ vựng. Sự thật quan trọng về lỗi từ vựng:

  • Lỗi từ vựng không phổ biến lắm, nhưng nó nên được quản lý bằng máy quét
  • Lỗi chính tả của số nhận dạng, toán tử, từ khóa được coi là lỗi từ vựng
  • Nói chung, lỗi từ vựng là do sự xuất hiện của một số ký tự bất hợp pháp, chủ yếu là ở đầu mã thông báo.

Khôi phục lỗi trong Lexical Analyzer

Dưới đây là một số kỹ thuật khôi phục lỗi phổ biến nhất:

  • Xóa một ký tự khỏi đầu vào còn lại
  • Trong chế độ hoảng sợ, các ký tự kế tiếp luôn bị bỏ qua cho đến khi chúng tôi đạt được mã thông báo được định dạng tốt
  • Bằng cách chèn ký tự bị thiếu vào đầu vào còn lại
  • Thay thế một ký tự bằng một ký tự khác
  • Chuyển đổi hai ký tự nối tiếp

Lexical Analyzer so với Parser

Lexical Analyzer Trình phân tích cú pháp
Chương trình đầu vào quét Thực hiện phân tích cú pháp
Xác định mã thông báo Tạo một bản trình bày trừu tượng của mã
Chèn mã thông báo vào Bảng biểu tượng Cập nhật các mục nhập bảng ký hiệu
Nó tạo ra các lỗi từ vựng Nó tạo ra một cây phân tích cú pháp của mã nguồn

Tại sao phải tách Lexical và Parser?

  • Tính đơn giản của thiết kế: Nó giúp giảm bớt quá trình phân tích từ vựng và phân tích cú pháp bằng cách loại bỏ các mã thông báo không mong muốn
  • Để cải thiện hiệu quả trình biên dịch: Giúp bạn cải thiện hiệu quả trình biên dịch
  • Chuyên môn hóa: các kỹ thuật chuyên biệt có thể được áp dụng để cải thiện quy trình phân tích từ vựng
  • Khả năng di động: chỉ máy quét yêu cầu giao tiếp với thế giới bên ngoài
  • Tính di động cao hơn: các đặc thù cụ thể của thiết bị đầu vào bị hạn chế đối với lexer

Ưu điểm của phân tích Lexical

  • Phương pháp phân tích từ vựng được sử dụng bởi các chương trình như trình biên dịch có thể sử dụng dữ liệu được phân tích cú pháp từ mã của lập trình viên để tạo mã thực thi nhị phân đã biên dịch
  • Nó được sử dụng bởi các trình duyệt web để định dạng và hiển thị một trang web với sự trợ giúp của dữ liệu được phân tích cú pháp từ JavsScript, HTML, CSS
  • Một bộ phân tích từ vựng riêng biệt giúp bạn xây dựng một bộ xử lý chuyên biệt và có khả năng hiệu quả hơn cho tác vụ

Nhược điểm của phân tích Lexical

  • Bạn cần dành thời gian đáng kể để đọc chương trình nguồn và phân vùng nó dưới dạng mã thông báo
  • Một số biểu thức chính quy khá khó hiểu so với quy tắc PEG hoặc EBNF
  • Cần nhiều nỗ lực hơn để phát triển và gỡ lỗi lexer và các mô tả mã thông báo của nó
  • Cần bổ sung chi phí thời gian chạy để tạo bảng lexer và xây dựng mã thông báo

Tóm lược

  • Phân tích từ vựng là giai đoạn đầu tiên trong thiết kế trình biên dịch
  • Lexeme là một chuỗi các ký tự được bao gồm trong chương trình nguồn theo mẫu khớp của mã thông báo
  • Lexical analyzer được triển khai để quét toàn bộ mã nguồn của chương trình
  • Lexical analyzer giúp xác định mã thông báo vào bảng ký hiệu
  • Một chuỗi ký tự không thể quét thành bất kỳ mã thông báo hợp lệ nào là lỗi từ vựng
  • Loại bỏ một ký tự khỏi đầu vào còn lại là phương pháp khôi phục lỗi hữu ích
  • Lexical Analyzer quét chương trình đầu vào trong khi trình phân tích cú pháp thực hiện phân tích cú pháp
  • Nó giúp giảm bớt quá trình phân tích từ vựng và phân tích cú pháp bằng cách loại bỏ các mã thông báo không mong muốn
  • Lexical analyzer được sử dụng bởi các trình duyệt web để định dạng và hiển thị một trang web với sự trợ giúp của dữ liệu được phân tích cú pháp từ JavsScript, HTML, CSS
  • Hạn chế lớn nhất của việc sử dụng Lexical analyzer là nó cần thêm chi phí thời gian chạy để tạo các bảng lexer và xây dựng các mã thông báo