2013-02-08 34 views
15

Tôi sẽ viết một trình phân tích cú pháp của ngôn ngữ verilog (hoặc vhdl) và sẽ thực hiện rất nhiều thao tác (loại biến đổi) của dữ liệu được phân tích cú pháp. Tôi có ý định phân tích các tập tin thực sự lớn (thiết kế Verilog đầy đủ, lớn đến 10K dòng) và cuối cùng tôi sẽ hỗ trợ hầu hết các Verilog. Tôi không nhớ đánh máy nhưng tôi không muốn viết lại bất kỳ phần nào của mã bất cứ khi nào tôi thêm hỗ trợ cho một số quy tắc khác.Parsec hoặc happy (with alex) hoặc uu-parsinglib

Trong Haskell, bạn sẽ giới thiệu thư viện nào? Tôi biết Haskell và đã sử dụng Happy trước đây (để chơi). Tôi cảm thấy rằng có khả năng trong việc sử dụng Parsec để chuyển chuỗi phân tích cú pháp trong mã (đó là một điểm cộng lớn). Tôi không có kinh nghiệm với uu-paringlib.

Vì vậy, để phân tích cú pháp toàn bộ ngữ pháp của verilog/VHDL, một trong số chúng được khuyến nghị? Mối quan tâm chính của tôi là sự dễ dàng và 'chính xác' mà tôi có thể thao tác dữ liệu được phân tích cú pháp theo ý thích của tôi. Tốc độ không phải là mối quan tâm chính.

+0

Đây là một dự án lớn. Trình phân tích cú pháp Verilog rất phức tạp. –

+4

Có, thực sự. Hỗ trợ một phần của verilog là đủ tốt để hiển thị tôi muốn làm với verilog trong tiến sĩ của tôi. nhưng tôi muốn tiếp tục điều này ngay cả sau khi tiến sĩ của tôi Đó là một khoản đầu tư dài hạn. Tôi muốn biết nếu Haskell phù hợp với dự luật. Tôi yêu ngôn ngữ này. – Dilawar

+1

Vì vậy, cuối cùng bạn đã làm gì? Bạn có hài lòng với lựa chọn của mình không? – Schiavini

Trả lời

19

Cá nhân tôi thích Parsec với sự giúp đỡ của Alex vì lexing.

Tôi thích Parsec hơn Happy vì 1) Parsec là thư viện, trong khi Happy là một chương trình và bạn sẽ viết bằng ngôn ngữ khác nếu bạn sử dụng Happy và sau đó biên dịch với Happy. 2) Parsec cung cấp cho bạn khả năng phân tích cú pháp theo ngữ cảnh nhờ vào giao diện đơn sắc của nó. Bạn có thể sử dụng trạng thái bổ sung để phân tích cú pháp theo ngữ cảnh, sau đó kiểm tra và quyết định tùy thuộc vào trạng thái đó. Hoặc khi bạn không cần bất kỳ thông tin nhạy cảm về ngữ cảnh nào, bạn có thể chỉ cần sử dụng phong cách ứng dụng và thực hiện một triển khai như được thực hiện trong YACC hoặc một công cụ tương tự . Bạn có thể không biết liệu trình phân tích cú pháp Parsec của bạn có chứa đệ quy trái hay không, và trình phân tích cú pháp của bạn sẽ gặp khó khăn trong thời gian chạy (vì Parsec về cơ bản là trình phân tích cú pháp đệ quy từ trên xuống dưới). Bạn phải tìm kiếm lại và loại bỏ chúng. Các trình phân tích cú pháp kiểu YACC có thể cung cấp cho bạn một số bảo mật và thông tin tĩnh (như các xung đột thay đổi/giảm, các đầu cuối chưa sử dụng, vv) mà bạn không thể nhận được với Parsec.

Alex rất khuyến khích cho lexing trong cả hai trường hợp ( Tôi nghĩ rằng bạn phải sử dụng Alex nếu bạn quyết định tiếp tục với Happy ). Bởi vì ngay cả khi bạn sử dụng Parsec, nó cũng thực sự đơn giản hóa việc thực thi trình phân tích cú pháp của bạn và cũng nắm bắt được rất nhiều lỗi (ví dụ: phân tích từ khóa là mã định danh là lỗi phổ biến mà tôi đã sử dụng trong khi sử dụng Parsec không có Alex.).

Bạn có thể xem qua số Lua parser được triển khai trong Alex + Parsec Và đây là code to use Alex-generated tokens in Parsec.

CHỈNH SỬA: Cảm ơn John L để sửa chữa. Rõ ràng bạn cũng có thể phân tích cú pháp theo ngữ cảnh với Happy. Ngoài ra, Alex cho lexing là không cần thiết trong Happy, mặc dù nó được khuyến khích.

+0

Cảm ơn bạn đã chia sẻ trình phân tích cú pháp Lua của bạn. Thật hữu ích khi thấy Alex trong xác thịt, và không chỉ là một số ví dụ đồ chơi từ tài liệu. –

+0

+1 để chia sẻ công việc của bạn. – Dilawar

+4

Phần lớn các chi tiết liên quan đến Happy trong câu trả lời này là sai.Happy hỗ trợ phân tích cú pháp theo ngữ cảnh (như các trình phân tích cú pháp có thể được chạy trong các trình đơn tùy ý). Hạnh phúc không yêu cầu Alex, bạn có thể sử dụng bất kỳ lexer. Bạn thậm chí có thể làm lexing trực tiếp trong Happy, mặc dù điều đó sẽ không được đề nghị. –

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