Parsec:获取表达式的开始和结束源位置?

时间:2016-03-18 07:21:45

标签: parsing haskell ghc parsec parser-combinators

我正在编写一种使用Parsec进行解析的编程语言。为了报告错误消息,我使用来自Parsec的the Pos module getPosition函数,将我的语法树的每个元素标记为其源位置。

但是,它只给出了我解析的每个表达式的开头的位置,我想要开头和结尾,这样我就可以在源代码中突出显示它们的整个位置。

用parsec可以实现这样的事吗?是否有一种标准的方法来获取我正在解析的表达式的终点,以便我可以将它包含在我的AST中?

1 个答案:

答案 0 :(得分:7)

您也可以在解析后使用getPosition

import Text.Parsec
import Text.Parsec.String

spanned :: Parser a -> Parser (SourcePos, SourcePos, a)
spanned p = do
  pos1 <- getPosition
  a <- p
  pos2 <- getPosition
  pure (pos1, pos2, a)

测试:

> parseTest (spanned (many1 (char 'a'))) "aaaaafff"
((line 1, column 1),(line 1, column 6),"aaaaa")