Haskell parsec:'optional'组合符中的'many'组合符
我想使用Haskell的parsec库实现此语法规则:Haskell parsec:'optional'组合符中的'many'组合符,haskell,parsec,Haskell,Parsec,我想使用Haskell的parsec库实现此语法规则: ((a | b | c)* (a | b))? 它是接受可选(即可能为空)字符串的解析器规则。如果它接受的字符串不是空的,那么可以通过传递ab或c解析器的零次或多次出现来使用它,但是最外层的接受的字符串?可选解析器必须由解析器a或b使用,而不是c。下面是一个例子: modulemain其中 导入文本.Parsec 导入Text.Parsec.Text a、 b,c::GenParser()字符 a=字符“a” b=字符“b” c=字符“c
((a | b | c)* (a | b))?
它是接受可选(即可能为空)字符串的解析器规则。如果它接受的字符串不是空的,那么可以通过传递a
b
或c
解析器的零次或多次出现来使用它,但是最外层的接受的字符串?
可选解析器必须由解析器a
或b
使用,而不是c
。下面是一个例子:
modulemain其中
导入文本.Parsec
导入Text.Parsec.Text
a、 b,c::GenParser()字符
a=字符“a”
b=字符“b”
c=字符“c”
--((a | b | c)*(a | b))?
myParser=未定义
shouldParse1,shouldParse2,shouldParse3,
shouldParse4,shouldFail::ParseError字符串
--这些应该会成功
shouldParse1=runParser myParser()“”——因为?可选择的
shouldParse2=runParser myParser()“b”
shouldParse3=runParser myParser()“ccccb”
shouldParse4=runParser myParser()“aabccab”
--这应该失败,因为它以“c”结尾
shouldFail=runParser myParser()“aabccac”
main=do
打印应为第1页
打印应为Pars2
打印应为3页
打印应为Parse4
打印失败
第一次尝试可能如下所示:
myParser=option”“$do
str我们还可以说明这一点稍有不同:c
只有在后面跟有任何标记的情况下,解析器才会成功,这可以通过单个lookAhead
完成:
myParser = many (a <|> b <|> (c <* (lookAhead anyToken <?> "non C token"))) <* eof
myParser=many(a b(c)可能解析(a | b | c)+然后如果它以c结尾就拒绝它?谢谢,这是行得通的。我有一半的期望它不会行得通,因为anyToken
我假设它的意思就是,不管它是'd'、'\n'还是别的什么。我想的是myParser=many(a b(c@RobStewart:duce