【发布时间】:2015-12-17 19:39:58
【问题描述】:
我想解析以下文本:
keyword some more values
funcKeyw funcName1
funcKeyw funcName2
funcKeyw funcName3
keyword some more values
funcKeyw funcName2
keyword some more values
funcKeyw funcName4
缩进由制表符完成。每个块都由keyword 和同一行中的一些附加值开始。缩进的所有内容都属于同一个块。 在所有函数调用(以funcKeyw 关键字开头)之后,可以有子keyword 块(由“空”行分隔;“空”表示其中没有任何内容或空白字符)。
type IndentLevel = Int
data Block = Block { blockFuncCalls :: [String]
, blockBlocks :: [Block]
}
block :: GenParser Char st Block
block = parseBlock 0
where
parseBlock lvl = do
count lvl tab
string "keyword"
-- [...] Parse other stuff in that line.
newline
-- Parse 'function calls'.
fs <- sepBy1 (blockFunc (lvl + 1)) emptyLines
-- Parse optional child blocks.
emptyLines
bs <- sepBy (parseBlock (lvl + 1)) emptyLines
return Block { blockFuncCalls=fs
, blockBlocks=bs
}
blockFunc :: IndentLevel -> GenParser Char st String
blockFunc lvl = do
count lvl tab
string "funcKeyw"
-- [...] Parse function name etc..
newline
return funcName -- Parsed func name.
emptyLine :: GenParser Char st ()
emptyLine = many (oneOf "\t ") >> newline >> return ()
emptyLines :: GenParser Char st ()
emptyLines = many emptyLine >> return ()
问题是blockFunc解析器在子块启动时并没有停止解析,而是返回错误unexpected 'keyword'。
我怎样才能避免这种情况?我想我可以使用try 或choice 为每一行选择正确的解析器,但我想要求函数调用在子块之前。
【问题讨论】:
标签: haskell parsec parser-combinators