2016-03-18 11 views
7

私は構文解析にParsecを使用するプログラミング言語を書いています。エラーメッセージを報告するために、Parsecのthe Pos modulegetPosition関数を使用して、構文木の各要素にそのソースの場所をラベル付けしました。Parsec:式の開始位置と終了位置を取得しますか?

しかし、それは私が解析した各式の先頭の位置を与えるだけで、ソースコード内の全体の位置を強調することができるように、最初と最後を望みます。

parsecでこのようなことが可能ですか?構文解析している式の終点を取得する標準的な方法があるので、それを私のASTに含めることができますか?

+1

私はそれは相対的な位置でそれを解決する同じ問題を抱えていた「野うさぎ」を見て推薦。 skillmatter2015会議でのMatthew Pickeringの講演では、ある程度の洞察が得られるかもしれません – 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") 
関連する問題