Как бы я создал парсер, который потребляет символ, который также находится в начале и в конце

Как бы я создал парсер, который позволяет символу, который также совпадает с символом начала / конца. Используя следующий пример:

'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("'") осталось, что можно употреблять потом.

Другие вопросы по тегам