Я решил эту проблему, пока она у меня была, но подумал, что ответ может спасти других людей в будущем.
Эта проблема вызвана обработкой Pest пробелов. Во-первых, обратите внимание, что приведенное выше работает, если к ключевому слову fragment
добавлено дополнительное пространство.
name = {ASCII_ALPHA+}
fragment = { "fragment " ~ name }
Однако это не самое идеальное решение, учитывая, что это обрабатывает только одно пространство. В моем конкретном варианте использования c пользователь может разместить столько пробелов, сколько они sh между ключевым словом fragment
и именем. Оказывается, решение для этого уже есть.
Из документации:
с использованием специального правила WHITESPACE. Если он определен, он будет неявно запускаться столько раз, сколько возможно, при каждой тильде ~ и между каждым повторением (например, * и +).
При первоначальном чтении я пропустил важную часть это предложение: «Если определено».
Это необязательный параметр, который необходимо включить, только один раз (определение его несколько раз, поскольку все правила Pest недопустимы) в грамматике.
WHITESPACE = _{ " " }
name = {ASCII_ALPHA+}
fragment = { "fragment " ~ name }
Обратите внимание, что важно, чтобы в начале было подчеркивание _{ " " }
, потому что это отмечает его как неявное правило, поэтому оно не будет отображаться как Pair
, когда вы манипулируете им из программы Rust.