Почему моя грамматика 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 %}