2013-04-19 12 views
10

Tôi đang viết trình phân tích cú pháp hai lần đầu tiên quét văn bản vào mã thông báo (sử dụng Alex) rồi phân tích các mã đó (sử dụng Parsec). Tất cả tốt và tốt cho đến khi tôi cố gắng thêm thông tin vị trí vào các thẻ để tôi có thể viết một thông báo lỗi tốt.Vị trí theo dõi khi quét các thẻ làm phức tạp trình phân tích cú pháp

Nguyên tôi đã:

data Token = TAtom | TString String | TInt Integer | TFloat [...] 

Nó có vẻ như tôi có thể thêm một yếu tố Position cho mỗi constructor Token hoặc tạo ra một loại mới như data TokenWithPosition = T Token Position.

Tôi đã bắt đầu xuống con đường thứ hai, nhưng bây giờ tôi có vấn đề hoặc phải tạo một TokenWithPosition với vị trí giả khi tôi muốn mô tả mã thông báo trong Parsec hoặc tôi phải unwrap TokenWithPosition mỗi lần tôi muốn để so sánh. Trong ngắn hạn ngữ pháp sạch đẹp của tôi đang bị tràn ngập với mã cần thiết để bỏ qua các thông tin vị trí.

Vì vậy, câu hỏi của tôi: Có cách nào sạch để theo dõi thông tin vị trí mà không bị làm phức tạp trình phân tích cú pháp trong lần truyền thứ hai không? Điều này có vẻ như một cái gì đó mà sẽ có một giải pháp tiêu chuẩn.

Trả lời

3

Bạn cần sử dụng các chức năng từ Text.Parsec.Prim (ví dụ: tokenPrim) để triển khai "trình phân tích cú pháp nguyên thủy" của riêng bạn.

Những trình phân tích cú pháp nguyên thủy này sẽ cập nhật trạng thái nội bộ của Parsec với thông tin vị trí và trả về số Token thuần túy mà không có vị trí.