/// <summary> /// 構文解析の行われた TopNode に対して、ILコードの発行を行う /// 結果は、Codes に得られる /// </summary> public NakoILCodeList WriteIL() { var writer = new NakoILWriter(); writer.Write(this.topNode); codes = writer.Result; for (int i = 0; i < this.GlobalVar.Count(); i++) //interpreterで使えるように関数定義が保存されている変数をアドレスに変換 { NakoVariable v = this.GlobalVar.GetVar(i); if (v.Body is NakoNodeDefFunction) { NakoVariable setVar = new NakoVariable(); string label = "FUNC_" + ((NakoNodeDefFunction)v.Body).func.name; NakoILCodeList cl = writer.Result; for (int j = 0; j < cl.Count; j++) { NakoILCode c = cl [j]; if (c.value is string && (string)c.value == label) { setVar.SetBody(j, NakoVarType.Int); break; } } this.GlobalVar.SetVar(i, setVar); } } codes.globalVar = this.GlobalVar; return(Codes); }
public void TestArraykeys() { // (1) // (1) codes = ns.WriteIL( "A=``\n" + "A[`a`]=`aaa`\n" + "A[`b`]=`bbb`\n" + "A[`c`]=`ccc`\n" + "(Aの配列ハッシュキー列挙)で反復\n" + " 「***{回数}:{対象}」を継続表示\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:a***2:b***3:c"); codes = ns.WriteIL( "A=``\n" + "A[10]=`aaa`\n" + "A[1]=`bbb`\n" + "A[2]=`ccc`\n" + "(Aの配列ハッシュキー列挙)で反復\n" + " 「***{回数}:{対象}」を継続表示\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:1***2:2***3:10"); }
public void TestAndOr() { NakoCompiler ns = new NakoCompiler(); NakoInterpreter runner = new NakoInterpreter(); NakoILCodeList codes = null; // AND codes = ns.WriteIL( "A=1\n" + "B=2\n" + "C=3\n" + "もし、A==1 && B==1ならば\n" + " PRINT `11`\n" + "もし、A==1 && C==3ならば\n" + " PRINT `13`\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "13"); // or codes = ns.WriteIL( "A=1\n" + "B=2\n" + "C=3\n" + "もし、A==1 || B==1ならば\n" + " PRINT `11`\n" + "もし、A==2 || C==1ならば\n" + " PRINT `13`\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "11"); }
public void TestCallUserFuncInUserFunc() { codes = ns.WriteIL( "●ほげ\n" + " それ=「ふが」\n" + "●ふが\n" + " ほげ" + "\n" + "PRINT ふが\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "ふが"); //ユーザー関数内でユーザー関数を呼び出すと、それまでに定義したローカル変数をリセットしてしまうバグがあったのでテスト追加 codes = ns.WriteIL( "●ほげ(Sで)\n" + " それ=「ほげ」\n" + "●ふが(Sで)\n" + " T=Sでほげ\n" + " それ=S\n" + "\n" + "PRINT `ふが`でふが\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "ふが"); }
public void TestNormal() { // (1) codes = ns.WriteIL("PRINT 1+2*3"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "7"); }
public void TestCallUserFuncInUserFunc() { codes = ns.WriteIL( "●ほげ\n" + " それ=「ふが」\n" + "●ふが\n" + " ほげ" + "\n" + "PRINT ふが\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "ふが"); //ユーザー関数内でユーザー関数を呼び出すと、それまでに定義したローカル変数をリセットしてしまうバグがあったのでテスト追加 codes = ns.WriteIL( "●ほげ(Sで)\n" + " それ=「ほげ」\n" + "●ふが(Sで)\n" + " T=Sでほげ\n" + " それ=S\n" + "\n" + "PRINT `ふが`でふが\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "ふが"); }
public void TestArraykeys() { // (1) // (1) codes = ns.WriteIL( "A=``\n"+ "A[`a`]=`aaa`\n"+ "A[`b`]=`bbb`\n"+ "A[`c`]=`ccc`\n"+ "(Aの配列ハッシュキー列挙)で反復\n"+ " 「***:{対象}」を継続表示\n"+ "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:a***2:b***3:c"); codes = ns.WriteIL( "A=``\n"+ "A[10]=`aaa`\n"+ "A[1]=`bbb`\n"+ "A[2]=`ccc`\n"+ "(Aの配列ハッシュキー列挙)で反復\n"+ " 「***:{対象}」を継続表示\n"+ "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:a***2:b***3:c"); }
public void TestNormal() { // (1) codes = ns.WriteIL("PRINT 1+2*3"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "7"); }
public void TestSysFunc_sub() { codes = ns.WriteIL( "PRINT 5から3を引く\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "2"); }
public void TestCall_likeBASIC4() { // memo: BASICの関数のように関数をコール codes = ns.WriteIL( "1+2に3を足して継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "6"); }
public void TestCall_likeBASIC3() { // memo: BASICの関数のように関数をコール codes = ns.WriteIL( "引く(足す(3,8),4)を継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "7"); }
public void TestSysFunc_subEx() { codes = ns.WriteIL( "A=10;B=3;" + "AからBを引く!\n" + "PRINT A"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "7"); }
public void TestCall_likeBASIC2() { // memo: BASICの関数のように関数をコール codes = ns.WriteIL( "引く(10,4)を継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual("6", runner.PrintLog); }
/// <summary> /// 構文解析の行われた TopNode に対して、ILコードの発行を行う /// 結果は、Codes に得られる /// </summary> public NakoILCodeList WriteIL() { var writer = new NakoILWriter(); writer.Write(this.topNode); codes = writer.Result; codes.globalVar = this.GlobalVar; return(Codes); }
public void TestCall_likeBASIC3() { // memo: BASICの関数のように関数をコール codes = ns.WriteIL( "引く(足す(3,8),4)を継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "7"); }
public void TestCall_likeBASIC2() { // memo: BASICの関数のように関数をコール codes = ns.WriteIL( "引く(10,4)を継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual("6", runner.PrintLog); }
public void Test3_RepeatTimes() { codes = ns.WriteIL( "3回\n" + " PRINT `a`\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "aaa"); }
public void TestFOR1() { codes = ns.WriteIL( "Iを1から5まで繰り返す\n" + " PRINT I\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "12345"); }
public void TestFOR1() { codes = ns.WriteIL( "Iを1から5まで繰り返す\n" + " PRINT I\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "12345"); }
public void Test3_RepeatTimes() { codes = ns.WriteIL( "3回\n" + " PRINT `a`\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "aaa"); }
public void TestSysFunc_AddEx_ByRef() { codes = ns.WriteIL( "A=10;Aに2を足す!\n" + "PRINT A\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "12"); }
public void TestSysFunc_AddAndLet() { codes = ns.WriteIL( "A=10に2を足す\n" + "PRINT A\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "12"); }
public void TestStackCall_noJosi() { // memo: // 敢えて、FORTH っぽく、助詞がなくても動くようにしたい!! codes = ns.WriteIL( "100,10,5,引く,足す,継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual("105", runner.PrintLog); }
public void TestForContinue() { codes = ns.WriteIL( "Iを1から5まで繰り返す\n" + " もし、I=3ならば、続ける。\n" + " PRINT I\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "1245"); }
public void TestFOR2_BREAK() { codes = ns.WriteIL( "Iを1から5まで繰り返す\n" + " PRINT I\n" + " もし、I=3ならば、抜ける。\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "123"); }
public void TestUserFunc_Add2() { codes = ns.WriteIL( "●AにBを加算\n" + " それ=A+B\n" + "\n" + "3に5を加算して、それに8を加算する;PRINT それ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "16"); }
public void TestCalcStr2() { // (7) 「+」は数値同士の加算 codes = ns.WriteIL("PRINT `30`+30"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "60"); // (8) 「&」は文字列同士の加算 codes = ns.WriteIL("PRINT `30`&30"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "3030"); }
public void TestCalcStr2() { // (7) 「+」は数値同士の加算 codes = ns.WriteIL("PRINT `30`+30"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "60"); // (8) 「&」は文字列同士の加算 codes = ns.WriteIL("PRINT `30`&30"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "3030"); }
public void TestCalc2() { // (5) codes = ns.WriteIL("PRINT (1+2)*3"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "9"); // (6) codes = ns.WriteIL("PRINT 2^3"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "8"); }
public void TestRenzokuCalc() { // (1) codes = ns.WriteIL("PRINT 1+2+3+4"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "10"); // (2) codes = ns.WriteIL("PRINT 1*2*3*4"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "24"); }
public void TestCalc2() { // (5) codes = ns.WriteIL("PRINT (1+2)*3"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "9"); // (6) codes = ns.WriteIL("PRINT 2^3"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "8"); }
public void TestSetUserFuncToVariable() { codes = ns.WriteIL( "●関数A (Sの)\n" + " S+10で戻る\n" + "B = 関数Aの定義\n" + "A [`a`]= B\n" + "PRINT A [`a`](10)\n" + "\n"); runner.Run(codes); Assert.AreEqual("20", runner.PrintLog); }
public void TestSetUserFuncWithDefaultValue() { codes = ns.WriteIL( "●関数A ({整数=10}Sの)\n" + " S+10で戻る\n" + "B = 関数Aの定義\n" + "A [`a`]= B\n" + "PRINT A [`a`]()\n" + "\n"); runner.Run(codes); Assert.AreEqual("20", runner.PrintLog); }
/// <summary> /// constructor /// </summary> /// <param name="list"></param> public NakoInterpreter(NakoILCodeList list) { this.UseConsoleOut = false; this.debugMode = false; Reset(); this.list = list; if (list.globalVar != null) { this.globalVar = list.globalVar; } this.exceptionTable = new NakoExceptionTable(); }
public void TestCallUserFuncAndCheckGlobalVar() { codes = ns.WriteIL( "●ほげ\n" + " A=「ふが」\n" + " Aで戻る\n" + "A=`hoge`\n" + "B = ほげ\n" + "PRINT A\n" + "\n"); runner.Run(codes); Assert.AreEqual("hoge", runner.PrintLog); }
public void Test2_Nest() { codes = ns.WriteIL( "Iを1から2まで繰り返す\n" + " PRINT `[`&I&`:`\n" + " Jを1から3まで繰り返す\n" + " PRINT J\n" + " PRINT `]`\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "[1:123][2:123]"); }
public void Test2_Nest() { codes = ns.WriteIL( "Iを1から2まで繰り返す\n" + " PRINT `[`&I&`:`\n" + " Jを1から3まで繰り返す\n" + " PRINT J\n" + " PRINT `]`\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "[1:123][2:123]"); }
public void TestCallUserFuncWithUserFuncParameter() { codes = ns.WriteIL( "●マップ (Sを{ 関数 (1)}Fで)\n" + " R = F (S)\n" + " Rで戻る\n" + "●関数A (Sの)\n" + " S+10で戻る\n" + "RET = マップ (10, 関数Aの定義)\n" + "PRINT RET\n" + "\n"); runner.Run(codes); Assert.AreEqual("20", runner.PrintLog); }
public void TestUserFunc_Multi() { codes = ns.WriteIL( "●ほげ\n" + " それ=「ふが」\n" + "●ほぎゃ\n" + " それ=「bar」" + "\n" + "PRINT ほげ\n" + "PRINT ほぎゃ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "ふがbar"); }
public void TestUserFunc_Add3() { codes = ns.WriteIL( "\n\n●AにBを加算\n" + " それ=A+B\n" + "\n" + "●AにBをKAKERU\n" + " それ=A*B\n" + "\n" + "3に5をKAKERU;PRINT それ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "15"); }
public void TestInclude() { // (1) codes = ns.WriteIL( @" `test.nako`を取り込む a[`a`]=`aaa` a[`b`]=`bbb` a[`c`]=`ccc` aで反復 「***{回数}:{対象}」を継続表示 "); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:ddd***2:eee***3:fff***4:aaa***5:bbb***6:ccc"); }
public void TestCalcStr() { // (2) codes = ns.WriteIL("PRINT `abc`&`def`"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "abcdef"); // (3) codes = ns.WriteIL("PRINT 10 + 20 & `a`"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "30a"); // (4) System.Diagnostics.Debug.WriteLine(Libnako.JPNCompiler.Tokenizer.NakoTokenization.Tokenize("PRINT 10 * 20 & `a`").toTypeString()); codes = ns.WriteIL("PRINT 10 * 20 & `a`"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "200a"); }
public void Test1_Normal() { // (1) codes = ns.WriteIL( "Iを1から3まで繰り返す\n"+ " PRINT I\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "123"); // (2) codes = ns.WriteIL( "FROM=2;TO=5"+ "IをFROMからTOまで繰り返す\n" + " PRINT I\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "2345"); }
public void Test1_Normal() { // (1) codes = ns.WriteIL( "A[0] = `aaa`\n"+ "A[1] = `bbb`\n"+ "A[2] = `ccc`\n"+ "Aを反復\n"+ " PRINT 「***{回数}:{対象}」" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:aaa***2:bbb***3:ccc"); codes = ns.WriteIL( "A[0] = `aaa`\n"+ "A[1] = `bbb`\n"+ "A[2] = `ccc`\n"+ "Aを反復\n"+ " PRINT 「***{回数}:{対象}」" + " 続ける" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "***1:aaa***2:bbb***3:ccc"); }
public void TestCall_likeBASIC4() { // memo: BASICの関数のように関数をコール codes = ns.WriteIL( "1+2に3を足して継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "6"); }
public void TestSysFunc_AddAndLet() { codes = ns.WriteIL( "A=10に2を足す\n"+ "PRINT A\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "12"); }
/// <summary> /// 構文解析の行われた TopNode に対して、ILコードの発行を行う /// 結果は、Codes に得られる /// </summary> public NakoILCodeList WriteIL() { var writer = new NakoILWriter(); writer.Write(this.topNode); codes = writer.Result; codes.globalVar = this.GlobalVar; return Codes; }
/// <summary> /// 初期化 /// </summary> public void Init() { this.result = new NakoILCodeList(); this.labels = new Dictionary<NakoILCode, long>(); this.exceptions = new Dictionary<String,NakoILCode>(); }
public void TestSysFunc_AddEx_ByRef() { codes = ns.WriteIL( "A=10;Aに2を足す!\n" + "PRINT A\n" + "" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "12"); }
/// <summary> /// constructor /// </summary> /// <param name="list"></param> public NakoInterpreter(NakoILCodeList list) { this.UseConsoleOut = false; this.debugMode = false; Reset(); this.list = list; if (list.globalVar != null) { this.globalVar = list.globalVar; } this.exceptionTable = new NakoExceptionTable (); }
public void TestFOR2_BREAK() { codes = ns.WriteIL( "Iを1から5まで繰り返す\n" + " PRINT I\n" + " もし、I=3ならば、抜ける。\n" + "\n" ); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "123"); }
public void TestSysFunc_sub() { codes = ns.WriteIL( "PRINT 5から3を引く\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "2"); }
/// <summary> /// ILコードを実行する /// </summary> /// <param name="list">実行するILコードリスト</param> /// <returns>実行が成功したかどうか</returns> public bool Run(NakoILCodeList list) { if (list != null) { Reset(); this.list = list; if (list.globalVar != null) { this.globalVar = list.globalVar; } this.exceptionTable = new NakoExceptionTable (); } runpos = 0; bool result = _run(); FinPlugins(); return result; }
public void TestUserFunc_Add2() { codes = ns.WriteIL( "●AにBを加算\n" + " それ=A+B\n" + "\n" + "3に5を加算して、それに8を加算する;PRINT それ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "16"); }
public void TestSysFunc_subEx() { codes = ns.WriteIL( "A=10;B=3;" + "AからBを引く!\n" + "PRINT A"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "7"); }
public void TestStackCall_noJosi() { // memo: // 敢えて、FORTH っぽく、助詞がなくても動くようにしたい!! codes = ns.WriteIL( "100,10,5,引く,足す,継続表示\n" + "\n"); runner.Run(codes); Assert.AreEqual("105",runner.PrintLog); }
public void TestUserFunc_Add3() { codes = ns.WriteIL( "\n\n●AにBを加算\n" + " それ=A+B\n" + "\n" + "●AにBをKAKERU\n" + " それ=A*B\n" + "\n" + "3に5をKAKERU;PRINT それ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "15"); }
public void TestRenzokuCalc() { // (1) codes = ns.WriteIL("PRINT 1+2+3+4"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "10"); // (2) codes = ns.WriteIL("PRINT 1*2*3*4"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "24"); }
public void TestUserFunc_Multi() { codes = ns.WriteIL( "●ほげ\n" + " それ=「ふが」\n" + "●ほぎゃ\n" + " それ=「bar」" + "\n" + "PRINT ほげ\n" + "PRINT ほぎゃ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "ふがbar"); }
public void TestUserFunc_Ret() { runner.Run(ns.WriteIL( "●ほげ\n" + " それ=「ふが」" + " 戻る" + " それ=「ぴよ」" + "\n" + "PRINT ほげ\n" + "\n")); Assert.AreEqual(runner.PrintLog, "ふが"); codes = ns.WriteIL( "●ほげ\n" + " それ=「ふが」" + " 「bar」で戻る" + " それ=「ぴよ」" + "\n" + "PRINT ほげ\n" + "\n"); runner.Run(codes); Assert.AreEqual(runner.PrintLog, "bar"); }