Việc pha trộn các giai đoạn lexer và phân tích cú pháp trong một giai đoạn đôi khi làm cho các trình phân tích Parsec ít đọc được hơn nhưng cũng làm chậm chúng xuống. Một giải pháp là sử dụng Alex làm trình sửa lỗi và sau đó Parsec làm trình phân tích cú pháp của luồng mã thông báo. Điều này là tốt nhưng nó sẽ tốt hơn nếu tôi có thể loại bỏ Alex bởi vì nó thêm một giai đoạn tiền xử lý trong đường dẫn biên dịch, không tích hợp tốt với "IDE" haskell, vv. Tôi đã tự hỏi nếu có một điều như một EDSL haskell để mô tả tokenizers, rất nhiều trong phong cách của Alex, nhưng như là một thư viện.Có một EDSL haskell để viết lexers không?
Trả lời
Có - http://www.cse.unsw.edu.au/~chak/papers/Cha99.html
Trước Hackage, Manuel sử dụng để phát hành mã trong một gói phần mềm được gọi là CTK (biên dịch toolkit). Tôi không chắc chắn tình trạng của dự án là những ngày này.
Tôi nghĩ rằng lời nguyền của Thomas Hallgren từ giấy "Lexing Haskell in Haskell" là động hơn là trình tạo mã, trong khi bản phát hành được thiết kế để lexing Haskell máy móc trong thư viện tổng quát hơn. Iavor Diatchki đã đặt mã trên Hackage.
Hoàn hảo, cảm ơn! –
Bạn cũng có thể sử dụng Parsec làm lexer. Trước tiên, bạn phân tích cú pháp chuỗi thành các thẻ, sau đó bạn phân tích các mã thông báo thành loại dữ liệu đích.
Đúng nhưng sau đó lại mất tốc độ DFA tối thiểu mà bạn có thể có với một công cụ như Alex mà không mất đi sự biểu cảm nào (tôi thích Parsec hơn, nói, Yacc vì nó cung cấp mô đun/biểu cảm tốt hơn, nhưng tôi không thuyết phục điều này rất hữu ích cho lexers). Nhưng ít nhất, nó giải quyết được vấn đề trộn hai giai đoạn. Cảm ơn. –
- 1. Để viết hay không viết `module Main where` trong Haskell
- 2. làm thế nào để viết trở Haskell
- 3. Có một nghịch đảo của toán tử Haskell $ không?
- 4. Haskell không có loại
- 5. Làm thế nào để viết một thuật toán lập trình động hiệu quả trong Haskell?
- 6. Làm cách nào để viết tên đủ điều kiện của một biểu tượng trong Haskell?
- 7. Có trình định dạng mã Haskell không?
- 8. Tôi có thể viết các thành phần trong Haskell được sử dụng trên một trang web Django không?
- 9. Làm thế nào để đọc một số nguyên được viết theo dạng mũ với Haskell?
- 10. Làm cách nào để viết hàm chiều dài không gian cố định trong Haskell?
- 11. Có loại xóa haskell không?
- 12. Chuỗi in Haskell không có dòng mới
- 13. Làm thế nào để có được một callstack trong Haskell?
- 14. Có một người viết lại?
- 15. Quy tắc viết lại Haskell và thành phần chức năng
- 16. Cách viết mã độc lập nền tảng trong Haskell (ghc)
- 17. Lớp Haskell Num không có trong Ord?
- 18. Haskell có thể triển khai OSGi không?
- 19. Tạo một Haskell REPL trong một ứng dụng Haskell
- 20. Haskell Alex - lỗi trong mẫu wrapper
- 21. Bạn có thể viết một lớp Java với ABCL không?
- 22. Có thể viết một plugin VLC bằng Python không?
- 23. Tôi có cần mèo để viết một heredoc vào một tập tin không?
- 24. Có cách nào để ghi nhớ một giá trị trong Haskell không?
- 25. Cách viết một họ các chức năng printf (gỡ lỗi in, vv) trong Haskell
- 26. Haskell có các hàm/bộ dữ liệu Vd không?
- 27. Có thể Haskell [dễ dàng] thực hiện COM không?
- 28. Viết một ứng dụng web với "không có phụ trợ"
- 29. Haskell có foldlM '?
- 30. Làm thế nào để viết mã song song với vectơ Haskell?
Đây là câu hỏi mà tôi đã xem xét vào cuối năm nhưng không có gì tôi thực sự thấy. Tôi đang tưởng tượng có thể là một RegEx EDSL mà từ đó chúng tôi thực hiện một tokenizer untagged (:: [RegEx] -> String -> [String]). –
Tôi có thể đưa ra giải pháp nhanh chóng bằng cách sử dụng bất kỳ thư viện regexp nào bằng cách cố gắng đối sánh chuỗi hiện tại một lần nữa với mỗi regexp, nhưng tôi sẽ mất rất nhiều tối ưu hóa của Alex do kiến thức về tập hợp tất cả các regexps. –