t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Webで動くVBAチュートリアルを作りたい その13

インタープリターの作成の元になる、四則計算電卓を作った。
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言語をやり始めた頃などは階乗の再帰ですでに混乱していたが、最近は多少複雑な再帰でも難なくトレースできるようになってきた。いつのまに理解できるようになったのかも覚えていない。新しい概念が頭に定着するには、しばらく時間がかかるのだろうか。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。