OSDN Git Service

初期インポート master
authoru6k.yu1 <u6k.yu1@gmail.com>
Sat, 30 Oct 2010 12:30:45 +0000 (21:30 +0900)
committeru6k.yu1 <u6k.yu1@gmail.com>
Sat, 30 Oct 2010 12:30:45 +0000 (21:30 +0900)
hoge-language/hoge-lang.vbs [new file with mode: 0644]
hoge-language/memo.txt [new file with mode: 0644]

diff --git a/hoge-language/hoge-lang.vbs b/hoge-language/hoge-lang.vbs
new file mode 100644 (file)
index 0000000..46f1203
--- /dev/null
@@ -0,0 +1,3270 @@
+Option Explicit\r
+\r
+' ***** \83O\83\8d\81[\83o\83\8b\95Ï\90\94\81E\92è\90\94 *****\r
+\r
+Dim LOG_PATH, STACKTRACE_PATH\r
+\r
+LOG_PATH = ""\r
+STACKTRACE_PATH = ""\r
+\r
+' ***** \8f\88\97\9d\8aJ\8en *****\r
+\r
+' Call CompileFile(WScript.Arguments(0))\r
+' Call ExecuteCodeFile(WScript.Arguments(0))\r
+Call TestSuite()\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83g\83b\83v\83\8c\83x\83\8b\8aÖ\90\94\r
+' ********************************************************************************\r
+\r
+Public Function Parse(strSourceCode)\r
+Call StartFunction("Parse")\r
+       Dim nodProgram\r
+       Dim objTokenizer, colDelimiter, colIgnoreToken\r
+       \r
+       Set colDelimiter = New Collection\r
+       Call colDelimiter.Add(" ")\r
+       Call colDelimiter.Add(vbTab)\r
+       Call colDelimiter.Add(vbCr)\r
+       Call colDelimiter.Add(vbLf)\r
+       Call colDelimiter.Add("{")\r
+       Call colDelimiter.Add("}")\r
+       Call colDelimiter.Add("(")\r
+       Call colDelimiter.Add(")")\r
+       Call colDelimiter.Add(",")\r
+       Call colDelimiter.Add(";")\r
+       Call colDelimiter.Add("+")\r
+       Call colDelimiter.Add("-")\r
+       Call colDelimiter.Add("*")\r
+       Call colDelimiter.Add("/")\r
+       Call colDelimiter.Add("<=")\r
+       Call colDelimiter.Add("<")\r
+       Call colDelimiter.Add(">=")\r
+       Call colDelimiter.Add(">")\r
+       Call colDelimiter.Add("!")\r
+       Call colDelimiter.Add("=")\r
+       Call colDelimiter.Add("""")\r
+       \r
+       Set colIgnoreToken = New Collection\r
+       Call colIgnoreToken.Add(" ")\r
+       Call colIgnoreToken.Add(vbTab)\r
+       Call colIgnoreToken.Add(vbCr)\r
+       Call colIgnoreToken.Add(vbLf)\r
+       \r
+       Set objTokenizer = New Tokenizer\r
+       Call objTokenizer.Initialize(strSourceCode, colDelimiter, colIgnoreToken)\r
+       \r
+       Set nodProgram = New NodeProgram\r
+       Call nodProgram.Parse(objTokenizer)\r
+       \r
+       Set Parse = nodProgram\r
+Call EndFunction()\r
+End Function\r
+\r
+Public Function Compile(nodProgram)\r
+Call StartFunction("Compile")\r
+       Dim objContext\r
+       \r
+       Set objContext = New CompileContext\r
+       Call nodProgram.Compile(objContext)\r
+       \r
+       Compile = objContext.ToStringCode()\r
+Call EndFunction()\r
+End Function\r
+\r
+Public Sub CompileFile(strSourceCodePath)\r
+       LOG_PATH = strSourceCodePath & ".log"\r
+       STACKTRACE_PATH = strSourceCodePath & ".stacktrace"\r
+       \r
+       Call ClearStackTrace()\r
+       \r
+       Dim strNodeTreePath, strCodePath\r
+       strNodeTreePath = strSourceCodePath & ".tree"\r
+       strCodePath = strSourceCodePath & ".code"\r
+       \r
+       Dim strSourceCode\r
+       strSourceCode = ReadFile(strSourceCodePath)\r
+       \r
+       Dim nodProgram\r
+       Set nodProgram = Parse(strSourceCode)\r
+       \r
+       Call WriteFile(strNodeTreePath, nodProgram.ToString())\r
+       \r
+       Dim strCode\r
+       strCode = Compile(nodProgram)\r
+       \r
+       Call WriteFile(strCodePath, strCode)\r
+       \r
+       Call ClearStackTrace()\r
+End Sub\r
+\r
+Public Function ExecuteCode(strCode)\r
+Call StartFunction("ExecuteCode")\r
+       Dim objContext\r
+       \r
+       Set objContext = New VMContext\r
+       Call objContext.Initialize(strCode)\r
+       \r
+       Do While objContext.IsRunning\r
+               Call objContext.Execute()\r
+       Loop\r
+       \r
+       ExecuteCode = objContext.ExitCode\r
+Call EndFunction()\r
+End Function\r
+\r
+Public Sub ExecuteCodeFile(strCodePath)\r
+       LOG_PATH = strCodePath & ".log"\r
+       STACKTRACE_PATH = strCodePath & ".stacktrace"\r
+       \r
+       Call ClearStackTrace()\r
+       \r
+       Dim strCode\r
+       Dim objContext\r
+       Dim intCount\r
+       \r
+       strCode = ReadFile(strCodePath)\r
+       \r
+       Set objContext = New VMContext\r
+       Call objContext.Initialize(strCode)\r
+       \r
+       Call WriteLog("--------------------------------------------------------------------------------")\r
+       Call WriteLog("Step: Initialize")\r
+       Call WriteLog("")\r
+       Call WriteLog("Register:")\r
+       Call WriteLog(objContext.ToStringRegister())\r
+       Call WriteLog("")\r
+       Call WriteLog("Memory:")\r
+       Call WriteLog(objContext.ToStringMemory())\r
+       \r
+       intCount = 1\r
+       \r
+       Do While objContext.IsRunning\r
+               Call objContext.Execute()\r
+               \r
+               Call WriteLog("--------------------------------------------------------------------------------")\r
+               Call WriteLog("Step: " & intCount)\r
+               Call WriteLog("")\r
+               Call WriteLog("Register:")\r
+               Call WriteLog(objContext.ToStringRegister())\r
+               Call WriteLog("")\r
+               Call WriteLog("Memory:")\r
+               Call WriteLog(objContext.ToStringMemory())\r
+               \r
+               intCount = intCount + 1\r
+       Loop\r
+       \r
+       Call WriteLog("--------------------------------------------------------------------------------")\r
+       Call WriteLog("ExitCode: " & objContext.ExitCode)\r
+       \r
+       Call ClearStackTrace()\r
+End Sub\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \8e\9a\8bå\89ð\90Í\81A\8d\\95\89ð\90Í\81A\83R\81[\83h\90\90¬\r
+' ********************************************************************************\r
+\r
+' ***** \83R\83\93\83e\83L\83X\83g *****\r
+\r
+Class CompileVariableItem\r
+       ' \95Ï\90\94\96¼\81B\r
+       Public VariableName\r
+       \r
+       ' \83u\83\8d\83b\83N\81E\83X\83R\81[\83v\94Ô\8d\86\81B1\82©\82ç\8en\82Ü\82é\81B\r
+       Public BlockScopeNumber\r
+       \r
+       ' \8aÖ\90\94\83X\83R\81[\83v\81B"Global"\82Ü\82½\82Í"Local"\81B\r
+       Public FunctionScope\r
+       \r
+       ' \83\81\83\82\83\8a\94Ô\8d\86\81B1\82©\82ç\8en\82Ü\82é\81B\r
+       Public MemoryNumber\r
+End Class\r
+\r
+Class CompileCommandLineItem\r
+       ' \83R\83}\83\93\83h\8ds\81B\95\8e\9a\97ñ\81B\r
+       Public CommandLine\r
+       \r
+       ' \8ds\94Ô\8d\86\81B2\83p\83X\96Ú\82Å\90Ý\92è\82³\82ê\82é\81B\r
+       Public LineNumber\r
+End Class\r
+\r
+Class CompileFunctionItem\r
+       ' \8aÖ\90\94\96¼\81B\r
+       Public FunctionName\r
+       \r
+       ' \88ø\90\94\82Ì\90\94\81B\r
+       Public ArgumentCount\r
+       \r
+       ' \83\89\83x\83\8b\94Ô\8d\86\81B\r
+       Public LabelNumber\r
+End Class\r
+\r
+Class CompileContext\r
+       ' \83O\83\8d\81[\83o\83\8b\95Ï\90\94\8fî\95ñ\81Bkey=\95Ï\90\94\96¼\81Avalue=CompileVariableItem\83C\83\93\83X\83^\83\93\83X\81B\r
+       Private pdicGlobalVariable\r
+       \r
+       ' \83\8d\81[\83J\83\8b\95Ï\90\94\8fî\95ñ\81Bkey=\95Ï\90\94\96¼\81Avalue=CompileVariableItem\83C\83\93\83X\83^\83\93\83X\81B\83O\83\8d\81[\83o\83\8b\95\94\82Ì\8f\88\97\9d\92\86\82ÍNothing\81B\r
+       Private pdicLocalVariable\r
+       \r
+       ' \8aÖ\90\94\8fî\95ñ\81Bkey=\8aÖ\90\94\96¼ & "," & \88ø\90\94\82Ì\90\94\81Avalue=CompileFunctionItem\83C\83\93\83X\83^\83\93\83X\81B\r
+       Private pdicFunction\r
+       \r
+       ' \83R\83}\83\93\83h\8ds\83R\83\8c\83N\83V\83\87\83\93\81BCompileCommandLineItem\83C\83\93\83X\83^\83\93\83X\82ª\8ai\94[\82³\82ê\82é\81B\r
+       Private pcolCommandLine\r
+       \r
+       ' \83O\83\8d\81[\83o\83\8b\95\94\82Ì\83u\83\8d\83b\83N\81E\83X\83R\81[\83v\94Ô\8d\86\81B1\82©\82ç\8en\82Ü\82è\81A\83u\83\8d\83b\83N\82É\93ü\82é\82²\82Æ\82É+1\81A\94²\82¯\82é\82²\82Æ\82É-1\81B\r
+       Private pintGlobalBlockScopeNumber\r
+       \r
+       ' \8aÖ\90\94\93à\82Ì\83u\83\8d\83b\83N\81E\83X\83R\81[\83v\94Ô\8d\86\81B1\82©\82ç\8en\82Ü\82è\81A\83u\83\8d\83b\83N\82É\93ü\82é\82²\82Æ\82É+1\81A\94²\82¯\82é\82²\82Æ\82É-1\81B\r
+       Private pintLocalBlockScopeNumber\r
+       \r
+       ' \83O\83\8d\81[\83o\83\8b\95\94\82Ì\83\8b\81[\83v\82Ì\8fI\92[\82ð\82³\82·\83\89\83x\83\8b\94Ô\8d\86\82Ì\83R\83\8c\83N\83V\83\87\83\93\81B\83\8b\81[\83v\82É\93ü\82é\82²\82Æ\82É\83\89\83x\83\8b\82ð\92Ç\89Á\81A\94²\82¯\82é\82²\82Æ\82É\83\89\83x\83\8b\82ð\8dí\8f\9c\81B\82Â\82Ü\82è\81A\8dÅ\8cã\82Ì\97v\91f\82Ì\83\89\83x\83\8b\82ª\81A\8c»\8dÝ\8f\88\97\9d\92\86\82Ì\83\8b\81[\83v\82Ì\8fI\92[\83\89\83x\83\8b\81B\r
+       Private pcolGlobalLoopLabelNumber\r
+       \r
+       ' \8aÖ\90\94\93à\82Ì\83\8b\81[\83v\82Ì\8fI\92[\82ð\82³\82·\83\89\83x\83\8b\94Ô\8d\86\82Ì\83R\83\8c\83N\83V\83\87\83\93\81B\83\8b\81[\83v\82É\93ü\82é\82²\82Æ\82É\83\89\83x\83\8b\82ð\92Ç\89Á\81A\94²\82¯\82é\82²\82Æ\82É\83\89\83x\83\8b\82ð\8dí\8f\9c\81B\82Â\82Ü\82è\81A\8dÅ\8cã\82Ì\97v\91f\82Ì\83\89\83x\83\8b\82ª\81A\8c»\8dÝ\8f\88\97\9d\92\86\82Ì\83\8b\81[\83v\82Ì\8fI\92[\83\89\83x\83\8b\81B\83O\83\8d\81[\83o\83\8b\95\94\82Ì\8f\88\97\9d\92\86\82ÍNothing\81B\r
+       Private pcolLocalLoopLabelNumber\r
+       \r
+       ' \83\89\83x\83\8b\94Ô\8d\86\81B1\82©\82ç\8en\82Ü\82é\81B\90V\82µ\82¢\83\89\83x\83\8b\94Ô\8d\86\82ª\97v\8b\81\82³\82ê\82é\82Æ\81A\82±\82Ì\94Ô\8d\86\82ð\96ß\82µ\81A\82±\82Ì\94Ô\8d\86\82ð+1\82·\82é\81B\r
+       Private pintLabelNumber\r
+       \r
+       Private Sub Class_Initialize()\r
+       Call StartFunction("CompileContext.Class_Initialize")\r
+               Set pdicGlobalVariable = CreateObject("Scripting.Dictionary")\r
+               Set pdicLocalVariable = Nothing\r
+               Set pdicFunction = CreateObject("Scripting.Dictionary")\r
+               Set pcolCommandLine = New Collection\r
+               pintGlobalBlockScopeNumber = 1\r
+               pintLocalBlockScopeNumber = 1\r
+               Set pcolGlobalLoopLabelNumber = New Collection\r
+               Set pcolLocalLoopLabelNumber = Nothing\r
+               pintLabelNumber = 1\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Property Get FunctionScope()\r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       FunctionScope = "Local"\r
+               Else\r
+                       FunctionScope = "Global"\r
+               End If\r
+       End Property\r
+       \r
+       Public Sub DeclareVariable(strVariableName)\r
+       Call StartFunction("CompileContext.DeclareVariable")\r
+               Dim objVariableItem\r
+               \r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       If pdicLocalVariable.Exists(strVariableName) Then\r
+                               Call Err.Raise(1, "CompileContext", "\95Ï\90\94\81u" & strVariableName & "\81v\82Í\81A\8aù\82É\83\8d\81[\83J\83\8b\95Ï\90\94\82Å\90é\8c¾\82³\82ê\82Ä\82¢\82Ü\82·\81B")\r
+                       End If\r
+                       \r
+                       Set objVariableItem = New CompileVariableItem\r
+                       objVariableItem.VariableName = strVariableName\r
+                       objVariableItem.BlockScopeNumber = pintLocalBlockScopeNumber\r
+                       objVariableItem.FunctionScope = "Local"\r
+                       objVariableItem.MemoryNumber = pdicLocalVariable.Count + 1\r
+                       \r
+                       Call pdicLocalVariable.Add(strVariableName, objVariableItem)\r
+               Else\r
+                       If pdicGlobalVariable.Exists(strVariableName) Then\r
+                               Call Err.Raise(1, "CompileContext", "\95Ï\90\94\81u" & strVariableName & "\81v\82Í\81A\8aù\82É\83O\83\8d\81[\83o\83\8b\95Ï\90\94\82Å\90é\8c¾\82³\82ê\82Ä\82¢\82Ü\82·\81B")\r
+                       End If\r
+                       \r
+                       Set objVariableItem = New CompileVariableItem\r
+                       objVariableItem.VariableName = strVariableName\r
+                       objVariableItem.BlockScopeNumber = pintGlobalBlockScopeNumber\r
+                       objVariableItem.FunctionScope = "Global"\r
+                       objVariableItem.MemoryNumber = pdicGlobalVariable.Count + 1\r
+                       \r
+                       Call pdicGlobalVariable.Add(strVariableName, objVariableItem)\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function IsDeclaredVariable(strVariableName)\r
+       Call StartFunction("CompileContext.IsDeclaredVariable")\r
+               IsDeclaredVariable = False\r
+               \r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       If pdicLocalVariable.Exists(strVariableName) Then\r
+                               IsDeclaredVariable = True\r
+                       End If\r
+               End If\r
+               \r
+               If Not IsDeclaredVariable And pdicGlobalVariable.Exists(strVariableName) Then\r
+                       IsDeclaredVariable = True\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function GetVariable(strVariableName)\r
+       Call StartFunction("CompileContext.GetVariable")\r
+               Set GetVariable = Nothing\r
+               \r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       If pdicLocalVariable.Exists(strVariableName) Then\r
+                               Set GetVariable = pdicLocalVariable(strVariableName)\r
+                       End If\r
+               End If\r
+               \r
+               If GetVariable Is Nothing And pdicGlobalVariable.Exists(strVariableName) Then\r
+                       Set GetVariable = pdicGlobalVariable(strVariableName)\r
+               End If\r
+               \r
+               If GetVariable Is Nothing Then\r
+                       Call Err.Raise(1, "CompileContext", "\95Ï\90\94\81u" & strVariable & "\81v\82Í\90é\8c¾\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Sub DefineFunction(strFunctionName, intArgumentCount)\r
+       Call StartFunction("CompileContext.DefineFunction")\r
+               If Me.IsDefinedFunction(strFunctionName, intArgumentCount) Then\r
+                       Call Err.Raise(1, "CompileContext", "\8aÖ\90\94\81u" & strFunctionName & "(\88ø\90\94\82Ì\90\94=" & intArgumentCount & ")\81v\82Í\8aù\82É\92è\8b`\82³\82ê\82Ä\82¢\82Ü\82·\81B")\r
+               End If\r
+               \r
+               Call pdicFunction.Add(strFunctionName & "," & intArgumentCount, Empty)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function IsDefinedFunction(strFunctionName, intArgumentCount)\r
+       Call StartFunction("CompileContext.IsDefinedFunction")\r
+               IsDefinedFunction = pdicFunction.Exists(strFunctionName & "," & intArgumentCount)\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Sub EntryFunction()\r
+       Call StartFunction("CompileContext.EntryFunction")\r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       Call Err.Raise(1, "CompileContext", "\8aù\82É\8aÖ\90\94\82É\93ü\82Á\82Ä\82¢\82Ü\82·\81B")\r
+               End If\r
+               \r
+               Set pdicLocalVariable = CreateObject("Scripting.Dictionary")\r
+               pintLocalVariableBlockScope = 0\r
+               \r
+               Set pcolLocalLoopLabelNumber = New Collection\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub ExitFunction()\r
+       Call StartFunction("CompileContext.ExitFunction")\r
+               If pdicLocalVariable Is Nothing Then\r
+                       Call Err.Raise(1, "CompileContext", "\82Ü\82¾\8aÖ\90\94\82É\93ü\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+               End If\r
+               \r
+               Set pdicLocalVariable = Nothing\r
+               \r
+               Set pcolLocalLoopLabelNumber = Nothing\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub EntryBlock()\r
+       Call StartFunction("CompileContext.EntryBlock")\r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       pintLocalVariableBlockScope = pintLocalVariableBlockScope + 1\r
+               Else\r
+                       pintGlobalVariableBlockScope = pintGlobalVariableBlockScope + 1\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub ExitBlock()\r
+       Call StartFunction("CompileContext.ExitBlock")\r
+               If Not pdicLocalVariable Is Nothing Then\r
+                       If pintLocalVariableBlockScope = 0 Then\r
+                               Call Err.Raise(1, "CompileContext", "\82±\82ê\88È\8fã\81A\83\8d\81[\83J\83\8b\95Ï\90\94\83u\83\8d\83b\83N\81E\83X\83R\81[\83v\82ð\89º\82°\82ç\82ê\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       pintLocalVariableBlockScope = pintLocalVariableBlockScope - 1\r
+               Else\r
+                       If pintGlobalVariableBlockScope = 0 Then\r
+                               Call Err.Raise(1, "CompileContext", "\82±\82ê\88È\8fã\81A\83O\83\8d\81[\83o\83\8b\95Ï\90\94\83u\83\8d\83b\83N\81E\83X\83R\81[\83v\82ð\89º\82°\82ç\82ê\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       pintGlobalVariableBlockScope = pintGlobalVariableBlockScope - 1\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub EntryLoop()\r
+       Call StartFunction("CompileContext.EntryLoop")\r
+               If Not pcolLocalLoopLabelNumber Is Nothing Then\r
+                       Call pcolLocalLoopLabelNumber.Add(Me.NewLabelNumber)\r
+               Else\r
+                       Call pcolGlobalLoopLabelNumber.Add(Me.NewLabelNumber)\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub ExitLoop()\r
+       Call StartFunction("CompileContext.ExitLoop")\r
+               If Not pcolLocalLoopLabelNumber Is Nothing Then\r
+                       If pcolLocalLoopLabelNumber.Count = 0 Then\r
+                               Call Err.Raise(1, "CompileContext", "\82Ü\82¾\83\8b\81[\83v\82É\93ü\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       Call pcolLocalLoopLabelNumber.RemoveLast()\r
+               Else\r
+                       If pcolGlobalLoopLabelNumber.Count = 0 Then\r
+                               Call Err.Raise(1, "CompileContext", "\82Ü\82¾\83\8b\81[\83v\82É\93ü\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       Call pcolGlobalLoopLabelNumber.RemoveLast()\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Private Sub AddCommandLine(strCommandLine)\r
+       Call StartFunction("CompileContext.AddCommandLine")\r
+               Dim objCommandLineItem\r
+               \r
+               Set objCommandLineItem = New CompileCommandLineItem\r
+               objCommandLineItem.CommandLine = strCommandLine\r
+               objCommandLineItem.LineNumber = 0\r
+               \r
+               Call pcolCommandLine.Add(objCommandLineItem)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLinePushValue(strType, strValue)\r
+       Call StartFunction("CompileContext.AddCommandLinePushValue")\r
+               If strType <> "number" _\r
+                       And strType <> "string" _\r
+                       And strType <> "bool" _\r
+                       And strType <> "null" Then\r
+                       \r
+                       Call Err.Raise(1, "CompileContext", "\92l\82Ì\8eí\97Þ\82ª\81unumber\81v\81ustring\81v\81ubool\81v\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strType & "]")\r
+               End If\r
+               \r
+               If strType = "number" And Not IsNumberToken(strValue) Then\r
+                       Call Err.Raise(1, "CompileContext", "number\8c^\82Ì\92l\82ª\90\94\92l\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strValue & "]")\r
+               ElseIf strType = "bool" And strValue <> "true" And strValue <> "false" Then\r
+                       Call Err.Raise(1, "CompileContext", "bool\8c^\82Ì\92l\82ª\90^\97\9d\92l\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strValue & "]")\r
+               ElseIf strType = "null" And strValue <> "" Then\r
+                       Call Err.Raise(1, "CompileContext", "null\8c^\82Ì\92l\82ª\8bó\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strValue & "]")\r
+               End If\r
+               \r
+               Call AddCommandLine("push value," & strType & "|" & strValue)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLinePushGlobalVariable(strAddress)\r
+       Call StartFunction("CompileContext.AddCommandLinePushGlobalVariable")\r
+               If Not IsIntegerToken(strAddress) Then\r
+                       Call Err.Raise(1, "CompileContext", "\83A\83h\83\8c\83X\94Ô\8d\86\82ª\90®\90\94\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strAddress & "]")\r
+               End If\r
+               \r
+               Call AddCommandLine("push global variable," & strAddress)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLinePushLocalVariable(strAddress)\r
+       Call StartFunction("CompileContext.AddCommandLinePushLocalVariable")\r
+               If Not IsIntegerToken(strAddress) Then\r
+                       Call Err.Raise(1, "CompileContext", "\83A\83h\83\8c\83X\94Ô\8d\86\82ª\90®\90\94\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strAddress & "]")\r
+               End If\r
+               \r
+               Call AddCommandLine("push local variable," & strAddress)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLinePop()\r
+       Call StartFunction("CompileContext.AddCommandLinePop")\r
+               Call AddCommandLine("pop")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLinePopGlobalVariable(strAddress)\r
+       Call StartFunction("CompileContext.AddCommandLinePopGlobalVariable")\r
+               If Not IsIntegerToken(strAddress) Then\r
+                       Call Err.Raise(1, "CompileContext", "\83A\83h\83\8c\83X\94Ô\8d\86\82ª\90®\90\94\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strAddress & "]")\r
+               End If\r
+               \r
+               Call AddCommandLine("pop global variable," & strAddress)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLinePopLocalVariable(strAddress)\r
+       Call StartFunction("CompileContext.AddCommandLinePopLocalVariable")\r
+               If Not IsIntegerToken(strAddress) Then\r
+                       Call Err.Raise(1, "CompileContext", "\83A\83h\83\8c\83X\94Ô\8d\86\82ª\90®\90\94\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strAddress & "]")\r
+               End If\r
+               \r
+               Call AddCommandLine("pop local variable," & strAddress)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineCallNativeFunction(strFunctionName, strArgumentCount)\r
+       Call StartFunction("CompileContext.AddCommandLineCallNativeFunction")\r
+               If Not IsIdentifierToken(strFunctionName) Then\r
+                       Call Err.Raise(1, "CompileContext", "\8aÖ\90\94\96¼\82ª\8e¯\95Ê\8eq\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strFunctionName & "]")\r
+               End If\r
+               \r
+               Call AddCommandLine("call native function," & strFunctionName & "," & strArgumentCount)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineReturn()\r
+       Call StartFunction("CompileContext.AddCommandLineReturn")\r
+               Call AddCommandLine("return")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineExit()\r
+       Call StartFunction("CompileContext.AddCommandLineExit")\r
+               Call AddCommandLine("exit")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineAdd()\r
+       Call StartFunction("CompileContext.AddCommandLineAdd")\r
+               Call AddCommandLine("add")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineSubtract()\r
+       Call StartFunction("CompileContext.AddCommandLineSubtract")\r
+               Call AddCommandLine("subtract")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineMultiple()\r
+       Call StartFunction("CompileContext.AddCommandLineMultiple")\r
+               Call AddCommandLine("multiple")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineDivide()\r
+       Call StartFunction("CompileContext.AddCommandLineDivide")\r
+               Call AddCommandLine("divide")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineGreaterThan()\r
+       Call StartFunction("CompileContext.AddCommandLineGreaterThan")\r
+               Call AddCommandLine("greater than")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineLessThan()\r
+       Call StartFunction("CompileContext.AddCommandLineLessThan")\r
+               Call AddCommandLine("less than")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineEqual()\r
+       Call StartFunction("CompileContext.AddCommandLineEqual")\r
+               Call AddCommandLine("equal")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineAnd()\r
+       Call StartFunction("CompileContext.AddCommandLineAnd")\r
+               Call AddCommandLine("and")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineOr()\r
+       Call StartFunction("CompileContext.AddCommandLineOr")\r
+               Call AddCommandLine("or")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub AddCommandLineNot()\r
+       Call StartFunction("CompileContext.AddCommandLineNot")\r
+               Call AddCommandLine("not")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function NewLabelNumber()\r
+       Call StartFunction("CompileContext.NewLabelNumber")\r
+               NewLabelNumber = pintLabelNumber\r
+               \r
+               pintLabelNumber = pintLabelNumber + 1\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function GetLastLoopLabelNumber()\r
+       Call StartFunction("CompileContext.GetLastLoopLabelNumber")\r
+               If Not pcolLocalLoopLabelNumber Is Nothing Then\r
+                       If pcolLocalLoopLabelNumber.Count = 0 Then\r
+                               Call Err.Raise(1, "CompileContext", "\82Ü\82¾\83\8b\81[\83v\82É\93ü\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       GetLastLoopLabelNumber = pcolLocalLoopLabelNumber.Item(pcolLocalLoopLabelNumber.Count)\r
+               Else\r
+                       If pcolGlobalLoopLabelNumber.Count = 0 Then\r
+                               Call Err.Raise(1, "CompileContext", "\82Ü\82¾\83\8b\81[\83v\82É\93ü\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       GetLastLoopLabelNumber = pcolGlobalLoopLabelNumber.Item(pcolGlobalLoopLabelNumber.Count)\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function GetFunctionLabelNumber(strFunctionName, intArgumentCount)\r
+       Call StartFunction("CompileContext.GetFunctionLabelNumber")\r
+               If Not pdicFunction.Exists(strFunctionName & "," & intArgumentCount) Then\r
+                       Call Err.Raise(1, "CompileContext", "\8aÖ\90\94\81u" & strFunctionName & "(\88ø\90\94\82Ì\90\94=" & intArgumentCount & ")\81v\82Í\81A\92è\8b`\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+               End If\r
+               \r
+               GetFunctionLabelNumber = pdicFunction(strFunctionName & "," & intArgumentCount)\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function GetLastCommandLine()\r
+       Call StartFunction("CompileContext.GetLastCommandLine")\r
+               If pcolCommandLine.Count > 0 Then\r
+                       GetLastCommandLine = pcolCommandLine.Item(pcolCommandLine.Count).CommandLine\r
+               Else\r
+                       GetLastCommandLine = ""\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function ToStringCode()\r
+       Call StartFunction("CompileContext.ToStringCode")\r
+               ToStringCode = ""\r
+               \r
+               Dim objCommandLine\r
+               For Each objCommandLine In pcolCommandLine.Items\r
+                       ToStringCode = ToStringCode & objCommandLine.CommandLine & vbCrLf\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+' ***** \83m\81[\83h *****\r
+\r
+Class NodeBool\r
+       Private pstrValue\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeBool.Parse")\r
+               If objTokenizer.CurrentToken = "true" Or objTokenizer.CurrentToken = "false" Then\r
+                       pstrValue = objTokenizer.CurrentToken\r
+               Else\r
+                       Call Err.Raise(1, "NodeBool.vbs", "\83L\81[\83\8f\81[\83h\81utrue\81v\82Ü\82½\82Í\81ufalse\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & objTokenizer.CurrentToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeBool.Compile")\r
+               Call objContext.AddCommandLinePushValue("bool", pstrValue)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeBool.ToString")\r
+               ToString = "bool: " & pstrValue & vbCrLf\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeBreakStatement\r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeBreakStatement.Parse")\r
+               If objTokenizer.CurrentToken <> "break" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81ubreak\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & objTokenizer.CurrentToken & ")")\r
+               End If\r
+               \r
+               If objTokenizer.MoveNextToken <> ";" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u;\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & objTokenizer.CurrentToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeBreakStatement.Compile")\r
+               Call objContext.AddCommandLine("goto," & objContext.GetLastLoopLabelNumber())\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeBreakStatement.ToString")\r
+               ToString = "break:"\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeCallFunction\r
+       Private pstrFunctionName\r
+       Private pcolNodExpression\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeCallFunction.Parse")\r
+               Dim strToken\r
+               Dim nodExpression\r
+               \r
+               pstrFunctionName = objTokenizer.CurrentToken\r
+               If Not IsIdentifierToken(pstrFunctionName) Then\r
+                       Call Err.Raise(1, "NodeCallFunction", "\8aÖ\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & pstrFunctionName & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "(" Then\r
+                       Call Err.Raise(1, "NodeCallFunction", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pcolNodExpression = New Collection\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken = ")" Then\r
+                               Exit Do\r
+                       End If\r
+                       \r
+                       If pcolNodExpression.Count > 0 Then\r
+                               If strToken <> "," Then\r
+                                       Call Err.Raise(1, "NodeCallFunction", "\83L\81[\83\8f\81[\83h\81u,\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                               End If\r
+                       End If\r
+                       \r
+                       Set nodExpression = New NodeExpression\r
+                       Call nodExpression.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNodExpression.Add(nodExpression)\r
+               Loop\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeCallFunction.Compile")\r
+               If Not objContext.IsDefinedFunction(pstrFunctionName, pcolNodExpression.Count) Then\r
+                       Call Err.Raise(1, "NodeCallFunction", "\8aÖ\90\94\81u" & pstrFunctionName & "(\88ø\90\94\82Ì\90\94=" & pcolNodExpression.Count & ")\81v\82Í\92è\8b`\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+               End If\r
+               \r
+               Dim nodExpression\r
+               \r
+               For Each nodExpression In pcolNodExpression.Items\r
+                       Call nodExpression.Compile(objContext)\r
+               Next\r
+               \r
+               Call objContext.AddCommandLine("call function," & pstrFunctionName & "," & pcolNodExpression.Count)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeCallFunction.ToString")\r
+               ToString = "call function: " & vbCrLf _\r
+                       & " name: " & pstrFunctionName & vbCrLf\r
+               \r
+               Dim nodExpression\r
+               For Each nodExpression In pcolNodExpression.Items\r
+                       ToString = ToString & " arg:" & vbCrLf _\r
+                               & StringAddIndent(StringAddIndent(nodExpression.ToString()))\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeCallNativeFunction\r
+       Private pstrFunctionName\r
+       Private pcolNodExpression\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeCallNativeFunction.Parse")\r
+               Dim strToken\r
+               Dim nodExpression\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "native" Then\r
+                       Call Err.Raise(1, "NodeCallNativeFunction", "\83L\81[\83\8f\81[\83h\81unative\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               pstrFunctionName = objTokenizer.MoveNextToken\r
+               If Not IsIdentifierToken(pstrFunctionName) Then\r
+                       Call Err.Raise(1, "NodeCallNativeFunction", "\8aÖ\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & pstrFunctionName & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "(" Then\r
+                       Call Err.Raise(1, "NodeCallNativeFunction", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pcolNodExpression = New Collection\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken = ")" Then\r
+                               Exit Do\r
+                       End If\r
+                       \r
+                       If pcolNodExpression.Count > 0 Then\r
+                               If strToken <> "," Then\r
+                                       Call Err.Raise(1, "NodeCallNativeFunction", "\83L\81[\83\8f\81[\83h\81u,\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                               End If\r
+                       End If\r
+                       \r
+                       Set nodExpression = New NodeExpression\r
+                       Call nodExpression.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNodExpression.Add(nodExpression)\r
+               Loop\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeCallNativeFunction.Compile")\r
+               Dim nodExpression\r
+               For Each nodExpression In pcolNodExpression.Items\r
+                       Call nodExpression.Compile(objContext)\r
+               Next\r
+               \r
+               Call objContext.AddCommandLineCallNativeFunction(pstrFunctionName, pcolNodExpression.Count)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeCallNativeFunction.ToString")\r
+               ToString = "call native function: " & vbCrLf _\r
+                       & " name: " & pstrFunctionName & vbCrLf\r
+               \r
+               Dim nodExpression\r
+               For Each nodExpression In pcolNodExpression.Items\r
+                       ToString = ToString & " arg:" & vbCrLf _\r
+                               & StringAddIndent(StringAddIndent(nodExpression.ToString()))\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeDeclareVariable\r
+       Private pdicVariable\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeDeclareVariable.Parse")\r
+               Dim strToken\r
+               Dim strVariableName\r
+               Dim nodInitExpression\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "var" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81uvar\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Set pdicVariable = CreateObject("Scripting.Dictionary")\r
+               \r
+               Do While True\r
+                       strVariableName = objTokenizer.MoveNextToken\r
+                       If Not IsIdentifierToken(strVariableName) Then\r
+                               Call Err.Raise(1, "Runtime.vbs", "\95Ï\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strVariableName & ")")\r
+                       End If\r
+                       \r
+                       strToken = objTokenizer.MoveNextToken\r
+                       If strToken = "=" Then\r
+                               Call objTokenizer.MoveNextToken\r
+                               \r
+                               Set nodInitExpression = New NodeExpression\r
+                               Call nodInitExpression.Parse(objTokenizer)\r
+                               \r
+                               Call pdicVariable.Add(strVariableName, nodInitExpression)\r
+                               \r
+                               strToken = objTokenizer.CurrentToken\r
+                       Else\r
+                               Call pdicVariable.Add(strVariableName, Nothing)\r
+                       End If\r
+                       If strToken = ";" Then\r
+                               Exit Do\r
+                       End If\r
+                       If strToken <> "," Then\r
+                               Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u,\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+               Loop\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeDeclareVariable.Compile")\r
+               Dim strVariableName\r
+               Dim nodInitExpression\r
+               Dim objVariable\r
+               \r
+               For Each strVariableName In pdicVariable.Keys\r
+                       Set nodInitExpression = pdicVariable(strVariableName)\r
+                       \r
+                       If Not nodInitExpression Is Nothing Then\r
+                               Call nodInitExpression.Compile(objContext)\r
+                               \r
+                               Call objContext.DeclareVariable(strVariableName)\r
+                               \r
+                               Set objVariable = objContext.GetVariable(strVariableName)\r
+                               \r
+                               If objVariable.FunctionScope = "Global" Then\r
+                                       Call objContext.AddCommandLinePopGlobalVariable(objVariable.MemoryNumber)\r
+                               Else\r
+                                       Call objContext.AddCommandLinePopLocalVariable(objVariable.MemoryNumber)\r
+                               End If\r
+                       Else\r
+                               Call objContext.DeclareVariable(strVariableName)\r
+                       End If\r
+               Next\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeDeclareVariable.ToString")\r
+               Dim strText\r
+               strText = "declare variable:" & vbCrLf\r
+               \r
+               Dim strVariableName\r
+               For Each strVariableName In pdicVariable.Keys\r
+                       strText = strText & " name: " & strVariableName & vbCrLf\r
+                       \r
+                       If Not pdicVariable(strVariableName) Is Nothing Then\r
+                               strText = strText & StringAddIndent(StringAddIndent(pdicVariable(strVariableName).ToString()))\r
+                       End If\r
+               Next\r
+               \r
+               ToString = strText\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeExpression\r
+       Private pnodExpression\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeExpression.Parse")\r
+               Set pnodExpression = New NodeExpressionAssign\r
+               Call pnodExpression.Parse(objTokenizer)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeExpression.Compile")\r
+               Call pnodExpression.Compile(objContext)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeExpression.ToString")\r
+               ToString = pnodExpression.ToString()\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeExpressionAdd\r
+       Private pstrFugou\r
+       Private pnodOperand1\r
+       Private pstrOperator\r
+       Private pnodOperand2\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeExpressionAdd.Parse")\r
+               pstrFugou = objTokenizer.CurrentToken\r
+               If pstrFugou = "+" Or pstrFugou = "-" Then\r
+                       Call objTokenizer.MoveNextToken\r
+               Else\r
+                       pstrFugou = Empty\r
+               End If\r
+               \r
+               Set pnodOperand1 = New NodeExpressionMultiple\r
+               Call pnodOperand1.Parse(objTokenizer)\r
+               \r
+               pstrOperator = objTokenizer.CurrentToken\r
+               If pstrOperator = "+" Or pstrOperator = "-" Then\r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set pnodOperand2 = New NodeExpressionAdd\r
+                       Call pnodOperand2.Parse(objTokenizer)\r
+               Else\r
+                       pstrOperator = Empty\r
+                       Set pnodOperand2 = Nothing\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeExpressionAdd.Compile")\r
+               ' TODO \95\84\8d\86\82ð\83R\83\93\83p\83C\83\8b\82µ\82Ä\82¢\82È\82¢\81B\r
+               Call pnodOperand1.Compile(objContext)\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       Call pnodOperand2.Compile(objContext)\r
+                       \r
+                       If pstrOperator = "+" Then\r
+                               Call objContext.AddCommandLineAdd()\r
+                       Else\r
+                               Call objContext.AddCommandLineSubtract()\r
+                       End If\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeExpressionAdd.ToString")\r
+               ToString = "expression(+, -):" & vbCrLf\r
+               \r
+               If pstrFugou <> Empty Then\r
+                       ToString = ToString & " fugou: " & pstrFugou & vbCrLf\r
+               End If\r
+               \r
+               ToString = ToString & StringAddIndent(pnodOperand1.ToString())\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       ToString = ToString & " operator: " & pstrOperator & vbCrLf _\r
+                               & StringAddIndent(pnodOperand2.ToString())\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeExpressionAssign\r
+       Private pstrVariableName\r
+       Private pstrOperator\r
+       Private pnodExpression\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeExpressionAssign.Parse")\r
+               If objTokenizer.Peek() = "=" Then\r
+                       pstrVariableName = objTokenizer.CurrentToken\r
+                       If Not IsIdentifierToken(pstrVariableName) Then\r
+                               Call Err.Raise(1, "NodeExpressionAssign", "\95Ï\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       pstrOperator = objTokenizer.MoveNextToken\r
+                       \r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set pnodExpression = New NodeExpression\r
+                       Call pnodExpression.Parse(objTokenizer)\r
+               Else\r
+                       pstrVariableName = Empty\r
+                       pstrOperator = Empty\r
+                       \r
+                       Set pnodExpression = New NodeExpressionEqual\r
+                       Call pnodExpression.Parse(objTokenizer)\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeExpressionAssign.Compile")\r
+               Dim objVariable\r
+               \r
+               Call pnodExpression.Compile(objContext)\r
+               \r
+               If pstrVariableName <> Empty Then\r
+                       If Not objContext.IsDeclaredVariable(pstrVariableName) Then\r
+                               Call Err.Raise(1, "NodeExpressionAssign", "\95Ï\90\94\81u" & pstrVariableName & "\81v\82Í\90é\8c¾\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+                       End If\r
+                       \r
+                       Set objVariable = objContext.GetVariable(pstrVariableName)\r
+                       If objVariable.FunctionScope = "Global" Then\r
+                               Call objContext.AddCommandLinePopGlobalVariable(objVariable.MemoryNumber)\r
+                               Call objContext.AddCommandLinePushGlobalVariable(objVariable.MemoryNumber)\r
+                       Else\r
+                               Call objContext.AddCommandLinePopLocalVariable(objVariable.MemoryNumber)\r
+                               Call objContext.AddCommandLinePushLocalVariable(objVariable.MemoryNumber)\r
+                       End If\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeExpressionAssign.ToString")\r
+               ToString = "expression(=):" & vbCrLf\r
+               \r
+               If pstrVariableName <> Empty Then\r
+                       ToString = ToString & " variable: " & pstrVariableName & vbCrLf _\r
+                               & " operator: " & pstrOperator & vbCrLf\r
+               End If\r
+               \r
+               ToString = ToString & StringAddIndent(pnodExpression.ToString())\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeExpressionCompare\r
+       Private pnodOperand1\r
+       Private pstrOperator\r
+       Private pnodOperand2\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeExpressionCompare.Parse")\r
+               Set pnodOperand1 = New NodeExpressionAdd\r
+               Call pnodOperand1.Parse(objTokenizer)\r
+               \r
+               pstrOperator = objTokenizer.CurrentToken\r
+               If pstrOperator = "<" Or pstrOperator = "<=" Or pstrOperator = ">" Or pstrOperator = ">=" Then\r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set pnodOperand2 = New NodeExpressionCompare\r
+                       Call pnodOperand2.Parse(objTokenizer)\r
+               Else\r
+                       pstrOperator = Empty\r
+                       Set pnodOperand2 = Nothing\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeExpressionCompare.Compile")\r
+               Call pnodOperand1.Compile(objContext)\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       Call pnodOperand2.Compile(objContext)\r
+                       \r
+                       If pstrOperator = "<" Then\r
+                               Call objContext.AddCommandLineLessThan()\r
+                       ElseIf pstrOperator = ">" Then\r
+                               Call objContext.AddCommandLineGreaterThan()\r
+                       ElseIf pstrOperator = "<=" Then\r
+                               Call objContext.AddCommandLineLessThan()\r
+                               Call pnodOperand1.Compile(objContext)\r
+                               Call pnodOperand2.Compile(objContext)\r
+                               Call objContext.AddCommandLineEqual()\r
+                               Call objContext.AddCommandLineOr()\r
+                       Else\r
+                               Call objContext.AddCommandLineGreaterThan()\r
+                               Call pnodOperand1.Compile(objContext)\r
+                               Call pnodOperand2.Compile(objContext)\r
+                               Call objContext.AddCommandLineEqual()\r
+                               Call objContext.AddCommandLineOr()\r
+                       End If\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeExpressionCompare.ToString")\r
+               ToString = "expression(<, <=, >, >=):" & vbCrLf _\r
+                       & StringAddIndent(pnodOperand1.ToString())\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       ToString = ToString & " operator: " & pstrOperator & vbCrLf _\r
+                               & StringAddIndent(pnodOperand2.ToString())\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeExpressionEqual\r
+       Private pnodOperand1\r
+       Private pstrOperator\r
+       Private pnodOperand2\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeExpressionEqual.Parse")\r
+               Set pnodOperand1 = New NodeExpressionCompare\r
+               Call pnodOperand1.Parse(objTokenizer)\r
+               \r
+               pstrOperator = objTokenizer.CurrentToken\r
+               If pstrOperator = "==" Or pstrOperator = "!=" Then\r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set pnodOperand2 = New NodeExpressionEqual\r
+                       Call pnodOperand2.Parse(objTokenizer)\r
+               Else\r
+                       pstrOperator = Empty\r
+                       Set pnodOperand2 = Nothing\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeExpressionEqual.Compile")\r
+               Call pnodOperand1.Compile(objContext)\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       Call pnodOperand2.Compile(objContext)\r
+                       \r
+                       If pstrOperator = "==" Then\r
+                               Call objContext.AddCommandLineEqual()\r
+                       Else\r
+                               Call objContext.AddCommandLineEqual()\r
+                               Call objContext.AddCommandLineNot()\r
+                       End If\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeExpressionEqual.ToString")\r
+               ToString = "expression(==, !=):" & vbCrLf _\r
+                       & StringAddIndent(pnodOperand1.ToString())\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       ToString = ToString & " operator: " & pstrOperator & vbCrLf _\r
+                               & StringAddIndent(pnodOperand2.ToString())\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeExpressionMultiple\r
+       Private pnodOperand1\r
+       Private pstrOperator\r
+       Private pnodOperand2\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeExpressionMultiple.Parse")\r
+               Set pnodOperand1 = New NodeOperand\r
+               Call pnodOperand1.Parse(objTokenizer)\r
+               \r
+               pstrOperator = objTokenizer.CurrentToken\r
+               If pstrOperator = "*" Or pstrOperator = "/" Then\r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set pnodOperand2 = New NodeExpressionMultiple\r
+                       Call pnodOperand2.Parse(objTokenizer)\r
+               Else\r
+                       pstrOperator = Empty\r
+                       Set pnodOperand2 = Nothing\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeExpressionMultiple.Compile")\r
+               Call pnodOperand1.Compile(objContext)\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       Call pnodOperand2.Compile(objContext)\r
+                       \r
+                       If pstrOperator = "*" Then\r
+                               Call objContext.AddCommandLineMultiple()\r
+                       Else\r
+                               Call objContext.AddCommandLineDivide()\r
+                       End If\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeExpressionMultiple.ToString")\r
+               ToString = "expression(*, /):" & vbCrLf _\r
+                       & StringAddIndent(pnodOperand1.ToString())\r
+               \r
+               If pstrOperator <> Empty Then\r
+                       ToString = ToString & " operator: " & pstrOperator & vbCrLf _\r
+                               & StringAddIndent(pnodOperand2.ToString())\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeForEachStatement\r
+       Private pstrVariableName\r
+       Private pnodExpression\r
+       Private pnodLoopStatementBlock\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeForEachStatement.Parse")\r
+               Dim strToken\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "foreach" Then\r
+                       Call Err.Raise(1, "NodeForEachStatement", "\83L\81[\83\8f\81[\83h\81uforeach\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "(" Then\r
+                       Call Err.Raise(1, "NodeForEachStatement", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               pstrVariableName = objTokenizer.MoveNextToken\r
+               If Not IsIdentifierToken(pstrVariableName) Then\r
+                       Call Err.Raise(1, "NodeForEachStatement", "\95Ï\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & pstrVariableName & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "in" Then\r
+                       Call Err.Raise(1, "NodeForEachStatement", "\83L\81[\83\8f\81[\83h\81uin\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pnodExpression = New NodeExpression\r
+               Call pnodExpression.Parse(objTokenizer)\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> ")" Then\r
+                       Call Err.Raise(1, "NodeForEachStatement", "\83L\81[\83\8f\81[\83h\81u)\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pnodLoopStatementBlock = New NodeLoopStatementBlock\r
+               Call pnodLoopStatementBlock.Parse(objTokenizer)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeForEachStatement.Compile")\r
+               ' TODO \96¢\8eÀ\91\95\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeForEachStatement.ToString")\r
+               ToString = "foreach:" & vbCrLf _\r
+                       & " variable: " & pstrVariableName & vbCrLf _\r
+                       & StringAddIndent(pnodExpression.ToString()) _\r
+                       & StringAddIndent(pnodLoopStatementBlock.ToString())\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeForStatement\r
+       Private pnodInitExpression\r
+       Private pnodIfExpression\r
+       Private pnodIterateExpression\r
+       Private pnodLoopStatementBlock\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeForStatement.Parse")\r
+               Dim strToken\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "for" Then\r
+                       Call Err.Raise(1, "NodeForStatement.vbs", "\83L\81[\83\8f\81[\83h\81ufor\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "(" Then\r
+                       Call Err.Raise(1, "NodeForStatement.vbs", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> ";" Then\r
+                       Set pnodInitExpression = New NodeExpression\r
+                       Call pnodInitExpression.Parse(objTokenizer)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> ";" Then\r
+                               Call Err.Raise(1, "NodeForStatement.vbs", "\83L\81[\83\8f\81[\83h\81u;\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+               Else\r
+                       Set pnodInitExpression = Nothing\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> ";" Then\r
+                       Set pnodIfExpression = New NodeExpression\r
+                       Call pnodIfExpression.Parse(objTokenizer)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> ";" Then\r
+                               Call Err.Raise(1, "NodeForStatement.vbs", "\83L\81[\83\8f\81[\83h\81u;\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+               Else\r
+                       Set pnodIfExpression = Nothing\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> ")" Then\r
+                       Set pnodIterateExpression = New NodeExpression\r
+                       Call pnodIterateExpression.Parse(objTokenizer)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> ")" Then\r
+                               Call Err.Raise(1, "NodeForStatement.vbs", "\83L\81[\83\8f\81[\83h\81u)\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+               Else\r
+                       Set pnodIterateExpression = Nothing\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pnodLoopStatementBlock = New NodeLoopStatementBlock\r
+               Call pnodLoopStatementBlock.Parse(objTokenizer)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeForStatement.Compile")\r
+               ' TODO \96¢\8eÀ\91\95\81B\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeForStatement.ToString")\r
+               ToString = "for:" & vbCrLf\r
+               \r
+               If Not pnodInitExpression Is Nothing Then\r
+                       ToString = ToString & " init expr:" & vbCrLf _\r
+                               & StringAddIndent(StringAddIndent(pnodInitExpression.ToString()))\r
+               End If\r
+               \r
+               If Not pnodIfExpression Is Nothing Then\r
+                       ToString = ToString & " if expr:" & vbCrLf _\r
+                               & StringAddIndent(StringAddIndent(pnodIfExpression.ToString()))\r
+               End If\r
+               \r
+               If Not pnodIterateExpression Is Nothing Then\r
+                       ToString = ToString & " iterate expr:" & vbCrLf _\r
+                               & StringAddIndent(StringAddIndent(pnodIterateExpression.ToString()))\r
+               End If\r
+               \r
+               ToString = ToString & StringAddIndent(pnodLoopStatementBlock.ToString())\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeFunction\r
+       Private pstrFunctionName\r
+       Private pcolStrArgument\r
+       Private pnodStatementBlock\r
+       \r
+       Public Property Get FunctionName()\r
+               FunctionName = pstrFunctionName\r
+       End Property\r
+       \r
+       Public Property Get Arguments()\r
+               Set Arguments = pcolStrArgument\r
+       End Property\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeFunction.Parse")\r
+               Dim strToken\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "function" Then\r
+                       Call Err.Raise(1, "NodeFunction", "\83L\81[\83\8f\81[\83h\81ufunction\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               pstrFunctionName = objTokenizer.MoveNextToken\r
+               If Not IsIdentifierToken(pstrFunctionName) Then\r
+                       Call Err.Raise(1, "NodeFunction", "\8aÖ\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & pstrFunctionName & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "(" Then\r
+                       Call Err.Raise(1, "NodeFunction", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Set pcolStrArgument = New Collection\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.MoveNextToken\r
+                       If strToken = ")" Then\r
+                               Exit Do\r
+                       End If\r
+                       \r
+                       If pcolStrArgument.Count > 0 Then\r
+                               If strToken <> "," Then\r
+                                       Call Err.Raise(1, "NodeFunction", "\83L\81[\83\8f\81[\83h\81u,\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                               End If\r
+                               \r
+                               strToken = objTokenizer.MoveNextToken\r
+                       End If\r
+                       \r
+                       If Not IsIdentifierToken(strToken) Then\r
+                               Call Err.Raise(1, "NodeFunction", "\88ø\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+                       \r
+                       Call pcolStrArgument.Add(strToken)\r
+               Loop\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pnodStatementBlock = New NodeStatementBlock\r
+               Call pnodStatementBlock.Parse(objTokenizer)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeFunction.Compile")\r
+               Call objContext.EntryFunction()\r
+               \r
+               Call objContext.AddCommandLine("start function," & pstrFunctionName & "," & pcolStrArgument.Count)\r
+               \r
+               Dim intCount\r
+               For intCount = pcolStrArgument.Count To 1 Step -1\r
+                       Call objContext.AddCommandLine("declare variable," & pcolStrArgument.Item(intCount))\r
+                       Call objContext.DeclareVariable(pcolStrArgument.Item(intCount))\r
+                       \r
+                       Call objContext.AddCommandLine("assign," & pcolStrArgument.Item(intCount))\r
+                       Call objContext.AddCommandLine("pop")\r
+               Next\r
+               \r
+               Call pnodStatementBlock.Compile(objContext)\r
+               \r
+               If objContext.GetLastCommandLine <> "return" Then\r
+                       Call objContext.AddCommandLine("push,null")\r
+                       Call objContext.AddCommandLine("return")\r
+               End If\r
+               \r
+               Call objContext.ExitFunction()\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeFunction.ToString")\r
+               ToString = "function:" & vbCrLf _\r
+                       & " name: " & pstrFunctionName & vbCrLf\r
+               \r
+               Dim strArgument\r
+               For Each strArgument In pcolStrArgument.Items\r
+                       ToString = ToString & " arg: " & strArgument & vbCrLf\r
+               Next\r
+               \r
+               ToString = ToString & StringAddIndent(StringAddIndent(pnodStatementBlock.ToString()))\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeIfStatement\r
+       Private pcolNodIfExpression\r
+       Private pcolNodStatementBlock\r
+       Private pnodElseStatementBlock\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeIfStatement.Parse")\r
+               Dim strToken\r
+               Dim nodExpression\r
+               Dim nodStatementBlock\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "if" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81uif\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Set pcolNodIfExpression = New Collection\r
+               Set pcolNodStatementBlock = New Collection\r
+               Set pnodElseStatementBlock = Nothing\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.MoveNextToken\r
+                       If strToken <> "(" Then\r
+                               Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+                       \r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set nodExpression = New NodeExpression\r
+                       Call nodExpression.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNodIfExpression.Add(nodExpression)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> ")" Then\r
+                               Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u)\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+                       \r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set nodStatementBlock = New NodeStatementBlock\r
+                       Call nodStatementBlock.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNodStatementBlock.Add(nodStatementBlock)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> "else" Then\r
+                               Exit Do\r
+                       End If\r
+                       \r
+                       strToken = objTokenizer.MoveNextToken\r
+                       If strToken <> "if" Then\r
+                               Set pnodElseStatementBlock = New NodeStatementBlock\r
+                               Call pnodElseStatementBlock.Parse(objTokenizer)\r
+                               \r
+                               Exit Do\r
+                       End If\r
+               Loop\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeIfStatement.Compile")\r
+               ' TODO \96¢\8eÀ\91\95\81B\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeIfStatement.ToString")\r
+               ToString = ""\r
+               \r
+               Dim intCount\r
+               For intCount = 1 To pcolNodIfExpression.Count\r
+                       If intCount = 1 Then\r
+                               ToString = "if:" & vbCrLf\r
+                       Else\r
+                               ToString = ToString & "else if:" & vbCrLf\r
+                       End If\r
+                       ToString = ToString & StringAddIndent(pcolNodIfExpression.Item(intCount).ToString()) _\r
+                               & StringAddIndent(pcolNodStatementBlock.Item(intCount).ToString())\r
+               Next\r
+               \r
+               If Not pnodElseStatementBlock Is Nothing Then\r
+                       ToString = ToString & "else:" & vbCrLf _\r
+                               & StringAddIndent(pnodElseStatementBlock.ToString())\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeLoopStatementBlock\r
+       Private pcolNodStatement\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeLoopStatementBlock.Parse")\r
+               Dim strToken\r
+               Dim nodStatement\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "{" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u{\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pcolNodStatement = New Collection\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken = "}" Then\r
+                               Exit Do\r
+                       End If\r
+                       \r
+                       If objTokenizer.CurrentToken = "break" Then\r
+                               Set nodStatement = New NodeBreakStatement\r
+                       Else\r
+                               Set nodStatement = New NodeStatement\r
+                       End If\r
+                       \r
+                       Call nodStatement.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNodStatement.Add(nodStatement)\r
+               Loop\r
+               \r
+               objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeLoopStatementBlock.Compile")\r
+               Dim nodStatement\r
+               For Each nodStatement In pcolNodStatement.Items\r
+                       Call nodStatement.Compile(objContext)\r
+               Next\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeLoopStatementBlock.ToString")\r
+               ToString = "block(loop):" & vbCrLf\r
+               \r
+               Dim nodStatement\r
+               For Each nodStatement In pcolNodStatement.Items\r
+                       ToString = ToString & StringAddIndent(nodStatement.ToString())\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeNull\r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeNull.Parse")\r
+               If objTokenizer.CurrentToken <> "null" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81unull\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & objTokenizer.CurrentToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeNull.Compile")\r
+               Call objContext.AddCommandLinePushValue("null", "")\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeNull.ToString")\r
+               ToString = "null:" & vbCrLf\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeNumber\r
+       Private pstrValue\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeNumber.Parse")\r
+               pstrValue = objTokenizer.CurrentToken\r
+               If Not IsNumberToken(pstrValue) Then\r
+                       Call Err.Raise(1, "NodeNumber", "\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\82ª\90\94\92l\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & pstrValue & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeNumber.Compile")\r
+               Call objContext.AddCommandLinePushValue("number", pstrValue)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeNumber.ToString")\r
+               ToString = "number: " & pstrValue & vbCrLf\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeOperand\r
+       Private pnodNode\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeOperand.Parse")\r
+               Dim strToken\r
+               strToken = objTokenizer.CurrentToken\r
+               \r
+               If IsNumberToken(strToken) Then\r
+                       Set pnodNode = New NodeNumber\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               ElseIf strToken = "true" Or strToken = "false" Then\r
+                       Set pnodNode = New NodeBool\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               ElseIf strToken = "null" Then\r
+                       Set pnodNode = New NodeNull\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               ElseIf strToken = """" Then\r
+                       Set pnodNode = New NodeString\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               ElseIf strToken = "native" Then\r
+                       Set pnodNode = New NodeCallNativeFunction\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               ElseIf strToken = "(" Then\r
+                       Call objTokenizer.MoveNextToken\r
+                       \r
+                       Set pnodNode = New NodeExpression\r
+                       Call pnodNode.Parse(objTokenizer)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> ")" Then\r
+                               Call Err.Raise(1, "NodeOperand", "\83L\81[\83\8f\81[\83h\81u)\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+                       \r
+                       Call objTokenizer.MoveNextToken\r
+               ElseIf objTokenizer.Peek() = "(" Then\r
+                       Set pnodNode = New NodeCallFunction\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               Else\r
+                       Set pnodNode = New NodeVariable\r
+                       Call pnodNode.Parse(objTokenizer)\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeOperand.Compile")\r
+               Call pnodNode.Compile(objContext)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeOperand.ToString")\r
+               ToString = pnodNode.ToString()\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeProgram\r
+       Private pcolNode\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeProgram.Parse")\r
+               Dim strToken\r
+               Dim nodNode\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pcolNode = New Collection\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken = "function" Then\r
+                               Set nodNode = New NodeFunction\r
+                       ElseIf strToken = Empty Then\r
+                               Exit Do\r
+                       Else\r
+                               Set nodNode = New NodeStatement\r
+                       End If\r
+                       \r
+                       Call nodNode.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNode.Add(nodNode)\r
+               Loop\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeProgram.Compile")\r
+               Dim objNode\r
+               \r
+               ' TODO \8aÖ\90\94\82Ì\89ð\8c\88\82ð\8ds\82¤\81B\r
+               ' TODO \83O\83\8d\81[\83o\83\8b\95\94\82ð\83R\83\93\83p\83C\83\8b\82·\82é\81B\r
+               ' TODO \8aÖ\90\94\95\94\82ð\83R\83\93\83p\83C\83\8b\82·\82é\81B\r
+               ' TODO \83\89\83x\83\8b\82ð\89ð\8c\88\82·\82é\81B\r
+               \r
+               ' \83O\83\8d\81[\83o\83\8b\95\94\82ð\83R\83\93\83p\83C\83\8b\82·\82é\81B\r
+               For Each objNode In pcolNode.Items\r
+                       If TypeName(objNode) = "NodeStatement" Then\r
+                               Call objNode.Compile(objContext)\r
+                       End If\r
+               Next\r
+               \r
+               If objContext.GetLastCommandLine <> "exit" Then\r
+                       Call objContext.AddCommandLinePushValue("number", "0")\r
+                       Call objContext.AddCommandLineExit()\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeProgram.ToString")\r
+               ToString = "program:" & vbCrLf\r
+               \r
+               Dim nodNode\r
+               For Each nodNode In pcolNode.Items\r
+                       ToString = ToString & StringAddIndent(nodNode.ToString())\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeReturnStatement\r
+       Private pnodExpression\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeReturnStatement.Parse")\r
+               If objTokenizer.CurrentToken <> "return" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81ureturn\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & objTokenizer.CurrentToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               If objTokenizer.CurrentToken <> ";" Then\r
+                       Set pnodExpression = New NodeExpression\r
+                       Call pnodExpression.Parse(objTokenizer)\r
+                       \r
+                       If objTokenizer.CurrentToken <> ";" Then\r
+                               Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u;\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & objTokenizer.CurrentToken & ")")\r
+                       End If\r
+               Else\r
+                       Set pnodExpression = Nothing\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeReturnStatement.Compile")\r
+               If Not pnodExpression Is Nothing Then\r
+                       Call pnodExpression.Compile(objContext)\r
+               Else\r
+                       If objContext.FunctionScope = "Local" Then\r
+                               Call objContext.AddCommandLinePushValue("null", "")\r
+                       Else\r
+                               Call objContext.AddCommandLinePushValue("number", "0")\r
+                       End If\r
+               End If\r
+               \r
+               If objContext.FunctionScope = "Local" Then\r
+                       Call objContext.AddCommandLineReturn()\r
+               Else\r
+                       Call objContext.AddCommandLineExit()\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeReturnStatement.ToString")\r
+               ToString = "return:" & vbCrLf\r
+               \r
+               If Not pnodExpression Is Nothing Then\r
+                       ToString = ToString & StringAddIndent(pnodExpression.ToString())\r
+               End If\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeStatement\r
+       Private pnodStatement\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeStatement.Parse")\r
+               Dim strToken\r
+               strToken = objTokenizer.CurrentToken\r
+               \r
+               If strToken = "if" Then\r
+                       Set pnodStatement = New NodeIfStatement\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+               ElseIf strToken = "for" Then\r
+                       Set pnodStatement = New NodeForStatement\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+               ElseIf strToken = "foreach" Then\r
+                       Set pnodStatement = New NodeForEachStatement\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+               ElseIf strToken = "while" Then\r
+                       Set pnodStatement = New NodeWhileStatement\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+               ElseIf strToken = "var" Then\r
+                       Set pnodStatement = New NodeDeclareVariable\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+               ElseIf strToken = "return" Then\r
+                       Set pnodStatement = New NodeReturnStatement\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+               Else\r
+                       Set pnodStatement = New NodeExpression\r
+                       Call pnodStatement.Parse(objTokenizer)\r
+                       \r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken <> ";" Then\r
+                               Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u;\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+                       End If\r
+                       \r
+                       Call objTokenizer.MoveNextToken\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeStatement.Compile")\r
+               Call pnodStatement.Compile(objContext)\r
+               \r
+               If TypeName(pnodStatement) = "NodeExpression" Then\r
+                       Call objContext.AddCommandLinePop()\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeStatement.ToString")\r
+               ToString = pnodStatement.ToString()\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeStatementBlock\r
+       Private pcolNodStatement\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeStatementBlock.Parse")\r
+               Dim strToken\r
+               Dim nodStatement\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "{" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u{\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pcolNodStatement = New Collection\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.CurrentToken\r
+                       If strToken = "}" Then\r
+                               Exit Do\r
+                       End If\r
+                       \r
+                       Set nodStatement = New NodeStatement\r
+                       Call nodStatement.Parse(objTokenizer)\r
+                       \r
+                       Call pcolNodStatement.Add(nodStatement)\r
+               Loop\r
+               \r
+               objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeStatementBlock.Compile")\r
+               Dim nodStatement\r
+               For Each nodStatement In pcolNodStatement.Items\r
+                       Call nodStatement.Compile(objContext)\r
+               Next\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeStatementBlock.ToString")\r
+               ToString = "block:" & vbCrLf\r
+               \r
+               Dim nodStatement\r
+               For Each nodStatement In pcolNodStatement.Items\r
+                       ToString = ToString & StringAddIndent(nodStatement.ToString())\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeString\r
+       Private pstrString\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeString.Parse")\r
+               Dim strToken\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> """" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u""\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Do While True\r
+                       strToken = objTokenizer.MoveNextTokenNotIgnore\r
+                       If strToken = """" Then\r
+                               If Len(pstrString) = 0 Then\r
+                                       Exit Do\r
+                               ElseIf Mid(pstrString, Len(pstrString), 1) <> "\" Then\r
+                                       Exit Do\r
+                               End If\r
+                       End If\r
+                       \r
+                       pstrString = pstrString & strToken\r
+               Loop\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeString.Compile")\r
+               Call objContext.AddCommandLinePushValue("string", pstrString)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeString.ToString")\r
+               ToString = "string: " & pstrString & vbCrLf\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeVariable\r
+       Private pstrVariableName\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeVariable.Parse")\r
+               pstrVariableName = objTokenizer.CurrentToken\r
+               If Not IsIdentifierToken(pstrVariableName) Then\r
+                       Call Err.Raise(1, "NodeVariable", "\95Ï\90\94\96¼\82ª\8e¯\95Ê\8eq\82Ì\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & pstrVariableName & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeVariable.Compile")\r
+               Dim objVariable\r
+               \r
+               If Not objContext.IsDeclaredVariable(pstrVariableName) Then\r
+                       Call Err.Raise(1, "NodeVariable", "\95Ï\90\94\81u" & pstrVariableName & "\81v\82Í\90é\8c¾\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+               End If\r
+               \r
+               Set objVariable = objContext.GetVariable(pstrVariableName)\r
+               \r
+               If objVariable.FunctionScope = "Global" Then\r
+                       Call objContext.AddCommandLinePushGlobalVariable(objVariable.MemoryNumber)\r
+               Else\r
+                       Call objContext.AddCommandLinePushLocalVariable(objVariable.MemoryNumber)\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeVariable.ToString")\r
+               ToString = "variable: " & pstrVariableName & vbCrLf\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+Class NodeWhileStatement\r
+       Private pnodIfExpression\r
+       Private pnodLoopStatementBlock\r
+       \r
+       Public Sub Parse(objTokenizer)\r
+       Call StartFunction("NodeWhileStatement.Parse")\r
+               Dim strToken\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> "while" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81uwhile\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               strToken = objTokenizer.MoveNextToken\r
+               If strToken <> "(" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u(\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pnodIfExpression = New NodeExpression\r
+               Call pnodIfExpression.Parse(objTokenizer)\r
+               \r
+               strToken = objTokenizer.CurrentToken\r
+               If strToken <> ")" Then\r
+                       Call Err.Raise(1, "Runtime.vbs", "\83L\81[\83\8f\81[\83h\81u)\81v\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B(\93Ç\82Ý\8eæ\82Á\82½\95\8e\9a\97ñ=" & strToken & ")")\r
+               End If\r
+               \r
+               Call objTokenizer.MoveNextToken\r
+               \r
+               Set pnodLoopStatementBlock = New NodeLoopStatementBlock\r
+               Call pnodLoopStatementBlock.Parse(objTokenizer)\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Compile(objContext)\r
+       Call StartFunction("NodeWhileStatement.Compile")\r
+               ' TODO \96¢\8eÀ\91\95\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToString()\r
+       Call StartFunction("NodeWhileStatement.ToString")\r
+               ToString = "while:" & vbCrLf _\r
+                       & StringAddIndent(pnodIfExpression.ToString()) _\r
+                       & StringAddIndent(pnodLoopStatementBlock.ToString())\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83R\81[\83h\8eÀ\8ds\r
+' ********************************************************************************\r
+\r
+Class VMContext\r
+       Private paryMemory\r
+       Private pintRegisterProgramCounter\r
+       Private pintRegisterStackStartAddress\r
+       Private pintRegisterStackTopAddress\r
+       Private pintRegisterFrameStartAddress\r
+       Private pintRegisterVariableLength\r
+       Private pvarRegisterOperand1\r
+       Private pvarRegisterOperand2\r
+       \r
+       Public Sub Initialize(strCode)\r
+       Call StartFunction("VMContext.Initialize")\r
+               Dim intCount\r
+               \r
+               ' \83R\83\93\83e\83L\83X\83g\82Ì\93à\95\94\8fó\91Ô\82ð\8f\89\8aú\89»\82µ\82Ü\82·\81B\r
+               ReDim paryMemory(100)                ' TODO \83\81\83\82\83\8a\82Ì\91å\82«\82³\82ð\90Ý\92è\82Å\82«\82é\82æ\82¤\82É\81B\r
+               For intCount = 0 To UBound(paryMemory)\r
+                       paryMemory(intCount) = ""\r
+               Next\r
+               \r
+               pintRegisterProgramCounter = 0\r
+               pintRegisterStackStartAddress = 0\r
+               pintRegisterStackTopAddress = 0\r
+               pintRegisterFrameStartAddress = 0\r
+               pintRegisterVariableLength = 0\r
+               pvarRegisterOperand1 = 0\r
+               pvarRegisterOperand2 = 0\r
+               \r
+               ' \83R\81[\83h\82ð\89ð\90Í\82µ\81A\83\81\83\82\83\8a\82É\8ai\94[\82µ\82Ü\82·\81B\r
+               Dim aryCodeLine, aryCode\r
+               aryCodeLine = Split(strCode, vbCrLf)\r
+               \r
+               For intCount = 0 To UBound(aryCodeLine)\r
+                       If InStr(aryCodeLine(intCount), "push value,") = 1 Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "push value"\r
+                               paryMemory(pintRegisterStackStartAddress + 1) = Mid(aryCodeLine(intCount), InStr(aryCodeLine(intCount), ",") + 1)\r
+                               Call ValidateValue(paryMemory(pintRegisterStackStartAddress + 1))\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 2\r
+                       ElseIf InStr(aryCodeLine(intCount), "push local variable,") = 1 Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "push local variable"\r
+                               paryMemory(pintRegisterStackStartAddress + 1) = Mid(aryCodeLine(intCount), InStr(aryCodeLine(intCount), ",") + 1)\r
+                               Call ValidateAddress(paryMemory(pintRegisterStackStartAddress + 1))\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 2\r
+                       ElseIf InStr(aryCodeLine(intCount), "push global variable,") = 1 Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "push global variable"\r
+                               paryMemory(pintRegisterStackStartAddress + 1) = Mid(aryCodeLine(intCount), InStr(aryCodeLine(intCount), ",") + 1)\r
+                               Call ValidateAddress(paryMemory(pintRegisterStackStartAddress + 1))\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 2\r
+                       ElseIf aryCodeLine(intCount) = "pop" Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "pop"\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 1\r
+                       ElseIf InStr(aryCodeLine(intCount), "pop local variable,") = 1 Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "pop local variable"\r
+                               paryMemory(pintRegisterStackStartAddress + 1) = Mid(aryCodeLine(intCount), InStr(aryCodeLine(intCount), ",") + 1)\r
+                               Call ValidateAddress(paryMemory(pintRegisterStackStartAddress + 1))\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 2\r
+                       ElseIf InStr(aryCodeLine(intCount), "pop global variable,") = 1 Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "pop global variable"\r
+                               paryMemory(pintRegisterStackStartAddress + 1) = Mid(aryCodeLine(intCount), InStr(aryCodeLine(intCount), ",") + 1)\r
+                               Call ValidateAddress(paryMemory(pintRegisterStackStartAddress + 1))\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 2\r
+                       ElseIf aryCodeLine(intCount) = "exit" Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "exit"\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 1\r
+                       ElseIf InStr(aryCodeLine(intCount), "call native function,") = 1 Then\r
+                               aryCode = Split(aryCodeLine(intCount), ",")\r
+                               \r
+                               paryMemory(pintRegisterStackStartAddress) = "call native function"\r
+                               paryMemory(pintRegisterStackStartAddress + 1) = aryCode(1)\r
+                               paryMemory(pintRegisterStackStartAddress + 2) = aryCode(2)\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 3\r
+                       ElseIf aryCodeLine(intCount) = "add" Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "add"\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 1\r
+                       ElseIf aryCodeLine(intCount) = "subtract" Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "subtract"\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 1\r
+                       ElseIf aryCodeLine(intCount) = "multiple" Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "multiple"\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 1\r
+                       ElseIf aryCodeLine(intCount) = "divide" Then\r
+                               paryMemory(pintRegisterStackStartAddress) = "divide"\r
+                               \r
+                               pintRegisterStackStartAddress = pintRegisterStackStartAddress + 1\r
+                       ElseIf aryCodeLine(intCount) = "" Then\r
+                               ' \89½\82à\82µ\82È\82¢\81B\r
+                       Else\r
+                               Call Err.Raise(1, "VMContext", "\83R\81[\83h\89ð\90Í\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\89ð\90Í\82Å\82«\82È\82¢\83R\81[\83h\82Å\82·\81B[" & aryCodeLine(intCount) & "]")\r
+                       End If\r
+               Next\r
+               \r
+               pintRegisterFrameStartAddress = pintRegisterStackStartAddress\r
+               pintRegisterVariableLength = 16                 ' TODO \90Ý\92è\82Å\82«\82é\82æ\82¤\82É\81B\r
+               pintRegisterStackTopAddress = pintRegisterStackStartAddress + pintRegisterVariableLength\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Property Get IsRunning()\r
+       Call StartFunction("VMContext.IsRunning")\r
+               IsRunning = (pintRegisterProgramCounter <> -1)\r
+       Call EndFunction()\r
+       End Property\r
+       \r
+       Public Property Get ExitCode()\r
+       Call StartFunction("VMContext.ExitCode")\r
+               If pintRegisterProgramCounter <> -1 Then\r
+                       Call Err.Raise(1, "VMContext", "\89¼\91z\83}\83V\83\93\82Í\82Ü\82¾\8f\88\97\9d\82ð\8fI\97¹\82µ\82Ä\82¢\82Ü\82¹\82ñ")\r
+               End If\r
+               \r
+               ExitCode = CInt(Mid(paryMemory(pintRegisterStackTopAddress), InStr(paryMemory(pintRegisterStackTopAddress), "|") + 1))\r
+       Call EndFunction()\r
+       End Property\r
+       \r
+       Private Sub ValidateValue(strValue)\r
+       Call StartFunction("VMContext.ValidateValue")\r
+               If InStr(strValue, "number|") = 1 Then\r
+                       If Not IsNumberToken(Mid(strValue, Len("number|") + 1)) Then\r
+                               Call Err.Raise(1, "VMContext", "\83R\81[\83h\89ð\90Í\82É\8e¸\94s\82µ\82Ü\82µ\82½\81Bnumber\8c^\82Ì\92l\82ª\90\94\92l\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strValue & "]")\r
+                       End If\r
+               ElseIf InStr(strValue, "bool|") = 1 Then\r
+                       If strValue <> "bool|true" And strValue <> "bool|false" Then\r
+                               Call Err.Raise(1, "VMContext", "\83R\81[\83h\89ð\90Í\82É\8e¸\94s\82µ\82Ü\82µ\82½\81Bbool\8c^\82Ì\92l\82ªtrue|false\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strValue & "]")\r
+                       End If\r
+               ElseIf InStr(strValue, "null|") = 1 Then\r
+                       If strValue <> "null|" Then\r
+                               Call Err.Raise(1, "VMContext", "\83R\81[\83h\89ð\90Í\82É\8e¸\94s\82µ\82Ü\82µ\82½\81Bnull\8c^\82Ì\92l\82ª\8bó\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B[" & strValue & "]")\r
+                       End If\r
+               Else\r
+                       Call Err.Raise(1, "VMContext", "\83R\81[\83h\89ð\90Í\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\89ð\90Í\82Å\82«\82È\82¢\92l\82Å\82·\81B[" & strValue & "]")\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Private Sub ValidateAddress(strValue)\r
+       Call StartFunction("VMContext.ValidateAddress")\r
+               If Not IsNumberToken(strValue) Then\r
+                       Call Err.Raise(1, "VMContext", "\83R\81[\83h\89ð\90Í\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\83A\83h\83\8c\83X\82ª\90\94\92l\8c`\8e®\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B")\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Sub Execute()\r
+       Call StartFunction("VMContext.Execute")\r
+               If pintRegisterProgramCounter = -1 Then\r
+                       Call Err.Raise(1, "VMContext", "\89¼\91z\83}\83V\83\93\82Í\8f\88\97\9d\82ð\8fI\97¹\82µ\82Ä\82¢\82Ü\82·\81B")\r
+               End If\r
+               \r
+               If paryMemory(pintRegisterProgramCounter) = "push value" Then\r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+                       \r
+                       paryMemory(pintRegisterStackTopAddress) = paryMemory(pintRegisterProgramCounter)\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "push local variable" Then\r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+                       \r
+                       paryMemory(pintRegisterStackTopAddress) = paryMemory(pintRegisterFrameStartAddress + CInt(paryMemory(pintRegisterProgramCounter)))\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "push global variable" Then\r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+                       \r
+                       paryMemory(pintRegisterStackTopAddress) = paryMemory(pintRegisterStackStartAddress + CInt(paryMemory(pintRegisterProgramCounter)))\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "pop" Then\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "pop local variable" Then\r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       paryMemory(pintRegisterFrameStartAddress + CInt(paryMemory(pintRegisterProgramCounter))) = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "pop global variable" Then\r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       paryMemory(pintRegisterStackStartAddress + CInt(paryMemory(pintRegisterProgramCounter))) = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "exit" Then\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pintRegisterProgramCounter = -1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "call native function" Then\r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+                       \r
+                       If paryMemory(pintRegisterProgramCounter) = "print" And paryMemory(pintRegisterProgramCounter + 1) = "1" Then\r
+                               pintRegisterProgramCounter = pintRegisterProgramCounter + 2\r
+                               \r
+                               pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                               MsgBox paryMemory(pintRegisterStackTopAddress)\r
+                               \r
+                               pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                               paryMemory(pintRegisterStackTopAddress) = "null|"\r
+                       Else\r
+                               Call Err.Raise(1, "VMContext", "print\88È\8aO\82Ì\91g\82Ý\8d\9e\82Ý\8aÖ\90\94\82Í\96¢\8eÀ\91\95\82Å\82·\81B")\r
+                       End If\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "add" Then\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand2 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand1 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       If InStr(pvarRegisterOperand1, "number|") = 1 And InStr(pvarRegisterOperand2, "number|") = 1 Then\r
+                               paryMemory(pintRegisterStackTopAddress) = "number|" & CStr(CDbl(Mid(pvarRegisterOperand1, InStr(pvarRegisterOperand1, "|") + 1)) + CDbl(Mid(pvarRegisterOperand2, InStr(pvarRegisterOperand2, "|") + 1)))\r
+                       ElseIf (InStr(pvarRegisterOperand1, "number|") Or InStr(pvarRegisterOperand1, "string|")) And (InStr(pvarRegisterOperand2, "number|") Or InStr(pvarRegisterOperand2, "string|")) Then\r
+                               paryMemory(pintRegisterStackTopAddress) = "string|" & Mid(pvarRegisterOperand1, InStr(pvarRegisterOperand1, "|") + 1) & Mid(pvarRegisterOperand2, InStr(pvarRegisterOperand2, "|") + 1)\r
+                       Else\r
+                               Call Err.Raise(1, "VMContext", "\89Á\8eZ\82Å\82«\82Ü\82¹\82ñ\81B[\8d\801=" & pvarRegisterOperand1 & ", \8d\802=" & pvarRegisterOperand2 & "]")\r
+                       End If\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "subtract" Then\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand2 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand1 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       If InStr(pvarRegisterOperand1, "number|") = 1 And InStr(pvarRegisterOperand2, "number|") = 1 Then\r
+                               paryMemory(pintRegisterStackTopAddress) = "number|" & CStr(CDbl(Mid(pvarRegisterOperand1, InStr(pvarRegisterOperand1, "|") + 1)) - CDbl(Mid(pvarRegisterOperand2, InStr(pvarRegisterOperand2, "|") + 1)))\r
+                       Else\r
+                               Call Err.Raise(1, "VMContext", "\8c¸\8eZ\82Å\82«\82Ü\82¹\82ñ\81B[\8d\801=" & pvarRegisterOperand1 & ", \8d\802=" & pvarRegisterOperand2 & "]")\r
+                       End If\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "multiple" Then\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand2 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand1 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       If InStr(pvarRegisterOperand1, "number|") = 1 And InStr(pvarRegisterOperand2, "number|") = 1 Then\r
+                               paryMemory(pintRegisterStackTopAddress) = "number|" & CStr(CDbl(Mid(pvarRegisterOperand1, InStr(pvarRegisterOperand1, "|") + 1)) * CDbl(Mid(pvarRegisterOperand2, InStr(pvarRegisterOperand2, "|") + 1)))\r
+                       Else\r
+                               Call Err.Raise(1, "VMContext", "\8fæ\8eZ\82Å\82«\82Ü\82¹\82ñ\81B[\8d\801=" & pvarRegisterOperand1 & ", \8d\802=" & pvarRegisterOperand2 & "]")\r
+                       End If\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               ElseIf paryMemory(pintRegisterProgramCounter) = "divide" Then\r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand2 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress - 1\r
+                       pvarRegisterOperand1 = paryMemory(pintRegisterStackTopAddress)\r
+                       \r
+                       If InStr(pvarRegisterOperand1, "number|") = 1 And InStr(pvarRegisterOperand2, "number|") = 1 Then\r
+                               paryMemory(pintRegisterStackTopAddress) = "number|" & CStr(CDbl(Mid(pvarRegisterOperand1, InStr(pvarRegisterOperand1, "|") + 1)) / CDbl(Mid(pvarRegisterOperand2, InStr(pvarRegisterOperand2, "|") + 1)))\r
+                       Else\r
+                               Call Err.Raise(1, "VMContext", "\8f\9c\8eZ\82Å\82«\82Ü\82¹\82ñ\81B[\8d\801=" & pvarRegisterOperand1 & ", \8d\802=" & pvarRegisterOperand2 & "]")\r
+                       End If\r
+                       \r
+                       pintRegisterStackTopAddress = pintRegisterStackTopAddress + 1\r
+                       \r
+                       pintRegisterProgramCounter = pintRegisterProgramCounter + 1\r
+               Else\r
+                       Call Err.Raise(1, "VMContext", "\94F\8e¯\82Å\82«\82È\82¢\83R\81[\83h\82Å\82·\81B[\83v\83\8d\83O\83\89\83\80\81E\83J\83E\83\93\83^=" & pintRegisterProgramCounter & ", \83R\81[\83h=" & paryMemory(pintRegisterProgramCounter) & "]")\r
+               End If\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function ToStringMemory()\r
+       Call StartFunction("VMContext.ToStringMemory")\r
+               Dim intCount\r
+               \r
+               ToStringMemory = ""\r
+               \r
+               For intCount = 0 To UBound(paryMemory)\r
+                       ToStringMemory = ToStringMemory & intCount & "," & paryMemory(intCount) & vbCrLf\r
+               Next\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function ToStringRegister()\r
+       Call StartFunction("VMContext.ToStringRegister")\r
+               ToStringRegister = "programCounter," & pintRegisterProgramCounter & vbCrLf _\r
+                       & "stackStartAddress," & pintRegisterStackStartAddress & vbCrLf _\r
+                       & "stackTopAddress," & pintRegisterStackTopAddress & vbCrLf _\r
+                       & "frameStartAddress," & pintRegisterFrameStartAddress & vbCrLf _\r
+                       & "variableLength," & pintRegisterVariableLength & vbCrLf _\r
+                       & "operand1," & pvarRegisterOperand1 & vbCrLf _\r
+                       & "operand2," & pvarRegisterOperand2 & vbCrLf\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83\86\81[\83e\83B\83\8a\83e\83B\r
+' ********************************************************************************\r
+\r
+' ***** \83R\83\8c\83N\83V\83\87\83\93 *****\r
+\r
+Class Collection\r
+       Private pobjArray\r
+       \r
+       Private Sub Class_Initialize()\r
+               ReDim pobjArray(0)\r
+       End Sub\r
+       \r
+       Public Property Get Count()\r
+               Count = UBound(pobjArray)\r
+       End Property\r
+       \r
+       Public Property Get Item(intIndex)\r
+               If intIndex < 1 Or intIndex > UBound(pobjArray) Then\r
+                       Call Err.Raise(1, "Collection", "\83R\83\8c\83N\83V\83\87\83\93\82Ì\94Í\88Í\8aO\82Ì\83C\83\93\83f\83b\83N\83X\82ð\8ew\92è\82³\82ê\82Ü\82µ\82½\81B[intIndex=" & intIndex & "]")\r
+               End If\r
+               \r
+               If IsObject(pobjArray(intIndex)) Then\r
+                       Set Item = pobjArray(intIndex)\r
+               Else\r
+                       Item = pobjArray(intIndex)\r
+               End If\r
+       End Property\r
+       \r
+       Public Property Let Item(intIndex, varItem)\r
+               If intIndex < 1 Or intIndex > UBound(pobjArray) Then\r
+                       Call Err.Raise(1, "Collection", "\83R\83\8c\83N\83V\83\87\83\93\82Ì\94Í\88Í\8aO\82Ì\83C\83\93\83f\83b\83N\83X\82ð\8ew\92è\82³\82ê\82Ü\82µ\82½\81B[intIndex=" & intIndex & "]")\r
+               End If\r
+               \r
+               pobjArray(intIndex) = varItem\r
+       End Property\r
+       \r
+       Public Property Set Item(intIndex, varItem)\r
+               If intIndex < 1 Or intIndex > UBound(pobjArray) Then\r
+                       Call Err.Raise(1, "Collection", "\83R\83\8c\83N\83V\83\87\83\93\82Ì\94Í\88Í\8aO\82Ì\83C\83\93\83f\83b\83N\83X\82ð\8ew\92è\82³\82ê\82Ü\82µ\82½\81B[intIndex=" & intIndex & "]")\r
+               End If\r
+               \r
+               Set pobjArray(intIndex) = varItem\r
+       End Property\r
+       \r
+       Public Property Get Items()\r
+               Dim intCount\r
+               \r
+               Dim dicItem\r
+               Set dicItem = CreateObject("Scripting.Dictionary")\r
+               \r
+               For intCount = 1 To UBound(pobjArray)\r
+                       Call dicItem.Add(intCount, pobjArray(intCount))\r
+               Next\r
+               \r
+               Items = dicItem.Items\r
+       End Property\r
+       \r
+       Public Sub Add(varItem)\r
+               Redim Preserve pobjArray(UBound(pobjArray) + 1)\r
+               \r
+               If IsObject(varItem) Then\r
+                       Set pobjArray(UBound(pobjArray)) = varItem\r
+               Else\r
+                       pobjArray(UBound(pobjArray)) = varItem\r
+               End If\r
+       End Sub\r
+       \r
+       Public Function Remove(intIndex)\r
+               If IsObject(Me.Item(intIndex)) Then\r
+                       Set Remove = Me.Item(intIndex)\r
+               Else\r
+                       Remove = Me.Item(intIndex)\r
+               End If\r
+               \r
+               Dim intCount\r
+               intCount = intIndex\r
+               \r
+               Do While intCount < UBound(pobjArray)\r
+                       If IsObject(pobjArray(intCount + 1)) Then\r
+                               Set pobjArray(intCount) = pobjArray(intCount + 1)\r
+                       Else\r
+                               pobjArray(intCount) = pobjArray(intCount + 1)\r
+                       End If\r
+                       \r
+                       intCount = intCount + 1\r
+               Loop\r
+               \r
+               ReDim Preserve pobjArray(UBound(pobjArray) - 1)\r
+       End Function\r
+       \r
+       Public Function RemoveLast()\r
+               If IsObject(Me.Item(Me.Count)) Then\r
+                       Set RemoveLast = Me.Remove(Me.Count)\r
+               Else\r
+                       RemoveLast = Me.Remove(Me.Count)\r
+               End If\r
+       End Function\r
+       \r
+       Public Function Exist(varItem)\r
+               Dim varItem2\r
+               \r
+               For Each varItem2 In Me.Items\r
+                       If varItem = varItem2 Then\r
+                               Exist = True\r
+                               Exit Function\r
+                       End If\r
+               Next\r
+               \r
+               Exist = False\r
+       End Function\r
+End Class\r
+\r
+' ***** \83t\83@\83C\83\8b\93ü\8fo\97Í *****\r
+\r
+' \83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Ý\81A\93Ç\82Ý\8d\9e\82ñ\82¾\95\8e\9a\97ñ\82ð\96ß\82µ\82Ü\82·\81B\r
+'\r
+' @param strPath \93Ç\82Ý\8d\9e\82Þ\83t\83@\83C\83\8b\82Ì\83t\83@\83C\83\8b\81E\83p\83X\81B\r
+' @return \83t\83@\83C\83\8b\82©\82ç\93Ç\82Ý\8d\9e\82ñ\82¾\95\8e\9a\97ñ\81B\r
+Public Function ReadFile(strPath)\r
+       Dim fso, fsoStream\r
+       \r
+       Set fso = CreateObject("Scripting.FileSystemObject")\r
+       Set fsoStream = fso.OpenTextFile(strPath)\r
+       \r
+       ReadFile = fsoStream.ReadAll()\r
+       \r
+       Call fsoStream.Close()\r
+End Function\r
+\r
+' \83t\83@\83C\83\8b\82É\95\8e\9a\97ñ\82ð\8f\91\82«\8d\9e\82Ý\82Ü\82·\81B\r
+' \83t\83@\83C\83\8b\82ª\91\8dÝ\82µ\82È\82¢\8fê\8d\87\82Í\83t\83@\83C\83\8b\82ð\8dì\90¬\82µ\81A\83t\83@\83C\83\8b\82ª\91\8dÝ\82·\82é\8fê\8d\87\82Í\8fã\8f\91\82«\82µ\82Ü\82·\81B\r
+'\r
+' @param strPath \8f\91\82«\8d\9e\82Þ\83t\83@\83C\83\8b\82Ì\83t\83@\83C\83\8b\81E\83p\83X\81B\r
+' @param strText \83t\83@\83C\83\8b\82É\8f\91\82«\8d\9e\82Þ\95\8e\9a\97ñ\81B\r
+Public Sub WriteFile(strPath, strText)\r
+       Dim fso, fsoStream\r
+       \r
+       Set fso = CreateObject("Scripting.FileSystemObject")\r
+       Set fsoStream = fso.OpenTextFile(strPath, 2, True)\r
+       \r
+       Call fsoStream.Write(strText)\r
+       \r
+       Call fsoStream.Close()\r
+End Sub\r
+\r
+' \83t\83@\83C\83\8b\82É\95\8e\9a\97ñ\82ð\8f\91\82«\8d\9e\82Ý\82Ü\82·\81B\r
+' \83t\83@\83C\83\8b\82ª\91\8dÝ\82µ\82È\82¢\8fê\8d\87\82Í\83t\83@\83C\83\8b\82ð\8dì\90¬\82µ\81A\83t\83@\83C\83\8b\82ª\91\8dÝ\82·\82é\8fê\8d\87\82Í\92Ç\89Á\8f\91\82«\8d\9e\82Ý\82µ\82Ü\82·\81B\r
+'\r
+' @param strPath \8f\91\82«\8d\9e\82Þ\83t\83@\83C\83\8b\82Ì\83t\83@\83C\83\8b\81E\83p\83X\81B\r
+' @param strText \83t\83@\83C\83\8b\82É\8f\91\82«\8d\9e\82Þ\95\8e\9a\97ñ\81B\r
+Public Sub AppendFile(strPath, strText)\r
+       Dim fso, fsoStream\r
+       \r
+       Set fso = CreateObject("Scripting.FileSystemObject")\r
+       Set fsoStream = fso.OpenTextFile(strPath, 8, True)\r
+       \r
+       Call fsoStream.Write(strText)\r
+       \r
+       Call fsoStream.Close()\r
+End Sub\r
+\r
+' \83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\r
+'\r
+' @param strPath \8dí\8f\9c\82·\82é\83t\83@\83C\83\8b\82Ì\83t\83@\83C\83\8b\81E\83p\83X\81B\r
+Public Sub DeleteFile(strPath)\r
+       Dim fso\r
+       \r
+       Set fso = CreateObject("Scripting.FileSystemObject")\r
+       If fso.FileExists(strPath) Then\r
+               Call fso.DeleteFile(strPath)\r
+       End If\r
+End Sub\r
+\r
+' ***** \83\8d\83O *****\r
+\r
+' \83\8d\83O\82ð\8bL\98^\82µ\82Ü\82·\81B\r
+' \83\8d\83O\82ÍLOG_PATH\92è\90\94\82Ì\83p\83X\82Ì\83t\83@\83C\83\8b\82É\92Ç\8bL\82µ\82Ü\82·\81B\r
+' LOG_PATH\92è\90\94\82ª\8bó\95\8e\9a\97ñ\82Ì\8fê\8d\87\81A\83\8d\83O\82ð\8bL\98^\82µ\82Ü\82¹\82ñ\81B\r
+'\r
+' @param strText \83\8d\83O\82É\8bL\98^\82·\82é\95\8e\9a\97ñ\81B\r
+Sub WriteLog(strText)\r
+       If Len(LOG_PATH) > 0 Then\r
+               Call AppendFile(LOG_PATH, GetNowToString() & "," & strText & vbCrLf)\r
+       End If\r
+End Sub\r
+\r
+' \8aÖ\90\94\82Ì\8aJ\8en\82ð\83\8d\83O\82É\8bL\98^\82µ\82Ü\82·\81B\r
+' \83\8d\83O\82ÍSTACKTRACE_PATH\92è\90\94\82Ì\83p\83X\82Ì\83t\83@\83C\83\8b\82É\92Ç\8bL\82µ\82Ü\82·\81B\r
+' STACKTRACE_PATH\92è\90\94\82ª\8bó\95\8e\9a\97ñ\82Ì\8fê\8d\87\81A\83\8d\83O\82ð\8bL\98^\82µ\82Ü\82¹\82ñ\81B\r
+'\r
+' \82±\82Ì\8aÖ\90\94\82Í\8aÖ\90\94\8cÄ\82Ñ\8fo\82µ\83X\83^\83b\83N\82ð\92Ç\90Õ\82·\82é\82½\82ß\82É\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B\r
+' \8aÖ\90\94\82Ì\8dÅ\8f\89\82É\95K\82¸\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82­\82¾\82³\82¢\81B\r
+'\r
+' @param strFunctionName \8aJ\8en\82µ\82½\8aÖ\90\94\82Ì\8aÖ\90\94\96¼\81B\r
+Sub StartFunction(strFunctionName)\r
+       If Len(STACKTRACE_PATH) > 0 Then\r
+               Call AppendFile(STACKTRACE_PATH, strFunctionName & vbCrLf)\r
+       End If\r
+End Sub\r
+\r
+' \8aÖ\90\94\82Ì\8fI\97¹\82ð\83\8d\83O\82É\8bL\98^\82µ\82Ü\82·\81B\r
+' \83\8d\83O\82ÍSTACKTRACE_PATH\92è\90\94\82Ì\83p\83X\82Ì\83t\83@\83C\83\8b\82É\92Ç\8bL\82µ\82Ü\82·\81B\r
+' STACKTRACE_PATH\92è\90\94\82ª\8bó\95\8e\9a\97ñ\82Ì\8fê\8d\87\81A\83\8d\83O\82ð\8bL\98^\82µ\82Ü\82¹\82ñ\81B\r
+'\r
+' \82±\82Ì\8aÖ\90\94\82Í\8aÖ\90\94\8cÄ\82Ñ\8fo\82µ\83X\83^\83b\83N\82ð\92Ç\90Õ\82·\82é\82½\82ß\82É\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B\r
+' \8aÖ\90\94\82Ì\8dÅ\8f\89\82É\95K\82¸\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82­\82¾\82³\82¢\81B\r
+Sub EndFunction()\r
+       Dim strLogLines\r
+       Dim intCount\r
+       \r
+       If Len(STACKTRACE_PATH) > 0 Then\r
+               strLogLines = Split(ReadFile(STACKTRACE_PATH), vbCrLf)\r
+               \r
+               Call WriteFile(STACKTRACE_PATH, "")\r
+               For intCount = 0 To UBound(strLogLines) - 2\r
+                       Call AppendFile(STACKTRACE_PATH, strLogLines(intCount) & vbCrLf)\r
+               Next\r
+       End If\r
+End Sub\r
+\r
+' \8aÖ\90\94\82Ì\8aJ\8en\81E\8fI\97¹\82Ì\83\8d\83O\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\r
+Sub ClearStacktrace()\r
+       If Len(STACKTRACE_PATH) > 0 Then\r
+               Call DeleteFile(STACKTRACE_PATH)\r
+       End If\r
+End Sub\r
+\r
+' ***** \95\8e\9a\97ñ\91\80\8dì *****\r
+\r
+Public Function RegExpTest(strPattern, strText)\r
+       Dim objRegExp\r
+       Set objRegExp = New RegExp\r
+       \r
+       objRegExp.Pattern = strPattern\r
+       \r
+       RegExpTest = objRegExp.Test(strText)\r
+End Function\r
+\r
+Public Function RegExpExecute(strPattern, strText)\r
+       Dim objRegExp\r
+       Set objRegExp = New RegExp\r
+       \r
+       objRegExp.Pattern = strPattern\r
+       \r
+       Set RegExpExecute = objRegExp.Execute(strText)\r
+End Function\r
+\r
+Public Function IsNumberToken(strText)\r
+       IsNumberToken = RegExpTest("^[0-9]+(\.[0-9]+)?$", strText)\r
+End Function\r
+\r
+Public Function IsIntegerToken(strText)\r
+       IsIntegerToken = RegExpTest("^[0-9]+$", strText)\r
+End Function\r
+\r
+Public Function IsIdentifierToken(strText)\r
+       If strText = "function" _\r
+               Or strText = "if" _\r
+               Or strText = "else" _\r
+               Or strText = "for" _\r
+               Or strText = "while" _\r
+               Or strText = "foreach" _\r
+               Or strText = "return" _\r
+               Or strText = "break" _\r
+               Or strText = "var" _\r
+               Or strText = "native" _\r
+               Or strText = "null" _\r
+               Or strText = "true" _\r
+               Or strText = "false" Then\r
+               \r
+               IsIdentifierToken = False\r
+               Exit Function\r
+       End If\r
+       \r
+       IsIdentifierToken = RegExpTest("^[a-zA-Z_][a-zA-Z0-9_]*$", strText)\r
+End Function\r
+\r
+Function GetNowToString()\r
+       GetNowToString = Year(Now()) & "-" _\r
+               & Right("00" & Month(Now()), 2) & "-" _\r
+               & Right("00" & Day(Now()), 2) & " " _\r
+               & Right("00" & Hour(Now()), 2) & ":" _\r
+               & Right("00" & Minute(Now()), 2) & ":" _\r
+               & Right("00" & Second(Now()), 2)\r
+End Function\r
+\r
+Public Function StringAddIndent(strText)\r
+       Dim strLines\r
+       strLines = Split(strText, vbCrLf)\r
+       \r
+       Dim strDestText\r
+       strDestText = ""\r
+       \r
+       Dim intCount\r
+       For intCount = LBound(strLines) To UBound(strLines)\r
+               If Len(strLines(intCount)) > 0 Then\r
+                       strDestText = strDestText & " " & strLines(intCount) & vbCrLf\r
+               End If\r
+       Next\r
+       \r
+       StringAddIndent = strDestText\r
+End Function\r
+\r
+Class Tokenizer\r
+       Private pstrText\r
+       Private pcolDelimiter\r
+       Private pcolIgnoreToken\r
+       Private pstrCurrentToken\r
+       \r
+       Public Sub Initialize(strText, colDelimiter, colIgnoreToken)\r
+       Call StartFunction("Tokenizer.Initialize")\r
+               pstrText = strText\r
+               Set pcolDelimiter = colDelimiter\r
+               Set pcolIgnoreToken = colIgnoreToken\r
+               pstrCurrentToken = Empty\r
+       Call EndFunction()\r
+       End Sub\r
+       \r
+       Public Function MoveNextToken()\r
+       Call StartFunction("Tokenizer.MoveNextToken")\r
+               Do While Me.MoveNextTokenNotIgnore <> Empty\r
+                       Dim blnCheckIgnoreToken\r
+                       Dim strToken\r
+                       \r
+                       blnCheckIgnoreToken = False\r
+                       \r
+                       For Each strToken In pcolIgnoreToken.Items\r
+                               If strToken = Me.CurrentToken Then\r
+                                       blnCheckIgnoreToken = True\r
+                               End If\r
+                       Next\r
+                       \r
+                       If Not blnCheckIgnoreToken Then\r
+                               Exit Do\r
+                       End If\r
+               Loop\r
+               \r
+               MoveNextToken = Me.CurrentToken\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Function MoveNextTokenNotIgnore()\r
+       Call StartFunction("Tokenizer.MoveNextTokenNotIgnore")\r
+               If Len(pstrText) = 0 Then\r
+                       pstrCurrentToken = Empty\r
+                       MoveNextTokenNotIgnore = Me.CurrentToken\r
+                       Exit Function\r
+               End If\r
+               \r
+               Dim intLocation\r
+               Dim strMinDelimiter\r
+               Dim strDelimiter\r
+               \r
+               intLocation = 0\r
+               \r
+               For Each strDelimiter In pcolDelimiter.Items\r
+                       If InStr(1, pstrText, strDelimiter) > 0 Then\r
+                               If intLocation = 0 Or intLocation > InStr(1, pstrText, strDelimiter) Then\r
+                                       intLocation = InStr(1, pstrText, strDelimiter)\r
+                                       strMinDelimiter = strDelimiter\r
+                               End If\r
+                       End If\r
+               Next\r
+               \r
+               If intLocation = 0 Then\r
+                       pstrCurrentToken = pstrText\r
+                       pstrText = ""\r
+               ElseIf intLocation = 1 Then\r
+                       pstrCurrentToken = Mid(pstrText, 1, Len(strMinDelimiter))\r
+                       pstrText = Mid(pstrText, Len(strMinDelimiter) + 1)\r
+               Else\r
+                       pstrCurrentToken = Mid(pstrText, 1, intLocation - 1)\r
+                       pstrText = Mid(pstrText, intLocation)\r
+               End If\r
+               \r
+               MoveNextTokenNotIgnore = Me.CurrentToken\r
+       Call EndFunction()\r
+       End Function\r
+       \r
+       Public Property Get CurrentToken()\r
+       Call StartFunction("Tokenizer.CurrentToken")\r
+               CurrentToken = pstrCurrentToken\r
+       Call EndFunction()\r
+       End Property\r
+       \r
+       Public Function Peek()\r
+       Call StartFunction("Tokenizer.Peek")\r
+               Dim strText\r
+               Dim strCurrentToken\r
+               \r
+               strText = pstrText\r
+               strCurrentToken = pstrCurrentToken\r
+               \r
+               Dim strToken\r
+               strToken = Me.MoveNextToken\r
+               \r
+               pstrText = strText\r
+               pstrCurrentToken = strCurrentToken\r
+               \r
+               Peek = strToken\r
+       Call EndFunction()\r
+       End Function\r
+End Class\r
+\r
+' ***** \83e\83X\83g\8aÖ\98A *****\r
+\r
+Public Sub AssertEquals(var1, var2, strName)\r
+       If var1 <> var2 Then\r
+               Call Err.Raise(1, strName, "\92l1=" & var1 & ", \92l2=" & var2)\r
+       End If\r
+End Sub\r
+\r
+Class TestContext\r
+       Private pdicResult\r
+       \r
+       Private Sub Class_Initialize()\r
+               Set pdicResult = CreateObject("Scripting.Dictionary")\r
+       End Sub\r
+       \r
+       Public Sub Assert(strTestName, blnResult)\r
+               If Not pdicResult.Exists(strTestName) Then\r
+                       pdicResult(strTestName) = blnResult\r
+               ElseIf pdicResult(strTestName) Then\r
+                       pdicResult(strTestName) = blnResult\r
+               End If\r
+       End Sub\r
+       \r
+       Public Function ToStringResult()\r
+               Dim strTestName\r
+               \r
+               ToStringResult = ""\r
+               \r
+               For Each strTestName In pdicResult.Keys\r
+                       If Not pdicResult(strTestName) Then\r
+                               ToStringResult = ToStringResult & strTestName & vbCrLf\r
+                       End If\r
+               Next\r
+       End Function\r
+End Class\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83e\83X\83g\r
+' ********************************************************************************\r
+\r
+Public Sub TestSuite()\r
+       Dim objContext\r
+       \r
+       Set objContext = New TestContext\r
+       \r
+       Call TestParseDeclareVariable1(objContext)\r
+       Call TestParseDeclareVariable2(objContext)\r
+       Call TestParseDeclareVariable3(objContext)\r
+       Call TestCompileDeclareVariable1(objContext)\r
+       Call TestCompileDeclareVariable2(objContext)\r
+       Call TestCompileDeclareVariable3(objContext)\r
+       \r
+       If objContext.ToStringResult() = "" Then\r
+               MsgBox "\83e\83X\83g\82Í\91S\82Ä\90¬\8c÷\82Å\82·\81B"\r
+       Else\r
+               MsgBox "\8e¸\94s\82µ\82½\83e\83X\83g\81B" & vbCrLf & vbCrLf & objContext.ToStringResult()\r
+       End If\r
+End Sub\r
+\r
+Public Sub TestParseDeclareVariable1(objContext)\r
+       Dim strSource, strTree, strDest\r
+       \r
+       strSource = "var x;"\r
+       strDest = "" _\r
+               & "program:" & vbCrLf _\r
+               & " declare variable:" & vbCrLf _\r
+               & "  name: x" & vbCrLf _\r
+       \r
+       strTree = Parse(strSource).ToString()\r
+       \r
+       Call objContext.Assert("TestParseDeclareVariable1", strTree = strDest)\r
+End Sub\r
+\r
+Public Sub TestParseDeclareVariable2(objContext)\r
+       Dim strSource, strTree, strDest\r
+       \r
+       strSource = "var x, y, z;"\r
+       strDest = "" _\r
+               & "program:" & vbCrLf _\r
+               & " declare variable:" & vbCrLf _\r
+               & "  name: x" & vbCrLf _\r
+               & "  name: y" & vbCrLf _\r
+               & "  name: z" & vbCrLf\r
+       \r
+       strTree = Parse(strSource).ToString()\r
+       \r
+       Call objContext.Assert("TestParseDeclareVariable1", strTree = strDest)\r
+End Sub\r
+\r
+Public Sub TestParseDeclareVariable3(objContext)\r
+       Dim strSource, strTree, strDest\r
+       \r
+       strSource = "var x, y = 1, z = 1.41421356;"\r
+       strDest = "" _\r
+               & "program:" & vbCrLf _\r
+               & " declare variable:" & vbCrLf _\r
+               & "  name: x" & vbCrLf _\r
+               & "  name: y" & vbCrLf _\r
+               & "   expression(=):" & vbCrLf _\r
+               & "    expression(==, !=):" & vbCrLf _\r
+               & "     expression(<, <=, >, >=):" & vbCrLf _\r
+               & "      expression(+, -):" & vbCrLf _\r
+               & "       expression(*, /):" & vbCrLf _\r
+               & "        number: 1" & vbCrLf _\r
+               & "  name: z" & vbCrLf _\r
+               & "   expression(=):" & vbCrLf _\r
+               & "    expression(==, !=):" & vbCrLf _\r
+               & "     expression(<, <=, >, >=):" & vbCrLf _\r
+               & "      expression(+, -):" & vbCrLf _\r
+               & "       expression(*, /):" & vbCrLf _\r
+               & "        number: 1.41421356" & vbCrLf\r
+       \r
+       strTree = Parse(strSource).ToString()\r
+       \r
+       Call objContext.Assert("TestParseDeclareVariable3", strTree = strDest)\r
+End Sub\r
+\r
+Public Sub TestCompileDeclareVariable1(objContext)\r
+       Dim strSource, strDest, strCode\r
+       \r
+       strSource = "var x;"\r
+       strDest = "" _\r
+               & "push value,number|0" & vbCrLf _\r
+               & "exit" & vbCrLf\r
+       \r
+       strCode = Compile(Parse(strSource))\r
+       \r
+       Call objContext.Assert("TestCompileDeclareVariable1", strCode = strDest)\r
+End Sub\r
+\r
+Public Sub TestCompileDeclareVariable2(objContext)\r
+       Dim strSource, strDest, strCode\r
+       \r
+       strSource = "var x, y, z;"\r
+       strDest = "" _\r
+               & "push value,number|0" & vbCrLf _\r
+               & "exit" & vbCrLf\r
+       \r
+       strCode = Compile(Parse(strSource))\r
+       \r
+       Call objContext.Assert("TestCompileDeclareVariable2", strCode = strDest)\r
+End Sub\r
+\r
+Public Sub TestCompileDeclareVariable3(objContext)\r
+       Dim strSource, strDest, strCode\r
+       \r
+       strSource = "var x, y = 1, z = 1.41421356;"\r
+       strDest = "" _\r
+               & "push value,number|1" & vbCrLf _\r
+               & "pop global variable,2" & vbCrLf _\r
+               & "push value,number|1.41421356" & vbCrLf _\r
+               & "pop global variable,3" & vbCrLf _\r
+               & "push value,number|0" & vbCrLf _\r
+               & "exit" & vbCrLf\r
+       \r
+       strCode = Compile(Parse(strSource))\r
+       \r
+       Call objContext.Assert("TestCompileDeclareVariable3", strCode = strDest)\r
+End Sub\r
diff --git a/hoge-language/memo.txt b/hoge-language/memo.txt
new file mode 100644 (file)
index 0000000..33b128c
--- /dev/null
@@ -0,0 +1,524 @@
+1\82Â\82Ì\83e\83L\83X\83g\95\8f\91\82Ì\82Ý\82Å\8d\\90¬\82³\82ê\82é\83\\81[\83X\83R\81[\83h\r
+\8d\\95\82ÍC\83\89\83C\83N\81B\r
+\93®\93I\8c^\8c¾\8cê\81B\95Ï\90\94\82Ì\8c^\82Í\91ã\93ü\82³\82ê\82½\92l\82É\82æ\82Á\82Ä\8c\88\92è\82³\82ê\82é\81B\82½\82¾\82µ\81A\95Ï\90\94\82Ì\90é\8c¾\82Í\95K\97v\82Æ\82·\82é\81B\r
+\8c^\82Í\81A\90\94\92l\8c^(10\90i\8c^)\81A\90^\97\9d\8c^(true\81Afalse)\81A\95\8e\9a\97ñ\8c^\81Anull\8c^\82ð\83T\83|\81[\83g\82·\82é\81B\r
+\8aÖ\90\94\82ð\83T\83|\81[\83g\82·\82é\81B\96ß\82è\92l\82ð\95Ô\82·\82©\82Ç\82¤\82©\82Í\8aÖ\90\94\82Ì\8e©\97R\81B\96ß\82è\92l\82ð\95Ô\82³\82È\82¢\8fê\8d\87\81Anull\92l\82ð\95Ô\82·\81B\r
+\8fð\8c\8f\95ª\8aò(if)\81A\83\8b\81[\83v(for, foreach, while)\82ð\83T\83|\81[\83g\82·\82é\81B\r
+\r
+\83v\83\8d\83O\83\89\83\80         ::= (\8aÖ\90\94 | \95¶)* EOF\r
+\8aÖ\90\94               ::= "function" \8aÖ\90\94\96¼ "(" (\89¼\88ø\90\94\96¼ ("," \89¼\88ø\90\94\96¼)*)? ")" \95\83u\83\8d\83b\83N\r
+\95\83u\83\8d\83b\83N         ::= "{" \95¶* "}"\r
+\83\8b\81[\83v\95\83u\83\8d\83b\83N   ::= "{" (\95¶ | break\95¶)* "}"\r
+\95¶                 ::= \8e® ";"  | \95Ï\90\94\90é\8c¾ | \8fð\8c\8f\95ª\8aò | for\83\8b\81[\83v | while\83\8b\81[\83v | foreach\83\8b\81[\83v | return\95\r
+\8fð\8c\8f\95ª\8aò           ::= "if" "(" \8e® ")" \95\83u\83\8d\83b\83N\r
+                            ("else" "if" "(" \8e® ")" \95\83u\83\8d\83b\83N)*\r
+                            ("else" \95\83u\83\8d\83b\83N)?\r
+for\83\8b\81[\83v          ::= "for" "(" (\8e®)? ";" (\8e®)? ";" (\8e®)? ")" \83\8b\81[\83v\95\83u\83\8d\83b\83N\r
+while\83\8b\81[\83v        ::= "while" "(" \8e® ")" \83\8b\81[\83v\95\83u\83\8d\83b\83N\r
+foreach\83\8b\81[\83v      ::= "foreach" "(" \95Ï\90\94\96¼ "in" \8e® ")" \83\8b\81[\83v\95\83u\83\8d\83b\83N\r
+return\95¶           ::= "return" \8e®? ";"\r
+break\95¶            ::= "break" ";"\r
+\95Ï\90\94\90é\8c¾           ::= "var" \95Ï\90\94\96¼ ("=" \8e®)? ("," \95Ï\90\94\96¼ ("=" \8e®)?)* ";"\r
+\8e®                 ::= \91ã\93ü\8e®\r
+\91ã\93ü\8e®             ::= (\95Ï\90\94\96¼ "=")? \8e® | \93\99\94ä\8ar\8e®\r
+\93\99\94ä\8ar\8e®           ::= \94ä\8ar\8e® (("==" | "!=") \93\99\94ä\8ar\8e®)?\r
+\94ä\8ar\8e®             ::= \89Á\8c¸\8e® (("<" | "<=" | ">" | ">=") \94ä\8ar\8e®)?\r
+\89Á\8c¸\8e®             ::= ("+" | "-")? \8fæ\8f\9c\8e® (("+" | "-") \89Á\8c¸\8e®)?\r
+\8fæ\8f\9c\8e®             ::= \8d\80 (("*" | "/") \8fæ\8f\9c\8e®)?\r
+\8d\80                 ::= \90\94\92l | \95\8e\9a\97ñ | \95Ï\90\94\96¼ | \8f\88\97\9d\8cn\8aÖ\90\94\8cÄ\82Ñ\8fo\82µ | \8aÖ\90\94\8cÄ\82Ñ\8fo\82µ | "(" \8e® ")" | null | true | false\r
+\8aÖ\90\94\8cÄ\82Ñ\8fo\82µ       ::= \8aÖ\90\94\96¼ "(" (\8e® ("," \8e®)*)? ")"\r
+\8f\88\97\9d\8cn\8aÖ\90\94\8cÄ\82Ñ\8fo\82µ ::= "native" \8aÖ\90\94\96¼ "(" (\8e®  ("," \8e®)*)? ")"\r
+\8aÖ\90\94\96¼             ::= \8e¯\95Ê\8eq\r
+\89¼\88ø\90\94\96¼           ::= \8e¯\95Ê\8eq\r
+\95Ï\90\94\96¼             ::= \8e¯\95Ê\8eq\r
+\8e¯\95Ê\8eq             ::= [a-zA-Z_][a-zA-Z0-9_]*\r
+\90\94\92l               ::= [0-9]+(\.[0-9]+)?\r
+\95\8e\9a\97ñ             ::= "\"" \94C\88Ó\82Ì\95\8e\9a* "\""\r
+                       \82½\82¾\82µ\81A\", \n, \r, \t\82Í\93Á\95Ê\82É\8f\88\97\9d\82·\82é\81B\r
+                       \95\8e\9a\97ñ\92\86\82Å\89ü\8ds\82ð\8ds\82Á\82Ä\82à\97Ç\82¢\81B\r
+\r
+\r
+\r
+Java\82Ì\89\89\8eZ\8eq\97D\90æ\8f\87\88Ê\r
+\8d\82\82¢\81ª . [] ()\r
+       ++ -- ! ~\r
+       new (\83L\83\83\83X\83g)\r
+       * / %\r
+       + -\r
+       << >> >>>\r
+       > >= < <= instanceof\r
+       == !=\r
+       & ^ |\r
+       && ||\r
+       ?:\r
+\92á\82¢\81« = += -= *= /= %= &= ^= |= <<= >>= >>>=\r
+\r
+\r
+\r
+TODO \8a®\91S\82É\83X\83^\83b\83N\83}\83V\83\93\89»\82·\82é\81B\r
+TODO \91g\82Ý\8d\9e\82Ý\8aÖ\90\94\82Ì\8eÀ\91\95\81B\r
+TODO \95¡\90\94\83\\81[\83X\83R\81[\83h\82Ì\8eÀ\91\95\81B\r
+TODO \91S\82Ä\82Ì\89\89\8eZ\8eq\82Ì\8eÀ\91\95\81B\r
+TODO for\95\82Å\82Ì\95Ï\90\94\90é\8c¾\82Ì\8eÀ\91\95\81B\r
+TODO \94z\97ñ\82Ì\8eÀ\91\95\81B\r
+TODO \83g\81[\83N\83\93\82Ì\83\\81[\83X\83R\81[\83h\88Ê\92u\8fî\95ñ\82Ì\95Û\8e\9d\81B\83G\83\89\81[\8e\9e\82É\83\\81[\83X\83R\81[\83h\88Ê\92u\82â\83X\83^\83b\83N\83g\83\8c\81[\83X\82ð\8fo\97Í\82Å\82«\82é\82æ\82¤\82É\81B\r
+TODO \83N\83\89\83X\82Ì\8eÀ\91\95\81B\r
+TODO    \83\81\83\\83b\83h\82Ì\8eÀ\91\95\81B\r
+TODO    \83N\83\89\83X\95Ï\90\94\82Ì\8eÀ\91\95\81B\r
+TODO    \83v\83\8d\83p\83e\83B\82Ì\8eÀ\91\95\81B\r
+TODO    \8cp\8f³\82Ì\8eÀ\91\95\81B\r
+TODO    \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eÀ\91\95\81B\r
+TODO \95\8e\9a\97ñ\82Ì\8a®\91S\82È\8eÀ\91\95\81B\r
+TODO \95Ï\90\94\82â\8e¯\95Ê\8eq\82Ì\8a®\91S\82È\94»\92è\81B\r
+TODO \83\89\83\93\83^\83C\83\80\81E\83N\83\89\83X\82Ì\8eÀ\91\95\81B\r
+TODO \97á\8aO\82Ì\8eÀ\91\95\81B\r
+\r
+\r
+\r
+\83R\83\93\83p\83C\83\8b\82Ì\93®\8dì\81B\r
+1.\82Æ\82è\82 \82¦\82¸\8aÖ\90\94\82ð\97ñ\8b\93\82µ\81A\92è\8b`\8dÏ\82Ý\82Æ\82µ\82Ä\8bL\89¯\82·\82é\81B\r
+2.\8aÖ\90\94\95\94\82ð\8dì\90¬\82·\82é\81B\r
+3.\83O\83\8d\81[\83o\83\8b\95\94\82ð\8dì\90¬\82·\82é\81B\r
+\r
+\r
+\r
+\95Ï\90\94\8aÇ\97\9d\82Ì\8ed\97l\81B\r
+\83O\83\8d\81[\83o\83\8b\95Ï\90\94\82Æ\83\8d\81[\83J\83\8b\95Ï\90\94\81B\r
+\83O\83\8d\81[\83o\83\8b\81A\8by\82Ñ\83\8d\81[\83J\83\8b\95Ï\90\94\82Í\8aÖ\90\94\83X\83R\81[\83v\82Æ\83u\83\8d\83b\83N\81E\83X\83R\81[\83v\82Å\83X\83R\81[\83v\8aÇ\97\9d\82·\82é\81B\r
+\8dÅ\8f\89\82Ì\8aÖ\90\94\83X\83R\81[\83v\82ª\83O\83\8d\81[\83o\83\8b\95Ï\90\94\81A\8dÅ\8cã\82Ì\8aÖ\90\94\83X\83R\81[\83v\82ª\8c»\8dÝ\82Ì\83\8d\81[\83J\83\8b\95Ï\90\94\82ð\8aÇ\97\9d\82·\82é\81B\r
+\95Ï\90\94\90é\8c¾\82Ì\8ed\97l\81B\r
+       \83\8d\81[\83J\83\8b\95Ï\90\94\82Å\8aù\82É\92è\8b`\82³\82ê\82Ä\82¢\82é\82©\81B\r
+               \92è\8b`\82³\82ê\82Ä\82¢\82½\82ç\83G\83\89\81[\81B\r
+\95Ï\90\94\8eæ\93¾\82Ì\8ed\97l\81B\r
+       \83\8d\81[\83J\83\8b\95Ï\90\94\82Å\8aù\82É\92è\8b`\82³\82ê\82Ä\82¢\82é\82©\81B\r
+               \92è\8b`\82³\82ê\82Ä\82¢\82½\82ç\82»\82ê\82ð\95Ô\82·\81B\r
+       \83O\83\8d\81[\83o\83\8b\95Ï\90\94\82Å\8aù\82É\92è\8b`\82³\82ê\82Ä\82¢\82é\82©\81B\r
+               \92è\8b`\82³\82ê\82Ä\82¢\82½\82ç\82»\82ê\82ð\95Ô\82·\81B\r
+       \92è\8b`\82³\82ê\82Ä\82¢\82È\82¯\82ê\82Î\83G\83\89\81[\81B\r
+\95Ï\90\94\82Ì\92è\8b`\8am\94F\81B\r
+       \83\8d\81[\83J\83\8b\95Ï\90\94\82Å\8aù\82É\92è\8b`\82³\82ê\82Ä\82¢\82é\82©\81B\r
+               \92è\8b`\82³\82ê\82Ä\82¢\82½\82çTrue\81B\r
+       \83O\83\8d\81[\83o\83\8b\95Ï\90\94\82Å\8aù\82É\92è\8b`\82³\82ê\82Ä\82¢\82é\82©\81B\r
+               \92è\8b`\82³\82ê\82Ä\82¢\82½\82çTrue\81B\r
+       \92è\8b`\82³\82ê\82Ä\82¢\82È\82¯\82ê\82ÎFalse\81B\r
+\r
+\r
+\r
+\8eÀ\8ds\83R\81[\83h\81E\83t\83@\83C\83\8b\82Ì\8ed\97l\81B\r
+       \83e\83L\83X\83g\82Å\8bL\8fq\82·\82é\81B1\8ds1\96½\97ß\81B\r
+       \r
+       +----------------+----+----------------------------------------------------+\r
+       |\8aÖ\90\94\92è\8b`        |\8bó\8ds|\83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h                                  |\r
+       +----------------+----+----------------------------------------------------+\r
+       \8aÖ\90\94\92è\8b`\81c\8aÖ\90\94\82Ì\96¼\91O\81A\88ø\90\94\82Ì\90\94\81A\83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\82Ì\8aJ\8en\83A\83h\83\8c\83X\82ð\92è\8b`\82·\82é\81B\83\89\83C\83u\83\89\83\8a\82Æ\82µ\82Ä\93Ç\82Ý\8d\9e\82ñ\82¾\82Æ\82«\82Ì\82½\82ß\82É\95K\97v(\83v\83\8d\83O\83\89\83\801\96{\82Ì\82Ý\82È\82ç\82Î\95K\97v\96³\82¢)\81B\r
+       \83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\81c\8dÅ\8f\89\82Í\83O\83\8d\81[\83o\83\8b\81E\83R\81[\83h\81A\8cã\82É\8aÖ\90\94\83R\81[\83h\82ð\8bL\8fq\82·\82é\81B\r
+       \r
+       \8aÖ\90\94\92è\8b`\82Ì\8ed\97l\r
+               (\8aÖ\90\94\96¼),(\88ø\90\94\82Ì\90\94),(\8aJ\8en\83A\83h\83\8c\83X)\r
+               \97á) main,1,123\r
+       \r
+       \83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\95\94\r
+               (\96½\97ß),(\83p\83\89\83\81\81[\83^)*n\r
+               \97á) push value,number|123.456\r
+               \r
+               \88È\89º\82Ì\91\80\8dì\8eè\8f\87\82Í\81AVM\82ª\83R\81[\83h\82ð\94»\92f\82·\82é\82½\82ß\82É\81A\81u1.\83R\81[\83h\82ð\93Ç\82Ý\8d\9e\82Ý\81A\96½\97ß\82ð\94»\92f\82·\82é\81B2.programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\81v\82ð\8aù\82É\8ds\82Á\82Ä\82¢\82é\91O\92ñ\82Æ\82·\82é\81B\r
+               \r
+               push value,(\92l)\r
+                       \8cv\8eZ\83X\83^\83b\83N\82É\92l\82ð\92Ç\89Á\82·\82é\81B\88È\8d~\81A\82±\82Ì\91\80\8dì\82ð\81u\83v\83b\83V\83\85\82·\82é\81v\82Æ\8cÄ\82Ô\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \83R\81[\83h\82ð\93Ç\82Ý\8d\9e\82Ý\81A\8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82·\82é\81B\r
+                       2) stackTopAddress\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+                       3) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               push local variable,(\95Ï\90\94\83A\83h\83\8c\83X)\r
+               push global variable,(\95Ï\90\94\83A\83h\83\8c\83X)\r
+                       \95Ï\90\94\82É\8ai\94[\82³\82ê\82Ä\82¢\82é\92l\82ð\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\81A(\95Ï\90\94\83A\83h\83\8c\83X)\82Ì\92l\82ð\8ai\94[\82·\82é\81B\r
+                       2) stackTopAddress\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+                       3) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               push register,(\83\8c\83W\83X\83^\96¼)\r
+                       \83\8c\83W\83X\83^\82Ì\92l\82ð\83v\83b\83V\83\85\82·\82é\81B\92l\82Ínumber\8c^\82É\82È\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\81A(\83\8c\83W\83X\83^\96¼)\82Ì\92l\82ðnumber\8c^\82Æ\82µ\82Ä\8ai\94[\82·\82é\81B\r
+                       2) stackTopAddress\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+                       3) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               pop local variable,(\95Ï\90\94\83A\83h\83\8c\83X)\r
+               pop global variable,(\95Ï\90\94\83A\83h\83\8c\83X)\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\90æ\93ª\82Ì\92l\82ð\8eæ\93¾\82µ\81A\8cv\8eZ\83X\83^\83b\83N\90æ\92[\83A\83h\83\8c\83X\82ð-1\82·\82é\81B\82±\82Ì\91\80\8dì\82ð\81u\83|\83b\83v\82·\82é\81v\82Æ\8cÄ\82Ô\81B\r
+                       \83|\83b\83v\82µ\81A\83\8d\81[\83J\83\8b\95Ï\90\94\81A\82Ü\82½\82Í\83O\83\8d\81[\83o\83\8b\95Ï\90\94\82É\92l\82ð\8ai\94[\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82³\82ê\82Ä\82¢\82é\92l\82ð\81A(\95Ï\90\94\83A\83h\83\8c\83X)\82É\8ai\94[\82·\82é\81B\r
+                       2) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       3) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               pop register,(\83\8c\83W\83X\83^\96¼)\r
+                       \83|\83b\83v\82µ\81A\83\8c\83W\83X\83^\82É\92l\82ð\8ai\94[\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       0-1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82³\82ê\82Ä\82¢\82é\92l\82ªnumber\8c^\82Å\82Í\82È\82¢\8fê\8d\87\81A\8eÀ\8ds\8e\9e\97á\8aO\82Æ\82·\82é\81B\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82³\82ê\82Ä\82¢\82é\92l\82ð\81A(\83\8c\83W\83X\83^\96¼)\82É\8ai\94[\82·\82é\81B\r
+                       2) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       3) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               pop\r
+                       \83|\83b\83v\82·\82é\82¾\82¯\82Å\81A\92l\82Í\94j\8aü\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       2) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               create frame,(\95Ï\90\94\97Ì\88æ\82Ì\92·\82³),(\88ø\90\94\82Ì\90\94),(\83A\83h\83\8c\83X)\r
+                       \90V\82µ\82¢\8aÖ\90\94\83t\83\8c\81[\83\80\82ð\8dì\90¬\82µ\81A\8eÀ\8ds\8ds\82ð\88Ú\93®\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       TODO\r
+               \r
+               delete frame\r
+                       \8c»\8dÝ\82Ì\8aÖ\90\94\83t\83\8c\81[\83\80\82ð\8dí\8f\9c\82µ\81A\8eÀ\8ds\8ds\82ð\8c³\82É\96ß\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       TODO\r
+               \r
+               goto,(\83A\83h\83\8c\83X)\r
+                       \92P\82É\83v\83\8d\83O\83\89\83\80\81E\83J\83E\83\93\83^\82ð\88Ú\93®\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) programCounter\83\8c\83W\83X\83^\82É(\83A\83h\83\8c\83X)\82ð\8ai\94[\82·\82é\81B\r
+               \r
+               if,(\83A\83h\83\8c\83X)\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð\83|\83b\83v\82µ\81A\90^\82Ì\8fê\8d\87\82Í\8f\88\97\9d\82ð\8cp\91±\81A\8bU\82Ì\8fê\8d\87\82Í\8eÀ\8ds\8ds\82ð\88Ú\93®\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       0-1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ªbool\8c^\82Å\82Í\82È\82¢\8fê\8d\87\81A\8eÀ\8ds\8e\9e\97á\8aO\82Æ\82·\82é\81B\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ªbool|true\82Ì\8fê\8d\87\81AprogramCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+                          \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ªbool|false\82Ì\8fê\8d\87\81AprogramCounter\83\8c\83W\83X\83^\82É(\83A\83h\83\8c\83X)\82ð\8ai\94[\82·\82é\81B\r
+                       2) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+               \r
+               call native function,(\8aÖ\90\94\96¼),(\88ø\90\94\82Ì\90\94)\r
+                       \91g\82Ý\8d\9e\82Ý\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82·\81B\96ß\82è\92l\82Í\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82³\82ê\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       TODO\r
+               \r
+               exit\r
+                       \83v\83\8d\83O\83\89\83\80\82Ì\8eÀ\8ds\82ð\8fI\97¹\82·\82é\81B\82±\82Ì\82Æ\82«\82Ì\8cv\8eZ\83X\83^\83b\83N\82Ì\90æ\93ª\82ª\81A\83v\83\8d\83O\83\89\83\80\82Ì\8fI\97¹\83R\81[\83h\82Æ\82È\82é\81B\82½\82¾\82µ\81A\90\94\92l\88È\8aO\82Ì\8fê\8d\87\82Í1\82Æ\82È\82é\81B\r
+                       \82±\82Ì\83R\81[\83h\82ð\8eÀ\8ds\82µ\82È\82¢\82Æ\8fI\97¹\82µ\82È\82¢\81B\82»\82Ì\82Ü\82Ü\82¾\82Æ\8aÖ\90\94\83R\81[\83h\82ð\8cë\82Á\82Ä\93Ç\82Ý\8d\9e\82ñ\82Å\8eÀ\8ds\82µ\82Ä\82µ\82Ü\82¤\8b°\82ê\82ª\82 \82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ªnumber\8c^\82Å\82Í\82È\82¢\8fê\8d\87\81A\83|\83b\83v\82µ\81Anumber|1\82ð\83v\83b\83V\83\85\82·\82é\81B\r
+                       2) \89¼\91z\83}\83V\83\93\82Ì\8eÀ\8ds\82ð\92â\8e~\82·\82é\81B\r
+               \r
+               add\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð2\82Â\83|\83b\83v\82µ\81A\82»\82ê\82ç\82Ì\89Á\8eZ\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X-1\82Ì\92l\82ð\81Aoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       2) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ð\81Aoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       3) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       4) programCounter\83\8c\83W\83X\83^\82ð+1\82·\82é\81B\r
+               \r
+               subtract\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð2\82Â\83|\83b\83v\82µ\81A\82»\82ê\82ç\82Ì\8c¸\8eZ\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X-1\82Ì\92l\82ð\81Aoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       2) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ð\81Aoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       3) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       3) operand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\8c¸\8eZ\82µ\81A\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82·\82é\81B\r
+               \r
+               multiple\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð2\82Â\83|\83b\83v\82µ\81A\82»\82ê\82ç\82Ì\8fæ\8eZ\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X-1\82Ì\92l\82ð\81Aoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       2) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ð\81Aoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       3) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       3) operand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\8fæ\8eZ\82µ\81A\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82·\82é\81B\r
+               \r
+               divide\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð2\82Â\83|\83b\83v\82µ\81A\82»\82ê\82ç\82Ì\8f\9c\8eZ\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X-1\82Ì\92l\82ð\81Aoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       2) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ð\81Aoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       3) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       3) operand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\8f\9c\8eZ\82µ\81A\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82·\82é\81B\r
+               \r
+               equals\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð2\82Â\83|\83b\83v\82µ\81A\82»\82ê\82ç\82Ì\8f\9c\8eZ\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X-1\82Ì\92l\82ð\81Aoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       2) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ð\81Aoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       3) stackTopAddress\83\8c\83W\83X\83^\82ð-1\82·\82é\81B\r
+                       3) operand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\8f\9c\8eZ\82µ\81A\8c\8b\89Ê\82ð\8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82·\82é\81B\r
+               \r
+               not\r
+                       \8cv\8eZ\83X\83^\83b\83N\82©\82ç\92l\82ð1\82Â\83|\83b\83v\82µ\81A\94Û\92è\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+                       \r
+                       \91\80\8dì\8eè\8f\87\r
+                       1) \8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82Ì\92l\82ð\81Aoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82·\82é\81B\r
+                       1-1) operand1\83\8c\83W\83X\83^\82ªbool\8c^\82Å\82Í\82È\82¢\8fê\8d\87\81A\8eÀ\8ds\8e\9e\83G\83\89\81[\82Æ\82·\82é\81B\r
+                       2) operand1\83\8c\83W\83X\83^\82Ì\8bt\82Ì\92l(true->false\81Afalse->true)\82ð\8cv\8eZ\83X\83^\83b\83N\82ÌstackTopAddress\83\8c\83W\83X\83^\82Ì\83A\83h\83\8c\83X\82É\8ai\94[\82·\82é\81B\r
+               \r
+               greater than\r
+                       \8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81A\8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81Aoperand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\94ä\8ar\82µ\82Ä\81Aoperand1 > operand2\82Å\82 \82ê\82Îbool\8c^\82Ìtrue\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82µ\81A\82»\82¤\82Å\82È\82¯\82ê\82Îbool\8c^\82Ìfalse\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+               \r
+               less than\r
+                       \8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81A\8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81Aoperand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\94ä\8ar\82µ\82Ä\81Aoperand1 < operand2\82Å\82 \82ê\82Îbool\8c^\82Ìtrue\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82µ\81A\82»\82¤\82Å\82È\82¯\82ê\82Îbool\8c^\82Ìfalse\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+               \r
+               and\r
+                       \8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81A\8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81Aoperand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\94ä\8ar\82µ\82Ä\81A\82Æ\82à\82Ébool\8c^\82Ì\93¯\88ê\92l\82Å\82 \82ê\82Îbool\8c^\82Ìtrue\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82µ\81A\82»\82¤\82Å\82È\82¯\82ê\82Îbool\8c^\82Ìfalse\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+               \r
+               or\r
+                       \8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand2\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81A\8cv\8eZ\83X\83^\83b\83N\82ð\83|\83b\83v\82µ\82Äoperand1\83\8c\83W\83X\83^\82Ö\8ai\94[\82µ\81Aoperand1\83\8c\83W\83X\83^\82Æoperand2\83\8c\83W\83X\83^\82ð\94ä\8ar\82µ\82Ä\81A\82Ç\82¿\82ç\82©\82ªbool\8c^\82Ìtrue\82Å\82 \82ê\82Îbool\8c^\82Ìtrue\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82µ\81A\82Ç\82¿\82ç\82àbool\8c^\82Ìfalse\82Å\82 \82ê\82Îbool\8c^\82Ìfalse\92l\82ð\8cv\8eZ\83X\83^\83b\83N\82Ö\83v\83b\83V\83\85\82·\82é\81B\r
+\r
+\r
+\r
+\89¼\91z\83}\83V\83\93\8ed\97l\r
+       VBScript\82Å\93®\82­\81A\82©\82È\82è\83o\83M\81[\82È\89¼\91z\83}\83V\83\93\81B\r
+       \r
+       \83\8c\83W\83X\83^\8ed\97l\r
+               \83\8c\83W\83X\83^\82Í\83\81\83\82\83\8a\82Æ\82Í\95Ê\95¨\82È\82Ì\82Å\81A\95ª\82¯\82Ä\8dl\82¦\82é\81B\r
+               \83X\83^\83b\83N\81E\83}\83V\83\93\82È\82Ì\82Å\81A\83\8c\83W\83X\83^\82Í\8f­\82È\82¢\81B\8bï\91Ì\93I\82É\82Í\81A\88È\89º\82Ì\83\8c\83W\83X\83^\82ð\8eg\97p\82·\82é\81B\r
+               \81EprogramCounter\81c\83v\83\8d\83O\83\89\83\80\81E\83J\83E\83\93\83^\81B\r
+               \81EstackStartAddress\81c\83X\83^\83b\83N\81E\83\81\83\82\83\8a\82Ì\8aJ\8en\83A\83h\83\8c\83X\81B\r
+               \81EstackTopAddress\81c\83X\83^\83b\83N\81E\83\81\83\82\83\8a\82Ì\90æ\92[\83A\83h\83\8c\83X\81B\r
+               \81EframeStartAddress\81c\83t\83\8c\81[\83\80\82Ì\8aJ\8en\83A\83h\83\8c\83X\81B\r
+               \81EvariableLength\81c\95Ï\90\94\97Ì\88æ\82Ì\91å\82«\82³(\8cv\8eZ\83X\83^\83b\83N\82Ì\8aJ\8en\83A\83h\83\8c\83X)\81B\r
+               \81Eoperand1\81c\8cv\8eZ\91æ1\8d\80\81B\r
+               \81Eoperand2\81c\8cv\8eZ\91æ2\8d\80\81B\r
+       \r
+       \83\81\83\82\83\8a\8ed\97l\r
+               VBScript\82Å\93®\82­\82½\82ß\81A\8cv\8eZ\82â\83J\83E\83\93\83^\82Ì\82½\82ß\82É\95Ï\90\94\82ð\82½\82­\82³\82ñ\8am\95Û\82µ\82½\82­\82È\82é\82ª\81A\96Ê\93|\82¾\82¯\82Ç\83}\83V\83\93\82Ì\83\81\83\82\83\8a\82ð\96Í\95í\82µ\82Ä\82Ý\82é\81B\82±\82ê\82Å\82à\82©\82È\82è\83o\83M\81[\82¾\82¯\82Ç\81B\r
+               \r
+               \83\81\83\82\83\8a\82Í\81A\83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\81A\83X\83^\83b\83N\81E\83\81\83\82\83\8a\82Å\8d\\90¬\82³\82ê\82é\81B\8aT\97v\82Í\89º\90}\8eQ\8fÆ\81B\r
+               +------------------------------+------------------------------------------+\r
+               |\83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h            |\83X\83^\83b\83N\81E\83\81\83\82\83\8a                          |\r
+               +------------------------------+------------------------------------------+\r
+               \93à\95\94\93I\82É\82ÍVariant\82Ì\94z\97ñ\82Æ\82µ\82Ä\95\\8c»\82·\82é\81B\90\94\92l\82Å\82à\95\8e\9a\97ñ\82Å\82à\83I\83u\83W\83F\83N\83g\82Å\82à\81A\82±\82Ì\94z\97ñ\82É\8ai\94[\82·\82é\81B\82±\82Ì\82½\82ß\81A\83q\81[\83v\81E\83\81\83\82\83\8a\82ª\91\8dÝ\82µ\82È\82¢\81B\r
+               \94z\97ñ\82Ì1\97v\91f\82ð\81A\82±\82±\82Å\82Í1\83u\83\8d\83b\83N\82Æ\8cÄ\82Ô\81B\r
+               \94z\97ñ\82Í\81A\83v\83\8d\83O\83\89\83\80\8eÀ\8ds\82Ì\8f\89\8aú\82É\8cÅ\92è\92·\82Å\8am\95Û\82µ\82Ä\82µ\82Ü\82¤\81B\82Ü\82½\81A\83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\81A\83X\83^\83b\83N\81E\83\81\83\82\83\8a\82Í\8cÅ\92è\92·\82Å\8a\84\82è\93\96\82Ä\82é\81B\r
+               \83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\81c1\96{\82Ì\83v\83\8d\83O\83\89\83\80\82È\82ç\82Î\82»\82Ì\83R\81[\83h\95ª\82¾\82¯\8am\95Û\82·\82ê\82Î\97Ç\82¢\82ª\81A\83\89\83C\83u\83\89\83\8a\82ð\93®\93I\82É\93Ç\82Ý\8d\9e\82Þ\82±\82Æ\82à\8dl\82¦\82Ä\81A\8cÅ\92è\92·\82ð\91å\82«\82­\8am\95Û\82·\82é\81B\r
+               \83X\83^\83b\83N\81E\83\81\83\82\83\8a\81c1\96{\82Ì\83v\83\8d\83O\83\89\83\80\82È\82ç\8fÁ\94ï\83u\83\8d\83b\83N\82ð\97\\91ª\82·\82é\82±\82Æ\82ª\89Â\94\\82¾\82ª\81A\83\89\83C\83u\83\89\83\8a\82ð\93®\93I\82É\93Ç\82Ý\8d\9e\82Þ\82±\82Æ\82à\8dl\82¦\82Ä\81A\8cÅ\92è\92·\82Å\91å\82«\82­\8am\95Û\82·\82é\81B\r
+               \r
+               \83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\8ed\97l\r
+                       \90æ\92[\82©\82ç\83v\83\8d\83O\83\89\83\80\81E\83R\81[\83h\82ð\8f\87\82É\8ai\94[\82·\82é\81B\83I\83u\83W\83F\83N\83g\81E\83R\81[\83h\81E\83t\83@\83C\83\8b\82©\82ç\93Ç\82Ý\8d\9e\82ñ\82¾\95\8e\9a\97ñ\82ð\95ª\89ð\82µ\82Ä\81A1\97v\91f1\83u\83\8d\83b\83N\82Å\8ai\94[\82·\82é\81B\r
+               \r
+               \83X\83^\83b\83N\81E\83\81\83\82\83\8a\8ed\97l\r
+                       \92ê\81¨                                                                                                        \81¨\90æ\92[\r
+                       +----------------------------------+--------------------------+------------------------+-------------------------+\r
+                       |\83O\83\8d\81[\83o\83\8b\81E\83t\83\8c\81[\83\80              |\8aÖ\90\94\83t\83\8c\81[\83\80              |\8aÖ\90\94\83t\83\8c\81[\83\80            |\8bó\82«\97Ì\88æ                 |\r
+                       +----------------------------------+--------------------------+------------------------+-------------------------+\r
+                       \83O\83\8d\81[\83o\83\8b\81E\83t\83\8c\81[\83\80*1\81A\8aÖ\90\94\83t\83\8c\81[\83\80*n\82Å\8d\\90¬\82³\82ê\82é\81B\r
+                       \93à\95\94\93I\82É\82ÍVariant\82Ì\94z\97ñ\81B\90\94\92l\82Å\82à\95\8e\9a\97ñ\82Å\82à\83I\83u\83W\83F\83N\83g\82Å\82à\81A\82±\82Ì\94z\97ñ\82É\8ai\94[\82·\82é\81B\82±\82Ì\82½\82ß\81A\83q\81[\83v\81E\83\81\83\82\83\8a\82ª\91\8dÝ\82µ\82È\82¢\81B\r
+                       \94z\97ñ\82Ì1\97v\91f\82ð\81A\82±\82±\82Å\82Í1\83u\83\8d\83b\83N\82Æ\8cÄ\82Ô\81B\r
+                       \r
+                       \83O\83\8d\81[\83o\83\8b\81E\83t\83\8c\81[\83\80\r
+                       +------------------+--------------------------------------------------------------------------------+\r
+                       |\83O\83\8d\81[\83o\83\8b\95Ï\90\94\97Ì\88æ|\8cv\8eZ\83X\83^\83b\83N (\96ß\82è\90æ\83A\83h\83\8c\83X) (\83t\83\8c\81[\83\80\8aJ\8en\83A\83h\83\8c\83X) (\95Ï\90\94\97Ì\88æ\82Ì\91å\82«\82³) (\88ø\90\94*n)|\r
+                       +------------------+--------------------------------------------------------------------------------+\r
+                       \83O\83\8d\81[\83o\83\8b\95Ï\90\94\97Ì\88æ\81c\8cÅ\92è\92·\83u\83\8d\83b\83N\81B1\96{\82Ì\83v\83\8d\83O\83\89\83\80\82¾\82¯\82È\82ç\97\\91ª\89Â\94\\82¾\82ª\81A\83\89\83C\83u\83\89\83\8a\82ª\8aÖ\98A\82·\82é\82Æ\97\\91ª\82Å\82«\82È\82¢\81B\r
+                       \8cv\8eZ\83X\83^\83b\83N\81c\89Â\95Ï\92·\83u\83\8d\83b\83N\81B\89Â\95Ï\92·\82Æ\82¢\82¤\82æ\82è\81A\8fã\8cÀ\82ð\8cÀ\8aE\82Ü\82Å\8eg\97p\82Å\82«\82é\81A\82Æ\82¢\82¤\88Ó\96¡\81B\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\82ç\81A\8e\9f\82Ì\83u\83\8d\83b\83N\82©\82ç\82ª\8aÖ\90\94\83t\83\8c\81[\83\80\82É\82È\82é\82©\82ç\81B\r
+                               \8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\82Æ\82«\81A\8cv\8eZ\83X\83^\83b\83N\82Ì\90æ\92[\82É\81A\96ß\82è\90æ\83A\83h\83\8c\83X\81A\83t\83\8c\81[\83\80\8aJ\8en\83A\83h\83\8c\83X\81A\95Ï\90\94\97Ì\88æ\82Ì\91å\82«\82³\81A\88ø\90\94*n\82ª\8ai\94[\82³\82ê\82é\81B\88ø\90\94*n\82Í\8cÄ\82Ñ\90æ\82Ì\8aÖ\90\94\82É\82æ\82Á\82Ä\82·\82®\82É\83|\83b\83v\82³\82ê\82é\81B\83O\83\8d\81[\83o\83\8b\81E\83t\83\8c\81[\83\80\82È\82Ì\82Å\83t\83\8c\81[\83\80\8aJ\8en\83A\83h\83\8c\83X\82Í\8fí\82É0\82¾\82ª\81A\82»\82ê\82Å\96ß\82Á\82½\82Æ\82«\82É\83O\83\8d\81[\83o\83\8b\81E\83t\83\8c\81[\83\80\82Å\82 \82é\82±\82Æ\82ª\95ª\82©\82é\81B\r
+                       \r
+                       \8aÖ\90\94\83t\83\8c\81[\83\80\r
+                       +----------------+--------------------------------------------------------------------------------+\r
+                       |\83\8d\81[\83J\83\8b\95Ï\90\94\97Ì\88æ|\8cv\8eZ\83X\83^\83b\83N (\96ß\82è\90æ\83A\83h\83\8c\83X) (\83t\83\8c\81[\83\80\8aJ\8en\83A\83h\83\8c\83X) (\95Ï\90\94\97Ì\88æ\82Ì\91å\82«\82³) (\88ø\90\94*n)|\r
+                       +----------------+--------------------------------------------------------------------------------+\r
+                       \83\8d\81[\83J\83\8b\95Ï\90\94\97Ì\88æ\81c\8cÅ\92è\92·\83u\83\8d\83b\83N\81B\8aÖ\90\94\93à\82Í\82»\82Ì\8aÖ\90\94\82¾\82¯\82Å\8a®\8c\8b\82µ\82Ä\82¢\82é\82Ì\82Å\81A\82Ç\82Ì\92ö\93x\82Ì\83\8d\81[\83J\83\8b\95Ï\90\94\97Ì\88æ\82ª\95K\97v\82©\8eÀ\8ds\91O\82É\8eZ\8fo\82Å\82«\82é\81B\82»\82Ì\82½\82ß\81A\8cÅ\92è\92·\81B\r
+                       \8cv\8eZ\83X\83^\83b\83N\81c\89Â\95Ï\92·\83u\83\8d\83b\83N\81B\83O\83\8d\81[\83o\83\8b\81E\83t\83\8c\81[\83\80\82Æ\93¯\82\97\9d\97R\81B\r
+                       \r
+                       \92l\82Ì\95\\8c»\r
+                       (\8c^)|(\92l)\r
+                       \97á) string|\82Í\82ë\81[\82í\81[\82é\82Ç\81B\r
+                           number|123.456\r
+                           bool|true\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\97á) \95Ï\90\94\90é\8c¾\81A\8cv\8eZ\r
+       \83\\81[\83X\83R\81[\83h\r
+               var x = 1;\r
+               var y = x * 2 + 1;\r
+               native print(y);\r
+               return 0;\r
+       \r
+       \83I\83u\83W\83F\83N\83g\81E\83R\81[\83h\r
+                       \r
+               1       push value,number|1                  # var x = 1;\r
+               2       pop gloabl variable,1\r
+               3       push global variable,1         # var y = x * 2 + 1;\r
+               4       push value,number|2\r
+               5       multiple\r
+               6       push value,number|1\r
+               7       add\r
+               8       pop global variable,2\r
+               9       push global variable,2         # native print(y);\r
+               10      call native function,print,1\r
+               11      pop\r
+               12      push value,number|0                  # return 0;\r
+               13      exit\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\97á) if\95\r
+       \83\\81[\83X\83R\81[\83h\r
+               var x = 1;\r
+               if (x > 0) {\r
+                       native print("x\82Í0\82æ\82è\91å\82«\82¢\81B");\r
+               } else if (x < 0) {\r
+                       native print("x\82Í0\82æ\82è\8f¬\82³\82¢\81B");\r
+               } else {\r
+                       native print("x\82Í0\81B");\r
+               }\r
+       \r
+       \83\89\83x\83\8b\95t\82«\83I\83u\83W\83F\83N\83g\81E\83R\81[\83h\r
+                       \r
+               1       push value,number|1               # var x = 1;\r
+               2       pop global variable,1\r
+               3       push global variable,1       # if (x > 0) {\r
+               4       push value,number|0\r
+               5       greater than\r
+               6       if,label1\r
+               7       push value,string|x\82Í0\82æ\82è\91å\82«\82¢\81B      # native print("x\82Í0\82æ\82è\91å\82«\82¢\81B");\r
+               8       call native function,print,1\r
+               9       pop\r
+               10      goto,label2\r
+               11      label1\r
+               11      push global variable,1     # } else if (x < 0) {\r
+               12      push value,number|0\r
+               13      less than\r
+               14      if,label3\r
+               15      push value,string|x\82Í0\82æ\82è\8f¬\82³\82¢\81B     # native print("x\82Í0\82æ\82è\8f¬\82³\82¢\81B");\r
+               16      call native function,print,1\r
+               17      pop\r
+               18      goto,label2\r
+               19      label3                        # } else {\r
+               19      push value,string|x\82Í0\81B\r
+               20      call native function,print,1\r
+               21      pop\r
+               22      label2                         # }\r
+               22      push value,number|0\r
+               23      exit\r
+       \r
+       \83I\83u\83W\83F\83N\83g\81E\83R\81[\83h\r
+                       \r
+               1       push,number,1                # var x = 1;\r
+               2       pop-g,1                      # if (x > 0) {\r
+               3       push,global variable,1\r
+               4       push,number,0\r
+               5       greater than\r
+               6       if,11\r
+               7       push,string,x\82Í0\82æ\82è\91å\82«\82¢\81B     # native print("x\82Í0\82æ\82è\91å\82«\82¢\81B");\r
+               8       call native function,print,1\r
+               9       pop\r
+               10      goto,22\r
+               11      push,global variable,1     # } else if (x < 0) {\r
+               12      push,number,0\r
+               13      less than\r
+               14      if,19\r
+               15      push,string,x\82Í0\82æ\82è\8f¬\82³\82¢\81B     # native print("x\82Í0\82æ\82è\8f¬\82³\82¢\81B");\r
+               16      call native function,print,1\r
+               17      pop\r
+               18      goto,22\r
+                                                   # } else {\r
+               19      push,string,x\82Í0\81B          # native print("x\82Í0\81B");\r
+               20      call native function,print,1\r
+               21      pop\r
+                                               # }\r
+               22      push,number,0\r
+               23      exit\r
+\r
+\r
+\r
+\r
+\r
+\r
+\97á)\r
+       \83\\81[\83X\83R\81[\83h\r
+               function add(a, b) {\r
+                       return a + b;\r
+               }\r
+               \r
+               add(1, 2);\r
+       \r
+       \83I\83u\83W\83F\83N\83g\81E\83R\81[\83h\r
+                       add,2,11\r
+                       \r
+               1       set,variableLength,256\r
+               2       push,number,8                      \96ß\82è\90æ\83A\83h\83\8c\83X\r
+               3       push,register,frameStartAddress    \83t\83\8c\81[\83\80\8aJ\8en\83A\83h\83\8c\83X\r
+               4       push,register,variableLength       \95Ï\90\94\97Ì\88æ\82Ì\91å\82«\82³\r
+               5       push,number,1\r
+               6       push,number,2\r
+               7       goto,11                         add\8aÖ\90\94\82Ì\8cÄ\82Ñ\8fo\82µ\r
+               8       pop\r
+               9       push,number,0\r
+               10      exit\r
+               11      set,variableLength,2     \82±\82±\82©\82çadd\8aÖ\90\94\r
+               12      set,frameStartAddress,stackTopAddress\r
+               13      pop,local variable,2\r
+               14      pop,local variable,1\r
+               15      push,local variable,1\r
+               16      push,local variable,2\r
+               17      add\r
+               18      pop register,operand1\r
+               19      pop register,variableLength\r
+               20      pop register,frameStartAddress\r
+               21      return\r