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 * という式の場合、これをトークンと同一視する必要があります。オペランドの場合は、スタックにプッシュする必要があります。演算子の場合、スタックを 2 回ポップしてオペランドを取得し、式を評価します。私は smalltalk にまったく慣れていないので、構文についてはわかりません。