Tatsu语法解析器和代码生成产生两个截然不同的结果

问题描述

我正在使用TatSu,并且从代码生成解析器获得的结果与直接构建解析器时获得的结果非常不同。考虑骰子符号的相当简单的语法:

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之类的语句。有什么我想念的吗?

解决方法

此问题已在最新版 TatSu 中解决:https://pypi.org/project/tatsu/