Text.Parsec.Indent, выбирающий контент без отступов
import Control.Applicative
import Text.Parsec hiding (many, (<|>))
import Text.Parsec.Indent
data Markup = Tag String [Markup] deriving (Show)
run sourceName p source = runIndent sourceName (runParserT (many1 p <* eof) () sourceName source)
parser = withBlock ($) (tag <* spaces) parser
tag = Tag <$> many1 alphaNum
В основном это работает так, как я ожидал, но когда я передаю ему строку типа "hello\n\twoo\nhai hai" - второй "hai" вкладывается внутрь первого, даже если там нет отступа? Что тут происходит?
ОБНОВЛЕНИЕ: похоже, что работает следующим образом:
parser = withBlock ($) (tag <* inlineSpace <* newline <* inlineSpace) parser
inlineSpace = skipMany (satisfy isInlineSpace) <?> "inline white space"
isInlineSpace c = c /= '\n' && isSpace c
Итак, похоже, withBlock
ожидает, что синтаксический анализатор, который вы дадите ему, сам будет выполнять строгое требование новой строки и не проверяет положение строки предположительно вложенных элементов.