Phân tích cú pháp Python

AST là viết tắt của Abstract Syntax Tree, là một công cụ mạnh mẽ của ngôn ngữ lập trình Python. Nó cho phép chúng ta tương tác với chính mã Python và có thể sửa đổi nó

Bạn đã bao giờ nghĩ về cách mã Python được chạy chưa?

Dành cho những ai chưa biết, trình thông dịch Python chịu trách nhiệm chạy mã Python. Nó tuân theo các hướng dẫn được viết sẵn để dịch mã Python thành các hướng dẫn mà máy có thể chạy

Sau đây là quá trình chuyển đổi mã Python thành mã máy

  • Khi chúng tôi chạy mã, mã được phân tích cú pháp thành các phần nhỏ hơn được gọi là mã thông báo. Các mã thông báo này được tạo theo các hướng dẫn được xác định trước sẽ xử lý khác nhau. Ví dụ: từ khóa khác là một từ khóa khác với giá trị số như
  • Các mã thông báo được lưu trữ trong danh sách được chuyển đổi để xây dựng cây Cú pháp trừu tượng, AST. AST là tập hợp của hai hoặc nhiều nút được liên kết với nhau dựa trên ngữ pháp của ngôn ngữ Python
  • Trình biên dịch có thể tạo ra lệnh cấp thấp hơn được gọi là mã nhị phân từ AST. Code này rất chung chung để máy tính dễ chạy
  • Khi trình thông dịch nhận được mã byte giống như hướng dẫn, trình thông dịch hiện có thể chạy mã. Mã byte chịu trách nhiệm gọi hàm trong hệ điều hành, cuối cùng sẽ tương tác với CPU và bộ nhớ để chạy chương trình

Mô tả ở trên là một bản phác thảo sơ bộ về cách trình thông dịch chạy mã Python bằng AST

Chế độ biên dịch mã

Có ba chế độ có sẵn để biên dịch mã. Chúng được đưa ra dưới đây

  • exec - Chế độ này được sử dụng để thực thi mã Python bình thường
  • eval - Chế độ này được sử dụng để đánh giá biểu thức của Python và sẽ trả về kết quả sau khi đánh giá
  • single - Chế độ này hoạt động như trình bao Python thực thi một câu lệnh tại một thời điểm

Thực thi mã Python

Sử dụng mô-đun AST, chúng ta có thể chạy mã Python. Hãy hiểu ví dụ sau

Ví dụ -

đầu ra

Hello Learner! Welcome to JavaTpoint

Đánh giá biểu thức Python

Mô-đun AST cho phép chúng tôi đánh giá biểu thức Python và trả về kết quả từ biểu thức. Hãy hiểu ví dụ sau

Ví dụ -

đầu ra

14
Expression[body=BinOp[left=Constant[value=6, kind=None], op=Add[], right=Constant[value=8, kind=None]]]

Tạo AST nhiều dòng

Trong ví dụ trước, chúng ta đã thấy AST dòng đơn và cách kết xuất chúng. Bây giờ, chúng ta sẽ tìm hiểu cách tạo AST nhiều dòng. Đầu tiên, hãy hiểu ví dụ sau

Ví dụ -

đầu ra

Module[body=[Assign[targets=[Name[id='subjects', ctx=Store[]]], value=List[elts=[Constant[value='computer science', kind=None], Constant[value='alorithm', kind=None]], ctx=Load[]], type_comment=None], Assign[targets=[Name[id='name', ctx=Store[]]], value=Constant[value='Ricky', kind=None], type_comment=None], For[target=Name[id='fruit', ctx=Store[]], iter=Name[id='fruits', ctx=Load[]], body=[Expr[value=Call[func=Name[id='print', ctx=Load[]], args=[Call[func=Attribute[value=Constant[value='{} learn {}', kind=None], attr='format', ctx=Load[]], args=[Name[id='name', ctx=Load[]], Name[id='subjects', ctx=Load[]]], keywords=[]]], keywords=[]]]], orelse=[], type_comment=None]], type_ignores=[]]

NodeTransformer và NodeVisitor

Lớp NodeTransformer được sử dụng để lấy các loại khác nhau và sửa đổi theo yêu cầu của chúng tôi. Module ast cũng cung cấp lớp NodeVisitor giúp chúng ta gọi hàm visit mỗi khi lướt qua cây. Để chúng ta có thể kiểm soát nhiều hơn trên các nút, hãy hiểu ví dụ sau

Ví dụ 1

đầu ra

Welcome to the Javatpoint

Giải trình -

Trong đoạn mã trên, chúng tôi đã nhập mô-đun ast để phân tích mã. Sau đó, chúng tôi đã xác định lớp Khách truy cập kế thừa lớp NodeVisitor. Mỗi khi tìm thấy nút chuỗi;

Chúng ta cũng có thể sử dụng module khi chạy trực tiếp mã nguồn. Hãy hiểu ví dụ sau

Ví dụ - 2

đầu ra

{'from': ['pprint'], 'import': ['ast']}

Giải trình -

Đoạn mã trên chuyển đổi tệp Python thành cây cú pháp trừu tượng. Sau đó, chúng tôi phân tích cây để có được thông tin hữu ích

Chúng tôi đã mở tệp Python ở chế độ đọc và sau đó tạo AST có tên là ast_tree. Sau đó, hàm parse[] đã xử lý tất cả các mã thông báo, tuân theo tất cả các quy tắc ngôn ngữ và xây dựng cấu trúc dữ liệu dạng cây bao gồm nhiều thông tin hữu ích

Cây không là gì ngoài một tập hợp các nút, trong đó một biến cây được tham chiếu đến nút "gốc". Như vậy, chúng ta có thể thăm từng nút trong cây và thực hiện các thao tác. Nhưng, trước tiên, chúng tôi truy cập từng nút và xử lý dữ liệu

Phân tích AST

Khi chúng tôi có được cây, bây giờ Trình phân tích sẽ tuân theo mẫu khách truy cập. Sử dụng lớp NodeVisitor, chúng ta có thể theo dõi bất kỳ nút nào trong Python. Chúng ta cần triển khai một phương thức visit_để truy cập một loại nút cụ thể. Trong ví dụ trước, chúng tôi đã sử dụng tập lệnh bên dưới

Ví dụ -

Mã chấp nhận tên của mô-đun và lưu trữ nó trong danh sách thống kê. Với sự trợ giúp của lớp NodeVisitor, chúng ta có thể phân tích cây

Phương thức visit[] sẽ hoạt động giống như phương thức visit_method

Sử dụng AST làm Công cụ phân tích

Sau khi mã Python biến thành mã byte, con người không thể đọc được. Nhưng nó làm cho trình thông dịch nhanh, có nghĩa là mã byte được thiết kế cho máy chứ không phải cho con người

AST bao gồm đủ thông tin có cấu trúc, giúp chúng hữu ích trong việc tìm hiểu về mã Python. Tuy nhiên, AST vẫn không thân thiện với người dùng, nhưng chúng dễ hiểu hơn nhiều so với biểu diễn mã byte

Khi nào sử dụng mô-đun Python AST?

Cây cú pháp trừu tượng khá hữu ích cho các công cụ bảo hiểm mã. Nó phân tích cú pháp mã nguồn và tìm ra các lỗi và sai sót có thể có trong mã. Nó cũng có thể sử dụng trong -

  • Nó được sử dụng như một trình thông dịch Python tùy chỉnh
  • Nó được sử dụng để phân tích mã tĩnh
  • Nó làm cho các IDE trở nên thông minh, được gọi là IntelliSense

Phần kết luận

Chúng ta đã tìm hiểu về mô-đun ast trong Python, mô-đun chịu trách nhiệm chạy mã Python. Sau đó, chúng tôi đã xây dựng cây AST từ mã Python và thực hiện phân tích trên AST bằng lớp NodeVisitor

Làm cách nào để sử dụng AST trong Python?

Ví dụ - .
nhập khẩu ast
biểu thức = '6 + 8'
mã = ast. phân tích cú pháp [biểu thức, chế độ = 'eval']
in [eval [biên dịch [mã, '', chế độ = 'eval']]]
in [ast. kết xuất [mã]]

Phương pháp phân tích cú pháp trong Python là gì?

Mô-đun trình phân tích cú pháp cung cấp giao diện cho trình biên dịch mã byte và trình phân tích cú pháp nội bộ của Python . Mục đích chính của giao diện này là cho phép mã Python chỉnh sửa cây phân tích cú pháp của biểu thức Python và tạo mã thực thi từ mã này.

Làm cách nào để phân tích mã Python?

Phân tích cú pháp văn bản ở định dạng phức tạp bằng biểu thức chính quy .
Bước 1. Hiểu định dạng đầu vào. 123. .
Bước 2. Nhập các gói cần thiết. Chúng ta sẽ cần mô-đun Biểu thức chính quy và gói gấu trúc. .
Bước 3. Định nghĩa biểu thức chính quy. .
Bước 4. Viết trình phân tích cú pháp dòng. .
Bước 5. Viết trình phân tích tệp. .
Bước 6. Kiểm tra trình phân tích cú pháp

AST có được tích hợp vào Python không?

ast là một mô-đun trong thư viện chuẩn của python . Mã Python cần được chuyển đổi thành Cây cú pháp trừu tượng [AST] trước khi trở thành “mã byte”[. tệp pyc].

Chủ Đề