如何创建一个允许字符恰好与开始/结束字符相同的解析器。使用以下示例:
'Isn't it hot'
第二个单引号应该被接受为开头和结尾单引号之间内容的一部分。我创建了一个这样的解析器:
char("'").seq((word()|char("'")|whitespace()).plus()).seq(char("'"))
但它失败了:
Failure[1:15]: "'" expected
如果我使用" any()| char("'"),那么它会贪婪地消耗结束的单引号,从而导致错误。
我需要创建一个实际的语法类吗?我试图创建一个,但无法弄清楚如何制作一个不会贪婪地使用结束标记的Parser。
答案 0 :(得分:2)
问题在于plus()是贪婪和盲目的。这意味着重复消耗尽可能多的输入,但不考虑之后发生的事情。在您的示例中,消耗了直到输入结尾的所有内容,但序列中的最后一个引号不再匹配。
您可以使用非盲变异plusGreedy(Parser)来解决问题:
char("'")
.seq((word() | char("'") | whitespace()).plusGreedy(char("'")))
.seq(char("'"));
只要还剩下char("'")
,就会消耗输入。