Yargy-парсер | Как задать интерпретацию рекурсивного правила вывода для извлечения неизвестного числа терминалов в качестве repeatable-атрибута факта?

Для задания интерпретации рекурсивного правила вывода в Yargy-парсере для извлечения неизвестного числа терминалов в качестве атрибута repeatable-fact, следует использовать механизм рекурсивных правил Yargy, а именно классы Rule, or_, и and_.

Допустим, у нас есть грамматика, которая описывает последовательность слов, которая может повторяться:

from yargy import rule, or_, and_
from yargy.predicates import gram, gte, lte

Rule == or_(
    and_(gte(2), lte(4), gram('NOUN')),
    and_(gte(2), lte(4), gram('VERB'))
)

В данном случае мы описываем правило Rule, которое может быть либо последовательностью от 2 до 4 существительных (NOUN), либо от 2 до 4 глаголов (VERB).

Для обработки рекурсивного правила, когда мы не знаем заранее количество терминалов, можно использовать возможность рекурсивного объявления правила. Например, для разбора последовательности числительных:

from yargy import rule, and_
from yargy.predicates import gram, in_

Numbers = rule(
    gram('INT'),
    or_(
        gram('INT'),
        and_(Numbers, in_('-', ','), gram('INT'))
    )
)

В данном случае мы объявляем правило Numbers, которое состоит из числительного (INT), за которым следует либо еще одно числительное, либо знак "-" или "," и еще одно числительное, и так далее, что позволяет нам разбирать последовательность числительных переменной длины.

Таким образом, для извлечения неизвестного числа терминалов в качестве атрибута repeatable-fact в Yargy-парсере нужно использовать механизм рекурсивного объявления правил, чтобы описать структуру данных, которая может содержать переменное количество объектов/терминалов.