さて、いよいよ命令を解釈して実行してみる。
まずは、VBAの命令を文字列として呼び出すために、Wrapperを作る。
Sub VBA_MsgBox(x) MsgBox (x) End Sub
次に、その6で作ったGlobalDefinitionの最後の行にVBAFunctionの中身を変更するコードを記述。
VBAFunctions.Item("MsgBox") = "VBA_MsgBox"
そして、命令を解釈して実行するRunCommandプロシージャを作成。
Sub RunCommand(Memory() As String) Dim s As New Stack 'データ用のスタック Dim p As New Stack 'プログラム用のスタック For i = 0 To UBound(Memory) If VBAFunctions.Exists(Memory(i)) Then 'Memory(i)が命令だったら、プログラムスタックにPush p.Push (VBAFunctions.Item(Memory(i))) Else If Memory(i) <> Empty Then If s.Top = "&" Then s.Pop Dim l, r l = s.Pop: r = Memory(i) If Left(l, 1) = """" And Right(l, 1) = """" Then l = Left(l, Len(l) - 1) End If If Right(r, 1) = """" And Right(r, 1) = """" Then r = Right(r, Len(r) - 1) End If s.Push l & r Else s.Push (Memory(i)) End If End If End If Next i 'Runコマンドにプログラムスタックと、データを渡して実行 Call Run(p.Pop, s.Pop) 'スタックが残っていたら出力 Do While s.Top <> Empty Debug.Print s.Pop Loop End Sub
そして、その6で作ったTesterプロシージャのPrinterを呼び出す箇所を今作ったRunCommandに置き換えて実行。
'Call Printer(Memory) Call RunCommand(Memory)
ダブルクォーテーションがついたままであるが、とりあえず動いた。
演算子は&にしか対応していない。
あまり先のことを考えずにコーディングしてきたので、いまにも破綻しそうである。
そろそろコードの整理を進めないと。。