Helpex - Trao đổi & giúp đỡ Đăng nhập

Phân tích cú pháp trong Python: Công cụ và Thư viện (Phần 1)

Nếu bạn cần phân tích một ngôn ngữ hoặc tài liệu từ Python, về cơ bản có ba cách để làm như vậy:

  1. Sử dụng một thư viện hiện có hỗ trợ ngôn ngữ cụ thể đó : Tùy chọn đầu tiên là tốt nhất cho các ngôn ngữ nổi tiếng và được hỗ trợ như XML hoặc HTML. Một thư viện tốt thường cũng bao gồm các API để xây dựng và sửa đổi các tài liệu theo ngôn ngữ đó. Đây thường là nhiều hơn những gì bạn nhận được từ một trình phân tích cú pháp cơ bản. Vấn đề là các thư viện như vậy không quá phổ biến và chúng chỉ hỗ trợ các ngôn ngữ phổ biến nhất. Trong các trường hợp khác, bạn đã hết may mắn.
  2. Xây dựng trình phân tích cú pháp tùy chỉnh của riêng bạn bằng tay : Bạn có thể cần chọn tùy chọn thứ hai nếu bạn có nhu cầu cụ thể, liệu ngôn ngữ mà bạn cần phân tích cú pháp có thể được phân tích cú pháp bằng trình tạo trình phân tích cú pháp truyền thống hay bạn có các yêu cầu cụ thể mà bạn không thể đáp ứng khi sử dụng trình phân tích cú pháp thông thường máy phát điện. Ví dụ, có thể bạn cần hiệu suất tốt nhất có thể hoặc tích hợp sâu giữa các thành phần khác nhau.
  3. Một công cụ hoặc thư viện để tạo một trình phân tích cú pháp : Trong tất cả các trường hợp khác, tùy chọn thứ ba nên là tùy chọn mặc định vì nó linh hoạt nhất và có thời gian phát triển ngắn hơn. (Ví dụ: ANTLR có thể được sử dụng để xây dựng trình phân tích cú pháp cho bất kỳ ngôn ngữ nào.) Đó là lý do tại sao, trong bài viết này, chúng tôi tập trung vào các công cụ và thư viện tương ứng với tùy chọn này.

Lưu ý : Bất kỳ văn bản nào trong một blockquote mô tả chương trình đều xuất phát từ tài liệu tương ứng.

Công cụ tạo phân tích cú pháp

Chúng ta sẽ xem:

  • Các công cụ có thể tạo trình phân tích cú pháp có thể sử dụng bởi Python (và có thể từ các ngôn ngữ khác).
  • Thư viện Python để xây dựng trình phân tích cú pháp.

Các công cụ có thể được sử dụng để tạo mã cho trình phân tích cú pháp được gọi là trình tạo trình phân tích cú pháp hoặc trình biên dịch. Các thư viện tạo trình phân tích cú pháp được gọi là trình kết hợp trình phân tích cú pháp.

Trình tạo phân tích cú pháp (hoặc trình kết hợp trình phân tích cú pháp) không tầm thường; bạn cần một chút thời gian để tìm hiểu cách sử dụng chúng và không phải tất cả các loại trình tạo trình phân tích cú pháp đều phù hợp với tất cả các loại ngôn ngữ. Đó là lý do tại sao chúng tôi đã chuẩn bị một danh sách những người nổi tiếng nhất trong số họ với phần giới thiệu ngắn cho mỗi người. Chúng tôi cũng tập trung vào một ngôn ngữ đích: Python. Điều này cũng có nghĩa là (thường) trình phân tích cú pháp sẽ được viết bằng Python.

Để liệt kê tất cả các công cụ và trình phân tích cú pháp thư viện có thể cho tất cả các ngôn ngữ sẽ là loại thú vị, nhưng không hữu ích. Đó là bởi vì đơn giản là có quá nhiều lựa chọn và chúng ta sẽ bị lạc trong tất cả chúng. Bằng cách tập trung vào một ngôn ngữ lập trình, chúng tôi có thể cung cấp một so sánh táo với táo và giúp bạn chọn một tùy chọn cho dự án của mình.

Những điều hữu ích cần biết về trình phân tích cú pháp

Để đảm bảo rằng danh sách này có thể truy cập được đối với tất cả các lập trình viên, chúng tôi đã chuẩn bị một lời giải thích ngắn về các thuật ngữ và khái niệm mà bạn có thể gặp phải khi tìm kiếm một trình phân tích cú pháp. Chúng tôi không cố gắng cung cấp cho bạn những lời giải thích chính thức, nhưng những giải thích thực tế .

Cấu trúc của trình phân tích cú pháp

Trình phân tích cú pháp thường bao gồm hai phần: một trình phân tích cú pháp, còn được gọi là trình quét hoặc mã thông báo và trình phân tích cú pháp thích hợp. Không phải tất cả các trình phân tích cú pháp đều áp dụng lược đồ hai bước này; một số trình phân tích cú pháp không phụ thuộc vào một từ vựng. Chúng được gọi là trình phân tích cú pháp không quét.

Một lexer và một trình phân tích cú pháp hoạt động theo trình tự: lexer quét đầu vào và tạo ra các mã thông báo phù hợp, trong khi trình phân tích cú pháp quét các mã thông báo và tạo ra kết quả phân tích cú pháp.

Hãy xem ví dụ sau đây và tưởng tượng rằng chúng ta đang cố phân tích một phép toán.

437 + 734

Các lexer quét văn bản và tìm thấy 4, 3 và 7, và sau đó là không gian. Công việc của nhà từ vựng là nhận ra rằng các ký tự đầu tiên tạo thành một mã thông báo loại NUM . Sau đó, lexer tìm thấy một ký hiệu +, tương ứng với mã thông báo thứ hai của loại PLUS và cuối cùng, nó tìm thấy một mã thông báo khác có loại NUM.Phân tích cú pháp trong Python: Công cụ và Thư viện (Phần 1)

Trình phân tích cú pháp thường sẽ kết hợp các mã thông báo được tạo bởi lexer và nhóm chúng.

Các định nghĩa được sử dụng bởi lexers hoặc trình phân tích cú pháp được gọi là quy tắc hoặc sản xuất. Quy tắc lexer sẽ chỉ định rằng một chuỗi các chữ số tương ứng với mã thông báo loại NUM, trong khi quy tắc phân tích cú pháp sẽ chỉ định rằng một chuỗi các mã thông báo loại NUM, PLUS, NUM tương ứng với một biểu thức.

Trình phân tích cú pháp không quét là khác nhau vì chúng trực tiếp xử lý văn bản gốc thay vì xử lý danh sách các mã thông báo được tạo bởi một nhà từ vựng.

Bây giờ nó là điển hình để tìm các bộ có thể tạo cả lexer và trình phân tích cú pháp. Trước đây, người ta thường kết hợp hai công cụ khác nhau: một để tạo ra từ vựng và một để tạo ra trình phân tích cú pháp. Ví dụ, đây là trường hợp của cặp vợ chồng lex và yacc đáng kính - lex đã tạo ra lexer, trong khi yacc tạo ra trình phân tích cú pháp.

Cây phân tích cú pháp và cây cú pháp trừu tượng

Có hai thuật ngữ có liên quan và đôi khi, chúng được sử dụng thay thế cho nhau: cây phân tích cú pháp và cây cú pháp trừu tượng (AST).

Về mặt khái niệm, chúng rất giống nhau.

Cả hai đều là cây . Có một gốc đại diện cho toàn bộ đoạn mã được phân tích cú pháp. Sau đó, có các cây con nhỏ hơn đại diện cho các phần mã trở nên nhỏ hơn cho đến khi các mã thông báo duy nhất xuất hiện trong cây.

Sự khác biệt là mức độ trừu tượng . Cây phân tích chứa tất cả các mã thông báo xuất hiện trong chương trình và có thể là một bộ quy tắc trung gian. Thay vào đó, AST là một phiên bản được đánh bóng của cây phân tích trong đó thông tin có thể được lấy hoặc không quan trọng để hiểu đoạn mã được loại bỏ.

Trong AST, một số thông tin bị mất; ví dụ, các bình luận và các ký hiệu nhóm (dấu ngoặc đơn) không được trình bày. Những thứ như bình luận là thừa đối với một chương trình và các biểu tượng nhóm được xác định ngầm định bởi cấu trúc của cây.

Cây phân tích cú pháp là một đại diện của mã gần với cú pháp cụ thể. Nó cho thấy nhiều chi tiết về việc thực hiện trình phân tích cú pháp. Chẳng hạn, thông thường, một quy tắc tương ứng với loại nút. Cây phân tích thường được người dùng chuyển đổi trong AST, có thể với một số trợ giúp từ trình tạo trình phân tích cú pháp.

Một đại diện đồ họa của AST trông như thế này.

Phân tích cú pháp trong Python: Công cụ và Thư viện (Phần 1)

Đôi khi, bạn có thể muốn bắt đầu sản xuất một cây phân tích cú pháp và sau đó lấy từ nó một AST. Điều này có thể có ý nghĩa vì cây phân tích dễ sản xuất hơn cho trình phân tích cú pháp (nó là biểu diễn trực tiếp của quá trình phân tích cú pháp) nhưng AST đơn giản và dễ xử lý hơn bằng cách làm theo các bước mà bạn thường muốn thực hiện trên cây: mã xác nhận, giải thích, biên soạn, vv

Trong Phần 2 , chúng ta sẽ thảo luận về những điều hữu ích hơn để biết về trình phân tích cú pháp!

7 hữu ích 0 bình luận 11k xem chia sẻ

Có thể bạn quan tâm

loading