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

    @namorum Автор вопроса
    Правило с заголовком секции повторяться не будет, поскольку оно не подойдёт никуда, кроме как к началу секции. В тексте больше нету последовательностей токенов, которые соответствуют терминалу SECTION_NAME, значит и вывод будет выбран другой.
    Впрочем, позже я добавлю SECTION_CONTENT – с ним правил вывода больше, зато они более читаемые.

    В предложенной Вами интерпретации отсутствует интерпретация для корневого правила SECTION, что при попытке извлечения фактов ведёт к следующей ошибке.
    ValueError: no .interpretation(...) for root rule

    Допущу, что подразумевалось, что интерпретация SECTION остаётся примерно такой же, как у меня:
    SECTION = rule(
        SECTION_NAME.interpretation(Node.name), 
        EOL,
        SECTION_CONTENT.interpretation(Node.successors)
    ).interpretation(Node)


    Тогда уже не будет работать интерпретация SECTION_CONTENT
    TypeError: AttributeInterpretator(attribute=RepeatableAttribute(fact=<class 'yargy.interpretation.fact.Node'>, name='successors')) -> [<class 'yargy.interpretation.interpretator.AttributeResult'>, <class 'yargy.token.Token'>, <class 'yargy.interpretation.interpretator.AttributeResult'>]

    В документации к yargy-парсеру почти нету разъяснений ошибок (эта ошибка там вообще не упоминается), но я полагаю, что её суть в том, что левую часть правила нельзя интерпретировать как атрибут факта.

    А если интерпретировать SECTION_CONTENT как Node, а не как Node.successors, то получается дерево разбора 1, приведённое в вопросе, что проблему не решает.

    Но спасибо за участие в обсуждении!
    Это мой первый вопрос на Хабре. Почему-то думал, что мне по такой теме совсем никто не ответит.
    Написано