2016-03-18 23 views
7

我正在写使用秒差距为它的解析一种编程语言。对于报告的错误信息,我有我的标有其源位置语法树的每个元素,使用getPosition功能从秒差距的the Pos moduleParsec:获取表达式的开始和结束源位置?

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

这种事可能与秒差距?有没有一种标准的方式来获得我正在解析的表达式的终点,以便我可以将它包含在我的AST中?

+1

我推荐看“野兔”也有同样的问题与相对位置解决它。也许Matthew Pickering在skillmatter2015会议上的发言可以提供一些见解 – epsilonhalbe

回答

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")