Parsec:获取表达式的开始和结束源位置?
Parsec: Getting start and end source positions of expressions?
我正在编写一种使用 Parsec 进行解析的编程语言。为了报告错误消息,我使用来自 the Pos module of Parsec.
的 getPosition
函数,将语法树的每个元素都标有其源位置
但是,它只给出了我解析的每个表达式的开始位置,我想要开始和结束,这样我就可以在源代码中突出显示它们的整个位置。
用 parsec 可以实现这样的事情吗?是否有一种标准方法来获取我正在解析的表达式的终点,以便我可以将其包含在我的 AST 中?
解析后也可以使用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")
我正在编写一种使用 Parsec 进行解析的编程语言。为了报告错误消息,我使用来自 the Pos module of Parsec.
的getPosition
函数,将语法树的每个元素都标有其源位置
但是,它只给出了我解析的每个表达式的开始位置,我想要开始和结束,这样我就可以在源代码中突出显示它们的整个位置。
用 parsec 可以实现这样的事情吗?是否有一种标准方法来获取我正在解析的表达式的终点,以便我可以将其包含在我的 AST 中?
解析后也可以使用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")