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;
}
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;

View File

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

View File

@@ -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;//()