Я играю с 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
Заранее большое спасибо!