Для задания интерпретации рекурсивного правила вывода в 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-парсере нужно использовать механизм рекурсивного объявления правил, чтобы описать структуру данных, которая может содержать переменное количество объектов/терминалов.