我正在使用 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'}
但是,当我使用解析器生成的 Vita TatSu 命令行工具时,我得到:
{'left': None, 'op': None, 'right': None}
我试过分离规则、组合规则等。我能让它工作的唯一方法是打破像(1+2)d3
break这样的语句。有什么我想念的吗?