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
,最后number
。 number
解析器以
开头
#digit asParser plus
消耗数字 </code> 并产生整数 <code>1
。
我们现在回到 term2
。我们消耗了 ' - '
,剩下 '2 + 3'
;根据 term
产生 5
。所以我们得到 1 - 5 = -4
.
简短说明
为了 term
解析为 (1 - 2) + 3
,prod
应该消耗 1 - 2
,这不是因为 prod
不涉及 $-
.
当我在 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
,最后number
。 number
解析器以
#digit asParser plus
消耗数字 </code> 并产生整数 <code>1
。
我们现在回到 term2
。我们消耗了 ' - '
,剩下 '2 + 3'
;根据 term
产生 5
。所以我们得到 1 - 5 = -4
.
简短说明
为了 term
解析为 (1 - 2) + 3
,prod
应该消耗 1 - 2
,这不是因为 prod
不涉及 $-
.