当我尝试在法罗上运行这段代码时,我的答案就有点不一样了。我试着评估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'发布于 2017-02-04 02:27:06
考虑term的定义
term
def: prod , $+ asParser trim , term
==> [:nodes | nodes first + nodes last]
/ term2./ term2部件是介于
prod , $+ asParser trim, term ==> [something]和
term2 让我们从精神上解析'1 - 2 + 3',根据term。
我们首先阅读了$1,并必须在上面的两个选项之间做出决定。第一个问题将失败,除非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,最后是number。number解析器以
#digit asParser plus 它消耗数字$1并生成整数1。
我们现在回到term2。我们消费' - ',剩下的是'2 + 3';根据term的说法,这会产生5。所以我们得到了1 - 5 = -4。
短解释
要让term解析为(1 - 2) + 3,prod应该使用1 - 2,这是因为prod不涉及$-。
https://stackoverflow.com/questions/42034072
复制相似问题