Почему моя грамматика Nearley вызывает цикл?

Я играю с nearley.js, и что-то меня смущает. В качестве теста я пытаюсь построить парсер, разбирающий покерные ряды.

Теперь эта грамматика работает как положено:

@{% function nuller() { return null; } %}

main -> _ composition _                         {% nuller %}

composition -> _ expression _                   {% nuller %}
    | composition _ "," _ rank                  {% nuller %}

expression -> _ rank _                          {% nuller %}
rank -> [a, k, q, j, t, A, K, Q, J, T, 2-9]     {% nuller %}

_ -> [\s]:*                                     {% nuller %}

Тем не менее, второй я меняю | composition _ "," _ rank в | composition _ "," _ expression тогда я получаю цикл:

@{% function nuller() { return null; } %}

main -> _ composition _                         {% nuller %}

composition -> _ expression _                   {% nuller %}
    | composition _ "," _ expression            {% nuller %}

expression -> _ rank _                          {% nuller %}
rank -> [a, k, q, j, t, A, K, Q, J, T, 2-9]     {% nuller %}

_ -> [\s]:*                                     {% nuller %}

Может кто-нибудь объяснить мне, почему это так? Код можно быстро проверить на игровой площадке: https://omrelli.ug/nearley-playground/

Тестовая строка, которую я использую: a, k, q, j, t, 9, 8, 7, 6, 5, 4, 3, 2

Заранее большое спасибо!

0 ответов

Что ж, есть несколько возможных интерпретаций для каждого значения в вашей строке, потому что у вас обоих есть необязательные пробелы перед выражением и ранжированием:

Если вы посмотрите на второй элемент k, это можно интерпретировать как:

  • пробел + выражение
  • пробел + ранг

Поскольку у вас есть 2 возможности для 12 элементов в вашей строке, вы получите 144 возможных комбинации.

Это возвращает одно решение (я пропустил необязательный пробел перед expression):


main -> _ composition _                         {% nuller %}

composition -> _ expression _                   {% nuller %}
    | composition _ "," expression              {% nuller %}

expression -> _ rank _                          {% nuller %}
rank -> [a, k, q, j, t, A, K, Q, J, T, 2-9]     {% nuller %}

_ -> [\s]:*                                     {% nuller %}
Другие вопросы по тегам