2012-02-23 46 views
13

Tôi đang tìm cách viết một bộ lọc nhập khẩu Python hoặc bộ tiền xử lý cho các tệp nguồn về cơ bản là Python với các phần tử ngôn ngữ phụ. Mục đích là đọc tệp nguồn, phân tích cú pháp nó thành một cây cú pháp trừu tượng, áp dụng một số biến đổi để thực hiện các phần mới của ngôn ngữ, và viết nguồn Python hợp lệ mà sau đó có thể được CPython tiêu thụ. Tôi muốn viết điều này bằng Python và đang tìm trình phân tích cú pháp tốt nhất cho tác vụ.Trình phân tích cú pháp Python cho ngôn ngữ giống như Python

Trình phân tích cú pháp được tích hợp vào Python không thích hợp vì nó yêu cầu tệp nguồn là Python thực tế, những tệp này sẽ không có. Có rất nhiều trình phân tích cú pháp (hoặc trình tạo phân tích cú pháp) sẽ làm việc với Python, nhưng thật khó để nói đó là gì tốt nhất cho các nhu cầu của tôi mà không có một bó toàn bộ nghiên cứu.

Nói tóm lại, yêu cầu của tôi là:

  1. Parser được viết bằng Python hoặc đã gán Python.
  2. Đi kèm với ngữ pháp Python mà tôi có thể tinh chỉnh hoặc có thể dễ dàng sử dụng ngữ pháp Python có thể tinh chỉnh ở những nơi khác (chẳng hạn như http://docs.python.org/reference/grammar.html).
  3. Có thể tái tuần tự hóa AST sau khi chuyển đổi.
  4. Không nên quá khủng khiếp khi làm việc với API khôn ngoan.

Mọi đề xuất?

+0

Chỉ cần được rõ ràng: Ngôn ngữ bạn muốn phân tích thậm chí không * phân tích cú pháp * như Python tinh khiết. Chính xác? –

+0

Bạn đã cân nhắc xem xét PyYAML chưa? – inspectorG4dget

+0

@SvenMarnach: Đúng vậy. – kindall

Trả lời

9

Điều đầu tiên bạn nghĩ đến là lib2to3. Nó là một thực thi hoàn toàn thuần túy-Python của một trình phân tích cú pháp Python. Nó đọc một tệp ngữ pháp Python và phân tích các tệp nguồn Python theo ngữ pháp này. Nó cung cấp một cơ sở hạ tầng tuyệt vời để thực hiện các thao tác AST và viết lại mã Python được định dạng độc đáo - sau khi tất cả mục đích của nó là chuyển đổi giữa hai ngôn ngữ giống như Python với các ngữ pháp hơi khác nhau.

Thật không may nó thiếu tài liệu và không đảm bảo giao diện ổn định. Có những dự án xây dựng trên đầu trang của lib2to3 tuy nhiên, và source code là khá dễ đọc. Nếu ổn định API là một vấn đề, bạn có thể chỉ cần ngã ba nó.

+1

Điểm tốt! "Sau khi tất cả mục đích của nó là chuyển đổi giữa hai ngôn ngữ giống như Python với các ngữ pháp hơi khác nhau" –

+0

Có hai câu trả lời tuyệt vời ở đây, nhưng đây rõ ràng là cách tiếp cận tôi nên thử trước tiên. – kindall

2

Tôi thích SimpleParse rất nhiều, nhưng tôi chưa bao giờ cố gắng cho nó ăn Python grammar (BTW, đó có phải là ngữ pháp xác định không?). Nếu bị rung, PLY sẽ thực hiện công việc.

Xem điều này compilation về các công cụ phân tích cú pháp Python.

+0

* BTW, nó là một ngữ pháp xác định * Có (và một cách đơn giản đáng kể). –

1

tôi sẽ khuyên bạn nên kiểm tra thư viện của tôi: https://github.com/erezsh/lark

Nó có thể phân tích tất cả văn phạm tiếng bối cảnh tự do, tự động xây dựng một AST (với số lượng cột dòng &), và chấp nhận ngữ pháp ở định dạng EBNF, đó là được coi là tiêu chuẩn.

Nó có thể dễ dàng phân tích cú pháp một ngôn ngữ như Python và nó có thể làm nhanh hơn bất kỳ thư viện phân tích cú pháp nào khác được viết bằng Python.

Trong thực tế, có đã là một example python grammarparser

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