Text.Parsec.Indent拾取非缩进内容

时间:2014-02-05 21:48:58

标签: haskell parsec

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 个答案:

没有答案