1
0

演算子を追加

This commit is contained in:
otya128
2015-06-07 13:56:30 +09:00
parent 47de1d20bd
commit 311045afce
3 changed files with 93 additions and 2 deletions

View File

@@ -31,6 +31,10 @@ class VM
{ {
stack[stacki++] = value; stack[stacki++] = value;
} }
void push(Value value)
{
stack[stacki++] = value;
}
void pop(out Value value) void pop(out Value value)
{ {
if(stacki <= 0) if(stacki <= 0)
@@ -150,6 +154,73 @@ class Operate : Code
Value r; Value r;
vm.pop(r); vm.pop(r);
vm.pop(l); 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 ld = l.integerValue;
double rd = r.integerValue; double rd = r.integerValue;
//とりあえずInteger //とりあえずInteger
@@ -167,6 +238,18 @@ class Operate : Code
case TokenType.Div: case TokenType.Div:
ld /= rd; ld /= rd;
break; 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: case TokenType.Equal:
ld = ld == rd; ld = ld == rd;
break; break;

View File

@@ -23,6 +23,7 @@ FOR I=-2 TO -9 STEP -2
NEXT NEXT
?I ?I
?\"Hello, World!!\" ?\"Hello, World!!\"
?\"A\"*4
"); ");
auto vm = parser.compile(); auto vm = parser.compile();
vm.run(); vm.run();

View File

@@ -47,6 +47,7 @@ class Lexical
reserved["ENDIF"] = TokenType.Endif; reserved["ENDIF"] = TokenType.Endif;
reserved["FOR"] = TokenType.For; reserved["FOR"] = TokenType.For;
reserved["NEXT"] = TokenType.Next; reserved["NEXT"] = TokenType.Next;
reserved["MOD"] = TokenType.Mod;
reserved.rehash(); reserved.rehash();
line = 1; line = 1;
} }
@@ -258,8 +259,13 @@ class Parser
case TokenType.Or: case TokenType.Or:
case TokenType.Xor: case TokenType.Xor:
return 7;//AND,OR,XOR return 7;//AND,OR,XOR
case TokenType.Equal:
// return 6;//==,!=,<,<=,>,>= case TokenType.NotEqual:
case TokenType.Less:
case TokenType.LessEqual:
case TokenType.Greater:
case TokenType.GreaterEqual:
return 6;//==,!=,<,<=,>,>=
// return 5;//<<,>> // return 5;//<<,>>
case TokenType.Plus: case TokenType.Plus:
@@ -267,6 +273,7 @@ class Parser
return 4;//+,-(bin) return 4;//+,-(bin)
case TokenType.Mul: case TokenType.Mul:
case TokenType.Div: case TokenType.Div:
case TokenType.Mod:
return 3;//*,/,DIV,MOD return 3;//*,/,DIV,MOD
// return 2;//-,NOT,! // return 2;//-,NOT,!
// return 1;//() // return 1;//()