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