この単純化された問題について、次のような入力を解析しようとしています
foo bar
baz quux
woo
hoo xyzzy
glulx
の中へ
[["foo", "bar", "baz", "quux", "woo"], ["hoo", "xyzzy", "glulx"]]
私が試したコードは次のとおりです。
import qualified Text.Megaparsec.Lexer as L
import Text.Megaparsec hiding (space)
import Text.Megaparsec.Char hiding (space)
import Text.Megaparsec.String
import Control.Monad (void)
import Control.Applicative
space :: Parser ()
space = L.space (void spaceChar) empty empty
item :: Parser () -> Parser String
item sp = L.lexeme sp $ some letterChar
items :: Parser () -> Parser [String]
items sp = L.lineFold sp $ \sp' -> some (item sp')
items_ :: Parser [String]
items_ = items space
これは の 1 つのブロックに対して機能しitems
ます。
λ» parseTest items_ "foo bar\n baz quux\n woo"
["foo","bar","baz","quux","woo"]
しかし、解析しようとするとすぐにmany items
、インデントされていない最初の行で失敗します。
λ» parseTest (many items_) "foo bar\n baz quux\n woo\nhoo xyzzy\n glulx"
4:1:
incorrect indentation (got 1, should be greater than 1)
または、さらに単純な入力で:
λ» parseTest (many items_) "a\nb"
2:1:
incorrect indentation (got 1, should be greater than 1)