Как бы я создал парсер, который потребляет символ, который также находится в начале и в конце
Как бы я создал парсер, который позволяет символу, который также совпадает с символом начала / конца. Используя следующий пример:
'Isn't it hot'
Вторая одинарная кавычка должна приниматься как часть содержимого, которое находится между начальной и конечной одинарной кавычкой. Я создал парсер вот так:
char("'").seq((word()|char("'")|whitespace()).plus()).seq(char("'"))
но это не так:
Failure[1:15]: "'" expected
Если я использую "any()|char("'"), то он жадно потребляет конечную одинарную кавычку, что также приводит к ошибке.
Нужно ли мне создавать настоящий класс по грамматике? Я попытался создать его, но не могу понять, как создать парсер, который не пытается жадно использовать маркер конца.
1 ответ
Проблема в том, что plus() является жадным и слепым. Это означает, что повторение потребляет как можно больше входных данных, но не учитывает, что происходит потом. В вашем примере все до конца ввода потребляется, но тогда последняя кавычка в последовательности больше не может быть сопоставлена.
Вы можете решить эту проблему, используя вместо этого незакрытый вариант plusGreedy(Parser):
char("'")
.seq((word() | char("'") | whitespace()).plusGreedy(char("'")))
.seq(char("'"));
Это потребляет входные данные до тех пор, пока char("'")
осталось, что можно употреблять потом.