我的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)。输入是用户生成的,所以我不能依赖它们的字符。
答案 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