Анализатор грамматики Tatsu и codegen, дающие два очень разных результата

#python #parsing #peg #tatsu

#python #синтаксический анализ #привязка #tatsu

Вопрос:

Я работаю с TatSu, и результаты, которые я получаю от анализатора codegen, сильно отличаются от тех, которые я получаю при прямой сборке анализатора. Рассмотрим довольно простую грамматику для обозначения кубиков:

 start = expression $;

int = /-?d / ;

dice = number_of_dice:factor /d|D/ sides:factor;

expression = addition ;

addition
    =
    | left:addition op:(' ' | '-') ~ right:addition
    | dice_expr
    ;

dice_expr
    =
    | dice
    | factor
    ;

factor
    =
    | '(' ~ @:expression ')'
    | int
    ;
  

Затем, если я передам 1d3 синтаксический анализатор, сгенерированный через tatsu.compile , я получу ожидаемый результат:

 {'number_of_dice': '1', 'sides': '3'}
  

Однако, когда я использую анализатор, созданный с помощью инструмента командной строки TatSu, я получаю:

 {'left': None, 'op': None, 'right': None}
  

Я пробовал отделять правила, комбинировать правила и т.д. Единственный способ заставить его работать — это прерывать такие операторы, как (1 2)d3 break. Я чего-то не понимаю?

Комментарии:

1. Если эта проблема все еще присутствует, не могли бы вы опубликовать проблему против TatSu? Грамматика остается рекурсивной, и в сгенерированном анализаторе может отсутствовать шаг разрешения.

2. Я опубликовал проблему. Пожалуйста, не стесняйтесь следить за этим. Было бы неплохо узнать, как вы вызвали инструмент командной строки. github.com/neogeny/TatSu/issues/180

3. Честно говоря, я переключился на другой инструмент, поэтому я не уверен, присутствует ли он по-прежнему или нет

Ответ №1:

Эта проблема решена в последней версии TatSu:https://pypi.org/project/tatsu /