2017-09-14 7 views
3

私はParsecを使用してメディアウィキテキストを解析しようとしています。メディアウィキマークアップの構造のいくつかは、行の先頭にのみ現れます(ヘッダマーク==header level 2==など)。正規表現では、アンカー(例えば、^)を使用して行の先頭を検索します。 GHCiの中Parsecの行開始パターン?

一つの試みは、

Prelude Text.Parsec> parse (char '\n' *> string "==" *> many1 letter <* string "==") "" "\n==hej==" 
Right "hej" 

ですが、それはファイルの最初の行に失敗しますので、これはあまりにも良いではありません。私はこれが解決された問題でなければならないと感じています...

Parsecで最も慣用的な "Start of line"解析は何ですか?

答えて

2

パーサーが現在見ている列番号を調べるには、getPositionsourceColumnを使用できます。現在の位置が行の先頭にある場合(たとえば、入力の開始時または\nまたは\r文字の後など)、列番号は1になります。そここのための組み込みコンビネータはありませんが、あなたは簡単にそれを作ることができ

import Text.Parsec 
import Control.Monad (guard) 

startOfLine :: Monad m => ParsecT s u m() 
startOfLine = do 
    pos <- getPosition 
    guard (sourceColumn pos == 1) 

は今、あなたはあなたのヘッダーパーサを書くことができますように:

header = startOfLine *> string "==" *> many1 letter <* string "==" 
1

おそらくchar '\n'の代わりにmany (char '\n')を使用できます。パーサーコンビネータでは、の意味はありません。は、常に入力の始めに実行されるためです。あなたができる唯一のことは、あなたの入力がどのシンボルから始まるかを手動でチェックすることです。 many (char '\n')を使用すると、ヘッダ== my header ==の前に空白行が0個以上あることが保証されます。

+0

'多くの(シャア\ n ') 'は、ヘッダーが行頭に表示されていることを確認することはありません。なぜなら、' many'は0回だけ一致することによってどこでも一致することができるからです。 – 4castle

関連する問題