0

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

'Isn't it hot'

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

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

但它失败了:

Failure[1:15]: "'" expected

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

我需要创建一个实际的语法类吗?我试图创建一个,但不知道如何制作一个不会贪婪地消耗结束标记的解析器。

4

1 回答 1

2

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

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

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

只要之后仍有char("'")剩余可以消耗,这就会消耗输入。

于 2016-11-24T09:48:44.217 回答