Почему я не могу передать ключевое слово, за которым следует идентификатор, используя Pest? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть следующая грамматика Pest (https://pest.rs)

name = {ASCII_ALPHA+}
fragment = { "fragment" ~ name }

Когда я пытаюсь разобрать fragment name, используя это, я получаю эту ошибку:

 --> 1:9
  |
1 | fragment name
  |         ^---
  |
  = expected name

1 Ответ

0 голосов
/ 07 августа 2020

Я решил эту проблему, пока она у меня была, но подумал, что ответ может спасти других людей в будущем.

Эта проблема вызвана обработкой Pest пробелов. Во-первых, обратите внимание, что приведенное выше работает, если к ключевому слову fragment добавлено дополнительное пространство.

name = {ASCII_ALPHA+}
fragment = { "fragment " ~ name }

Однако это не самое идеальное решение, учитывая, что это обрабатывает только одно пространство. В моем конкретном варианте использования c пользователь может разместить столько пробелов, сколько они sh между ключевым словом fragment и именем. Оказывается, решение для этого уже есть.

Из документации:

с использованием специального правила WHITESPACE. Если он определен, он будет неявно запускаться столько раз, сколько возможно, при каждой тильде ~ и между каждым повторением (например, * и +).

При первоначальном чтении я пропустил важную часть это предложение: «Если определено».

Это необязательный параметр, который необходимо включить, только один раз (определение его несколько раз, поскольку все правила Pest недопустимы) в грамматике.

WHITESPACE = _{ " " }
name = {ASCII_ALPHA+}
fragment = { "fragment " ~ name }

Обратите внимание, что важно, чтобы в начале было подчеркивание _{ " " }, потому что это отмечает его как неявное правило, поэтому оно не будет отображаться как Pair, когда вы манипулируете им из программы Rust.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...