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.