smalltalk中的后缀计算

smalltalk中的后缀计算,smalltalk,postfix-notation,Smalltalk,Postfix Notation,我必须编写一个代码来计算Smalltalk中的后缀符号(反向波兰求值)。我已经阅读了文档,还实现了一个堆栈。这是我迄今为止编写的代码: Object subclass: #Rpcalc instanceVariableNames: 'anArray top' classVariableNames: '' poolDictionaries: '' category: nil ! pop: | item | item := anArray at: top. top := top - 1.

我必须编写一个代码来计算Smalltalk中的后缀符号(反向波兰求值)。我已经阅读了文档,还实现了一个堆栈。这是我迄今为止编写的代码:

Object subclass: #Rpcalc
instanceVariableNames: 'anArray top'
classVariableNames: ''
poolDictionaries: ''
category: nil !

pop:
    | item |
item := anArray at: top.
top := top - 1.
^item!

push: item
 top := top + 1.
 anArray at: top put: item!

setsize: n
  anArray := Array new: n.
  top := 0! 

evaluate:
       | expression aToken op1 op2 operator answer|
   Transcript show: 'Enter Expression' .
   expression :- stdin nextLine.

   | aStack |
   aStack := Array new: 10 .

   aToken := self getNextToken.
       ((aToken key) = 'operand')
       ifTrue: [push : aToken].

        aToken := self getNextToken.
       ((aToken key) = 'operator')
        ifTrue:  [op1 := pop.
           op2 := pop.
           operator := aToken.
   "if(operator := +)"
   "answer := op1 + op2"
我想知道如何标记表达式中的每个元素。例如。, 对于表达式, 10 3 + 3 7 * -
我需要把它等同于一个代币。如果它是一个操作数,它应该将它推入堆栈。如果是运算符,则弹出堆栈两次以获取操作数并计算表达式。我对smalltalk完全不熟悉,所以我对语法一无所知。

我建议您看看。您可以将表达式:
103+37*
解析为一个标记,如:NumberToken(10)、OperatorTocken(+),然后根据标记执行所需操作。也不要这样做

operator = '+' ifTrue: [op1 + op2]
做:


相反,您没有指定使用哪种Smalltalk方言。在Squeak中,可以使用
findTokens:
方法:

'336 8 4 2 1 + - * /' findTokens: ' '
==> an OrderedCollection('336' '8' '4' '2' '1' '+' '-' '*' '/')
使用
isDigit
测试令牌是否为数字:

'336' first isDigit
==> true
'+' first isDigit
==> false
要将字符串转换为数字,请使用
asNumber

'336' asNumber
==> 336
整个RPN解析器/计算器可以用不到10行代码轻松实现,但显然这是您的家庭作业(提示:不需要实现堆栈,已经有了一个)。

使用
#perform:
是您应该做的事情,前提是(a)您是一个有经验的Smalltalker,并且(b)您绝对必须这样做。它破坏了内省,很容易让你的生活陷入地狱。对于这样的解释器,我会说不要使用
#perform:with:
。通过显式检查,您可以一目了然地看到支持的操作。
'336' asNumber
==> 336