2017-05-20 8 views
0

私はparsecライブラリを試していますが、この基本的なタスクをどのように処理するかはわかりません。残りの入力がparsecの空白であるかどうかを確認する

data Foo = A | AB 

と私は文字列「」Aとして解析すると、「B」ABたい:

は、私は次があるとします。私はこれを行う場合:

parseA :: parser Foo 
parseA = do 
      reserved "a" 
      return A 

parseAB :: parser Foo 
parseAB = do 
      reserved "a" 
      reserved "b" 
      return AB 

parseFoo :: parser Foo 
parseFoo = parseA 
     <|> parseAB 

はその後 parseFooはまだ「A」を消費した後に残った非空白があることを気にしない parseA以来 Aとして「b」を解析します。どのようにこれを修正することができますか?

答えて

3

文法をAB | Aに変更し、parserからtryを使用する必要があります。これにより、パーサーに先読み機能が提供されます。

これは

parseFoo = try Parse AB <|> parse A 
+0

申し訳ありませんが動作するはずです、私は私が 'parseAB'が正常に動作していることを明らかにしている必要があり、それは私が問題を抱えているparseFoo'は'です。 – user181407

+0

ああ、持っています。あなたの文法はバックトラックが必要です –

+1

あなたは文法をAB | Aと 'の試み'を使用してください私の目的のためには、parsec –

関連する問題