2011-10-25 26 views
23

Tôi muốn có thể thực hiện tạo mã python cho mô tả AST.Trình tạo mã Python

Tôi đã thực hiện phân tích tĩnh C và xây dựng khách truy cập AST bằng python, vì vậy tôi cảm thấy khá thoải mái khi thao tác cây cú pháp, nhưng tôi chưa bao giờ thử tạo mã trước và đang cố gắng xác định thực tiễn tốt nhất để tạo mã python .

Cụ thể, tôi muốn tìm hiểu về cách tạo mã tự động thường được thực hiện hoặc bất kỳ gợi ý nào cho các thư viện nhắm mục tiêu python có thể làm cho tác vụ này đơn giản hơn.

Mục tiêu cuối cùng của tôi là thử một số nội dung tương tự như csmith hoặc một công cụ để tạo mã python tương thích với PEP8.

+0

Bạn đang sử dụng AST tùy chỉnh hay bạn đang tạo AST AST (sử dụng ví dụ: mô-đun 'ast')? –

+0

Rất có thể là một AST Python, sử dụng mô đun 'ast'. Tôi nhận thấy ANTLR đã phục vụ để python một chút, và điều đó có vẻ như một cách có thể để đi, nhưng nó có vẻ hợp lý hơn để gắn bó với nội bộ Python. – mvanveen

Trả lời

16

Bạn có thể muốn xem công cụ 2to3, được phát triển bởi các nhà phát triển mã Python để tự động chuyển mã Python 2 sang mã Python 3. Công cụ đầu tiên phân tích cú pháp mã cho một cây và sau đó spits ra "cố định" Python 3 mã từ cây đó.

Đây có thể là một nơi tốt để bắt đầu vì đây là công cụ Python "chính thức" được xác nhận bởi các nhà phát triển cốt lõi và một phần của đường dẫn di chuyển Python 2 đến 3 được đề xuất.

Cách khác, hãy xem codegen.py module, tạo mã Python trở lại từ số ast của Python.

Xem thêm SO question này, có thể có liên quan đến bạn (Tôi không đánh dấu nó là một bản sao vì tôi không chắc chắn phạm vi của câu hỏi chồng chéo 100%)

4

sinh mã tự động thường được thực hiện trong các cách sau:

  • báo cáo In chứa đoạn mã
  • mẫu văn bản với placeholders (macro nghĩ)

IMHO, thực hành tốt hơn là:

  • xây dựng một AST cho đoạn mục tiêu, và sau đó prettyprint

Hầu như không ai thực hiện sau này, bởi vì các công cụ chủ yếu là không có.

Công cụ 2to3 của Python cung cấp (tôi nghĩ) AST mục tiêu và vẽ đẹp.

Nhưng câu hỏi bạn không hỏi, là "tạo ra từ cái gì?" Bằng cách nào đó bạn phải chỉ định một cách trừu tượng những gì bạn muốn được tạo (hoặc nó không phải là một chiến thắng). Và công cụ của bạn phải có khả năng đọc được đặc tả đó bằng cách nào đó.

Nhiều chương trình tạo mã bao gồm viết mã thủ tục gọi các cơ chế thế hệ trên; mã thủ tục đóng vai trò như một đặc tả ngầm. Nó là "dễ dàng" để đọc các đặc điểm kỹ thuật; nó chỉ là mã trong ngôn ngữ được trình tạo mã sử dụng.

Một số sơ đồ tạo mã sử dụng một số loại cấu trúc biểu đồ để cung cấp một khung mà trên đó các phân đoạn đặc tả được treo, điều đó thúc đẩy quá trình tạo mã. Sơ đồ lớp UML là một ví dụ cổ điển. Những đề án này không dễ dàng như vậy; bạn cần một "trình đọc thông số kỹ thuật" (ví dụ:, Trình đọc sơ đồ UML hay còn gọi là XMI hoặc một số thứ như vậy, hoặc nếu bạn không sử dụng UML, một số loại trình phân tích cú pháp đặc tả).

Công cụ Python 2to3 sử dụng trình phân tích cú pháp Python2 để đọc "spec". Nếu bạn muốn tạo mã từ Python2, điều đó sẽ ổn. Tôi nghi ngờ bạn không muốn làm điều đó.

Cách tiếp cận thực hành tốt nhất là phương pháp thống nhất khả năng đọc/phân tích/thông số kỹ thuật đi qua, với khả năng tạo AST cho ngôn ngữ đích.

DMS Software Reengineering Toolkit là hệ thống phân tích và chuyển đổi chương trình mục đích chung. Nó phân tích "các đặc tả" (các thể hiện của các ngữ pháp để bạn có thể định nghĩa nó) thành các AST; nó cũng sẽ cho phép bạn xây dựng các AST tùy ý cho bất kỳ ngữ pháp nào, bằng cách sử dụng cả hai mã thủ tục [như đã phác thảo ở trên] hoặc sử dụng mẫu khớp/thay thế (khá độc đáo đối với DMS). Một phần của giao diện người dùng DMS langauge là một trình duyệt đẹp, có thể tái tạo văn bản từ AST (chúng được kiểm tra bằng mã roundtripping: phân tích thành AST, AST khá, tốt hơn là cùng một văn bản).

Trong trường hợp ngữ pháp của bạn không được biết đến với DMS, nó có trình phân tích cú pháp cực kỳ tốt và trình tạo khá đẹp, cũng như các cơ chế hỗ trợ khác để phân tích chương trình. Tất cả các máy móc bổ sung đó thường không có sẵn với các trình tạo phân tích cú pháp cổ điển, hoặc chỉ với một gói "AST" đơn giản. (Tôi không biết 2to3 là ​​gì).

Mức độ liên quan của điều này với Python là DMS có Python front end cũng như grammars for many other languages.

Vì vậy, bạn có thể phân tích cú pháp đặc điểm kỹ thuật của mình và tạo mã Python bằng ASTs, tiếp theo là in đẹp.

Các vấn đề liên quan