我陷入以下解析问题:
从有限的字符集中解析一些可能包含零个或多个元素的文本字符串,最多但不包括一组终止字符中的一个。内容/无内容应通过Maybe
. 终止字符可能以转义形式出现在字符串中。解析应该在任何不可接受的字符上失败。
这就是我想出的(简化):
import qualified Text.Megaparsec as MP
-- Predicate for admissible characters, not including the control characters.
isAdmissibleChar :: Char -> Bool
...
-- Predicate for control characters that need to be escaped.
isControlChar :: Char -> Bool
...
-- The escape character.
escChar :: Char
...
pComponent :: Parser (Maybe Text)
pComponent = do
t <- MP.many (escaped <|> regular)
if null t then return Nothing else return $ Just (T.pack t)
where
regular = MP.satisfy isAdmissibleChar <|> fail "Inadmissible character"
escaped = do
_ <- MC.char escChar
MP.satisfy isControlChar -- only control characters may be escaped
比如说,可接受的字符是大写 ASCII,转义是 '\',控制是 ':'。然后,以下内容正确解析:ABC\:D:EF
到 yield ABC:D
。ABC&D
但是,不可接受的 parsing&
确实会产生ABC
,而我会期望出现错误消息。
两个问题:
- 为什么
fail
结束解析而不是解析器失败? - 上述方法对解决问题是否明智,或者是否有“正确”的规范方法来解析我不知道的终止字符串?