我将如何创建一个消费者也使用同一个开头和结尾的角色

时间:2016-11-23 20:59:06

标签: dart petitparser

如何创建一个允许字符恰好与开始/结束字符相同的解析器。使用以下示例:

'Isn't it hot'

第二个单引号应该被接受为开头和结尾单引号之间内容的一部分。我创建了一个这样的解析器:

char("'").seq((word()|char("'")|whitespace()).plus()).seq(char("'"))

但它失败了:

Failure[1:15]: "'" expected

如果我使用" any()| char("'"),那么它会贪婪地消耗结束的单引号,从而导致错误。

我需要创建一个实际的语法类吗?我试图创建一个,但无法弄清楚如何制作一个不会贪婪地使用结束标记的Parser。

1 个答案:

答案 0 :(得分:2)

问题在于plus()是贪婪和盲目的。这意味着重复消耗尽可能多的输入,但不考虑之后发生的事情。在您的示例中,消耗了直到输入结尾的所有内容,但序列中的最后一个引号不再匹配。

您可以使用非盲变异plusGreedy(Parser)来解决问题:

char("'")
  .seq((word() | char("'") | whitespace()).plusGreedy(char("'")))
  .seq(char("'"));

只要还剩下char("'"),就会消耗输入。