インタープリターの作成の元になる、四則計算電卓を作った。
C++のソースを見ながらVBAのコードを書いたので、C++初心者にはそれだけで一苦労だった。
再帰的下向き構文解析というアルゴリズムらしい。
Stackは以前に公開したものを流用している。
Dim ProgramStack As Stack Dim DataStack As Stack Dim Data() As String Dim P As Integer Sub Main() P = 0 Set DataStack = New Stack Set ProgramStack = New Stack Data = Split("3 + 5 * 2 - ( 3 * ( 1 / 2 ) )", " ") Call Expression Debug.Print "Answer:"; DataStack.Top End Sub Sub Expression() Call Term Do While Data(P) Like "[+-]" OP = Data(P) P = P + 1 Call Term Call Operate(OP) Loop End Sub Sub Term() Call Factor On Error GoTo Err Do While Data(P) Like "[*/]" OP = Data(P) P = P + 1 Call Factor Call Operate(OP) Loop Err: End Sub Sub Factor() If IsNumeric(Data(P)) Then DataStack.Push (Data(P)) ElseIf Data(P) = "(" Then P = P + 1 Call Expression If Data(P) <> ")" Then Call Err.Raise(1, , "シンタックスエラー") Else End If If P < UBound(Data) Then P = P + 1 End If End Sub Sub Operate(OP) d2 = CDbl(DataStack.Pop) d1 = CDbl(DataStack.Pop) Select Case OP Case "+": DataStack.Push (d1 + d2) Case "-": DataStack.Push (d1 - d2) Case "*": DataStack.Push (d1 * d2) Case "/": DataStack.Push (d1 / d2) End Select Debug.Print d1 & OP & d2 & "=" & DataStack.Top End Sub
Scheme言語をやり始めた頃などは階乗の再帰ですでに混乱していたが、最近は多少複雑な再帰でも難なくトレースできるようになってきた。いつのまに理解できるようになったのかも覚えていない。新しい概念が頭に定着するには、しばらく時間がかかるのだろうか。