假设我有一些文字:
a = "foobarbaz"
b = "foobar"
c = "foo"
d = "rubbish"
e = "foobazbar"
三个解析器 foo、bar 和 baz 分别用于字符串 'foo'、'bar' 和 'baz'。
我将如何创建一个可以给我结果的解析器:
a = ["foo", "bar", "baz"]
b = ["foo", "bar"]
c = ["foo"]
d = []
e = ["foo"]
什么时候针对上面的输入运行?基本上在构建列表时尝试每种可能性,直到失败。我可以使用用户状态,但如果可能的话我想避免。(我想让各个解析器自己不知道用户状态)
我得到的最接近的是下面的 fooseq:
let foo = pstring "foo"
let bar = pstring "bar"
let baz = pstring "baz"
let foobar = pipe2 foo bar Seq.of2
let foobarbaz = pipe3 foo bar baz Seq.of3
let fooseq = choice (Seq.map attempt [foobarbaz; foobar; foo |>> Seq.of1 ;])
//(the Seq.ofx functions just take arguments and create a sequence of them)
在我看来,必须有更好的方法来做到这一点?