2011-10-13 18 views
11

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?

+0

Đâ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]). –

+0

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. –

Trả lời

4

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.

http://hackage.haskell.org/package/haskell-lexer

+0

Hoàn hảo, cảm ơn! –

3

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.

+0

Đú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. –

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