让我们假设我有以下Parser和Tokentype:
data Token = TokInt SourcePos Int
parseInt :: Parser Token
parseInt = do
numStr <- many1 digit
return $ TokInt (???) (read numStr)
如何使用当前SourcePos
填写缺失的部分(???)
?
我需要在下一步中提供这些信息。
我当前的流程是在第一次运行时标记化完整输入,然后从生成的标记列表中构建我的AST。因此,标记化可以成功,但是在构建AST时可能会出现错误,我想将用户指向文件中发生错误的实际点,因此我需要在源代码中保存标记的位置。 / p>
答案 0 :(得分:6)
此函数返回ParsecT
:
import Text.Parsec.Prim
sourcePos :: Monad m => ParsecT s u m SourcePos
sourcePos = statePos `liftM` getParserState
然后你可以这样做:
parseInt :: Parser Token
parseInt = do
numStr <- many1 digit
pos <- sourcePos
return $ TokInt pos (read numStr)