Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell parsec:'optional'组合符中的'many'组合符_Haskell_Parsec - Fatal编程技术网

Haskell parsec:'optional'组合符中的'many'组合符

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

我想使用Haskell的parsec库实现此语法规则:

((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