使用parsec获取解析源中的当前位置

时间:2014-12-14 12:26:52

标签: haskell parsec

让我们假设我有以下Parser和Tokentype:

data Token = TokInt SourcePos Int

parseInt :: Parser Token
parseInt = do
  numStr <- many1 digit
  return $ TokInt (???) (read numStr)

如何使用当前SourcePos填写缺失的部分(???)

我需要在下一步中提供这些信息。

我当前的流程是在第一次运行时标记化完整输入,然后从生成的标记列表中构建我的AST。因此,标记化可以成功,但是在构建AST时可能会出现错误,我想将用户指向文件中发生错误的实际点,因此我需要在源代码中保存标记的位置。 / p>

1 个答案:

答案 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)