Tôi đang cố gắng phân tích ngôn ngữ dựa trên thụt đầu dòng (nghĩ Python, Haskell, Boo, YAML) trong Haskell bằng Parsec. Tôi đã nhìn thấy thư viện IndentParser, và có vẻ như đó là sự kết hợp hoàn hảo, nhưng những gì tôi không thể tìm ra là làm thế nào để biến số TokenParser
thành một trình phân tích cú pháp thụt đầu dòng. Dưới đây là đoạn code tôi có cho đến nay:Phân tích Cú pháp dựa trên thụt đầu dòng trong Parsec của Haskell
import qualified Text.ParserCombinators.Parsec.Token as T
import qualified Text.ParserCombinators.Parsec.IndentParser.Token as IT
lexer = T.makeTokenParser mylangDef
ident = IT.identifier lexer
này ném lỗi:
parser2.hs:29:28:
Couldn't match expected type `IT.TokenParser st'
against inferred type `T.GenTokenParser s u m'
In the first argument of `IT.identifier', namely `lexer'
In the expression: IT.identifier lexer
In the definition of `ident': ident = IT.identifier lexer
Tôi đang làm gì sai? Tôi nên tạo một số IT.TokenParser
như thế nào? Hoặc là IndentParser bị hỏng và phải tránh?
Bạn, thưa bạn, thật tuyệt vời! Cảm ơn bạn! Làm thế nào bạn biết tôi đã sử dụng Parsec 3? Đoán? Bởi vì tôi nghĩ rằng ví dụ của tôi có thể là ... – pavpanchekha
Tôi sợ rằng công việc thám tử của tôi ở đây không thực sự thú vị lắm: tôi đã biên dịch mã của bạn bằng Parsec 3, có lỗi tương tự với lỗi của bạn, và sau đó thử Parsec 2, đã làm việc. Nhân tiện, có vẻ như sẽ không quá khó để IndentParser làm việc với Parsec 3; bạn có thể xem xét cho nó một shot nếu bạn tìm thấy IndentParser hữu ích. –
Tôi có thể, nhưng bây giờ tôi chỉ học Haskell; Tôi e rằng mình sẽ bị lạc trong một hệ thống codebase nước ngoài như thế. – pavpanchekha