PetitParser 评估器无法正常工作

PetitParser evaluator not working properly

当我在 pharo 上尝试 运行 这段代码时,我的回答有些不对。我尝试评估 1-2+3 但出于某种原因,它确实是 1- (2+3) 并且我不明白为什么会这样。谢谢你的时间。

number :=  #digit asParser plus token trim ==> [ :token | token inputValue asNumber ].

term := PPUnresolvedParser new.
prod := PPUnresolvedParser new.
term2 := PPUnresolvedParser new.
prod2 := PPUnresolvedParser new.
prim := PPUnresolvedParser new.

term def: (prod , $+ asParser trim , term ==> [ :nodes | nodes first + nodes last ]) / term2.

term2 def: (prod , $- asParser trim , term ==> [ :nodes | nodes first - nodes last ])/ prod.

prod def: (prim , $* asParser trim , prod ==> [ :nodes | nodes first * nodes last ])/ prim.

prod2 def: (prim , $/ asParser trim , prod ==> [ :nodes | nodes first / nodes last ])/ prim.

prim def: ($( asParser trim , term , $) asParser trim ==> [ :nodes | nodes second ]) / number.

start := term end.

start parse: '1 - 2 + 3'

考虑term

的定义
term
    def: prod , $+ asParser trim , term
        ==> [:nodes | nodes first + nodes last]
        / term2.

/ term2部分是

之间的OR
prod , $+ asParser trim, term ==> [something]

term2 

让我们根据term在心里解析'1 - 2 + 3'

我们首先阅读</code>,必须在上述两个选项之间做出决定。第一个将失败,除非 <code>prod 消耗 '1 - 2'。但这是不可能的,因为

prod
    def: prim , $* asParser trim , prod
        ==> [:nodes | nodes first * nodes last]
        / prim.

prim
    def: $( asParser trim , term , $) asParser trim
        ==> [:nodes | nodes second]
        / number

并且没有$*$(到来,'1 - 2'没有被#number解析。

因此,我们尝试使用 term2,其定义方式类似

term2
    def: prod , $- asParser trim , term
        ==> [:nodes | nodes first - nodes last]
        / prod.

所以现在我们在两个选项之间有 OR

如上,第一个选项失败,所以我们接下来尝试prod,然后prim,最后numbernumber 解析器以

开头
#digit asParser plus 

消耗数字 </code> 并产生整数 <code>1

我们现在回到 term2。我们消耗了 ' - ',剩下 '2 + 3';根据 term 产生 5。所以我们得到 1 - 5 = -4.


简短说明

为了 term 解析为 (1 - 2) + 3prod 应该消耗 1 - 2,这不是因为 prod 不涉及 $- .