From 311045afce64d7216151a5df032d29d8702aceaf Mon Sep 17 00:00:00 2001 From: otya128 Date: Sun, 7 Jun 2015 13:56:30 +0900 Subject: [PATCH] =?UTF-8?q?=E6=BC=94=E7=AE=97=E5=AD=90=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SMILEBASIC/VM.d | 83 +++++++++++++++++++++++++++++++++++++++++++++ SMILEBASIC/main.d | 1 + SMILEBASIC/parser.d | 11 ++++-- 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index a9048ee..18690e3 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -31,6 +31,10 @@ class VM { stack[stacki++] = value; } + void push(Value value) + { + stack[stacki++] = value; + } void pop(out Value value) { if(stacki <= 0) @@ -150,6 +154,73 @@ class Operate : Code Value r; vm.pop(r); vm.pop(l); + if(l.type == ValueType.String) + { + wstring ls = l.stringValue; + if(r.type == ValueType.String) + { + wstring rs = r.stringValue; + switch(operator) + { + case TokenType.Plus: + vm.push(Value(ls ~ rs)); + return; + case TokenType.Equal: + vm.push(Value(ls == rs)); + return; + case TokenType.NotEqual: + vm.push(Value(ls != rs)); + return; + case TokenType.Less: + vm.push(Value(ls < rs)); + return; + case TokenType.LessEqual: + vm.push(Value(ls <= rs)); + return; + case TokenType.Greater: + vm.push(Value(ls > rs)); + return; + case TokenType.GreaterEqual: + vm.push(Value(ls >= rs)); + return; + default: + //type missmatch + stderr.writeln("Type missmatch"); + return; + } + } + if(r.type == ValueType.Integer || r.type == ValueType.Double) + { + double rd = r.integerValue; + switch(operator) + { + //数値 * 文字列だとエラー + case TokenType.Mul: + { + wstring delegate(wstring x, wstring y, int num) mul; + mul = (x, y, z) => z > 0 ? x ~ mul(x , y, z - 1) : ""; + vm.push(Value(mul(ls, ls, cast(int)rd))); + } + return; + //3.1から?文字列と数値を比較すると3を返す + //(数値 compare 文字列だとエラー) + case TokenType.Equal: + case TokenType.NotEqual: + case TokenType.Less: + case TokenType.LessEqual: + case TokenType.Greater: + case TokenType.GreaterEqual: + vm.push(Value(3)); + return; + default: + //type missmatch + stderr.writeln("Type missmatch"); + return; + } + } + } + int li = l.integerValue; + int ri = r.integerValue; double ld = l.integerValue; double rd = r.integerValue; //とりあえずInteger @@ -167,6 +238,18 @@ class Operate : Code case TokenType.Div: ld /= rd; break; + case TokenType.Mod: + ld %= rd; + break; + case TokenType.And: + ld = li & ri; + break; + case TokenType.Or: + ld = li | ri; + break; + case TokenType.Xor: + ld = li ^ ri; + break; case TokenType.Equal: ld = ld == rd; break; diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index 1a64247..159f257 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -23,6 +23,7 @@ FOR I=-2 TO -9 STEP -2 NEXT ?I ?\"Hello, World!!\" +?\"A\"*4 "); auto vm = parser.compile(); vm.run(); diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index c51f544..0f3da9d 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -47,6 +47,7 @@ class Lexical reserved["ENDIF"] = TokenType.Endif; reserved["FOR"] = TokenType.For; reserved["NEXT"] = TokenType.Next; + reserved["MOD"] = TokenType.Mod; reserved.rehash(); line = 1; } @@ -258,8 +259,13 @@ class Parser case TokenType.Or: case TokenType.Xor: return 7;//AND,OR,XOR - -// return 6;//==,!=,<,<=,>,>= + case TokenType.Equal: + case TokenType.NotEqual: + case TokenType.Less: + case TokenType.LessEqual: + case TokenType.Greater: + case TokenType.GreaterEqual: + return 6;//==,!=,<,<=,>,>= // return 5;//<<,>> case TokenType.Plus: @@ -267,6 +273,7 @@ class Parser return 4;//+,-(bin) case TokenType.Mul: case TokenType.Div: + case TokenType.Mod: return 3;//*,/,DIV,MOD // return 2;//-,NOT,! // return 1;//()