2016-03-18 86 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") 
相關問題