在parsec中用单引号字符串解析单引号char

时间:2014-07-24 17:44:48

标签: parsing haskell parsec quoted-identifier

我的parsec解析器中有一个愚蠢的情况,我希望你的帮助。

我需要解析由|分隔的一系列强项/字符字符。 所以,我们可以有一个| b |'c'|'abcd'

应该变成

[a,b,c,abcd]

除非在''字符串内,否则不允许使用空格。现在,在我天真的尝试中,我得到了现在的情况,我可以解析像a'a |'bb'到[a'a,bb]但不是aa |'b'b'到[aa,b'b]的字符串

singleQuotedChar :: Parser Char
singleQuotedChar = noneOf "'" <|> try (string "''" >> return '\'')

simpleLabel = do
    whiteSpace haskelldef
    lab <- many1 (noneOf "|")
    return $ lab

quotedLabel = do
    whiteSpace haskelldef
    char '\''
    lab <- many singleQuotedChar
    char '\''
    return $ lab

现在,如果它后跟一个|,我如何告诉解析器考虑“停止”还是白色空间? (或者,得到一些'char count into this)。输入是用户生成的,所以我不能依赖它们的字符。

1 个答案:

答案 0 :(得分:1)

请注意,在引号括起的字符串中间允许引号非常容易阅读,但我相信这应该允许您解析它。

quotedLabel = do -- reads the first quote.
    whiteSpace
    char '\''
    quotedLabel2

quotedLabel2 = do -- reads the string and the finishing quote.
    lab <- many singleQuotedChar
    try  (do more <- quotedLabel3
             return $ lttrace "quotedLabel2" (lab ++ more))
     <|> (do char '\''
             return $ lttrace "quotedLabel2" lab)


quotedLabel3 = do -- handle middle quotes
    char '\''
    lookAhead $ noneOf ['|']
    ret <- quotedLabel2
    return $ lttrace "quotedLabel3" $ "'" ++ ret