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 ожидает, что синтаксический анализатор, который вы дадите ему, сам будет выполнять строгое требование новой строки и не проверяет положение строки предположительно вложенных элементов.

0 ответов

Другие вопросы по тегам