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
期望您提供的解析器本身会执行严格的换行要求,并且不会检查所谓嵌套项的行位置。