#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 /