2008-09-18 42 views
11

Gần đây tôi đã viết một trình phân tích cú pháp bằng Python bằng cách sử dụng Ply (đó là sự tái triển khai python của yacc). Khi tôi gần như được thực hiện với trình phân tích cú pháp, tôi phát hiện ra rằng ngữ pháp mà tôi cần phải phân tích cú pháp yêu cầu tôi thực hiện một số tìm kiếm trong khi phân tích cú pháp để thông báo cho lexer. Mà không cần nhìn lên để thông báo cho lexer tôi không thể phân tích chính xác các chuỗi trong ngôn ngữ.Triển khai Python của Parsec?

Cho dù tôi có thể kiểm soát trạng thái của lexer từ các quy tắc ngữ pháp, tôi nghĩ rằng tôi sẽ giải quyết trường hợp sử dụng của mình bằng bảng tra cứu trong mô-đun phân tích cú pháp, nhưng có thể quá khó để duy trì/kiểm tra. Vì vậy, tôi muốn biết về một số tùy chọn khác.

Trong Haskell, tôi sẽ sử dụng Parsec, một thư viện các hàm phân tích cú pháp (được gọi là bộ phối hợp). Có một thực hiện Python của Parsec? Hoặc có lẽ một số thư viện chất lượng sản xuất khác có đầy đủ chức năng phân tích cú pháp để tôi có thể xây dựng một trình phân tích ngữ cảnh nhạy cảm trong Python?

CHỈNH SỬA: Tất cả các nỗ lực của tôi trong phân tích ngữ cảnh miễn phí đều không thành công. Vì lý do này, tôi không mong đợi ANTLR hữu ích ở đây.

Trả lời

3

Một tùy chọn bạn có thể xem xét, nếu một trình phân tích cú pháp LL là phù hợp với bạn, hãy thử ANTLR một lần thử, nó có thể tạo ra python quá (thực sự là LL (*) khi đặt tên nó, * là viết tắt của số lượng lookahead nó có thể đối phó với).

+1

Trong trường hợp của tôi, tôi cần nhiều hơn phân tích cú pháp truyền thống cho phép. Tất cả những nỗ lực của tôi trong việc viết một trình phân tích ngữ cảnh miễn phí truyền thống đã rơi trên khuôn mặt của họ vì lý do lý thuyết. Tôi khá tự tin vào thời điểm này mà tôi cần lexing có điều kiện ở mức tối thiểu. ANTLR vẫn sẽ được áp dụng? –

+0

Bạn có * lookahead với ANTLR và nếu bạn cần bạn có thể thêm cú pháp và vị ngữ vào ngữ pháp của bạn (ngữ nghĩa ngữ nghĩa cũng tồn tại). sử dụng antlrwork, nó thực sự hữu ích cho việc thiết kế/gỡ lỗi ngữ pháp (http://www.antlr.org/works/index.html). Có sẵn ngữ pháp đã sẵn sàng trên trang web ANTLR. –

1

Có ANTLR, là LL (*), có PyParsing, đối tượng thân thiện hơn và giống như DSL, và sau đó có Parsing giống như Menhir của OCaml.

+0

Tôi đang điều tra PyParsing bây giờ, nó trông gần nhất với Parsec mà tôi đã thấy. Tôi đang chấp nhận câu trả lời của bạn ngay bây giờ. Hãy hy vọng PyParsing hoạt động :) Cảm ơn! –

+0

Tôi lo lắng về việc đọc tài liệu này trong tài liệu PyParsing: Hiệu suất của pyparsing có thể chậm đối với các ngữ pháp phức tạp và/hoặc các chuỗi đầu vào lớn. –

0

ANTLR thật tuyệt vời và có thêm lợi ích khi làm việc trên nhiều ngôn ngữ.

4

PySec là một phân tích cú pháp monadic, tôi không biết nhiều về nó, nhưng nó có giá trị xem xét here

7

Tôi tin rằng pyparsing được dựa trên cùng một nguyên tắc như parsec.

1

Không có gì ngăn cản bạn chuyển hướng trình phân tích cú pháp của bạn từ đường dẫn "không có ngữ cảnh" bằng PLY. Bạn có thể chuyển thông tin cho lexer trong quá trình phân tích cú pháp và theo cách này, bạn sẽ có được sự linh hoạt đầy đủ. Tôi khá chắc chắn rằng bạn có thể phân tích bất cứ điều gì bạn muốn với PLY theo cách này.

Ví dụ thực hành, consider - đó là trình phân tích cú pháp cho ANSI C được viết bằng Python với PLY. Nó giải quyết vấn đề định danh C typedef cổ điển (làm cho ngữ pháp của C không nhạy cảm với ngữ cảnh) bằng cách điền vào một bảng biểu tượng trong trình phân tích cú pháp đang được sử dụng trong lexer để phân giải các tên biểu tượng dưới dạng hoặc không.

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