1
0

Value => TokenValue

This commit is contained in:
otya128
2016-12-17 11:55:07 +09:00
parent 84a82d1336
commit f54b00549e
4 changed files with 164 additions and 28 deletions

View File

@@ -1,5 +1,6 @@
module otya.smilebasic.token;
import otya.smilebasic.type;
import std.exception;
enum TokenType
{
Unknown,
@@ -77,11 +78,142 @@ enum TokenType
Constant,
}
enum TokenValueType
{
integer,
double_,
string_
}
struct TokenValue
{
TokenValueType type;
private union
{
int integer;
wstring string_;
double double_;
}
ref integerValue()
{
enforce(type == TokenValueType.integer);
return integer;
}
int integerValue(int val)
{
enforce(type == TokenValueType.integer);
return integer = val;
}
ref stringValue()
{
enforce(type == TokenValueType.string_);
return string_;
}
wstring stringValue(wstring val)
{
enforce(type == TokenValueType.string_);
return string_ = val;
}
ref doubleValue()
{
enforce(type == TokenValueType.double_);
return double_;
}
double doubleValue(double val)
{
enforce(type == TokenValueType.double_);
return double_ = val;
}
int castInteger()
{
switch (type)
{
case TokenValueType.integer:
return integer;
case TokenValueType.double_:
return cast(int)double_;
default:
assert(false);
}
}
double castDouble()
{
switch (type)
{
case TokenValueType.integer:
return integer;
case TokenValueType.double_:
return double_;
default:
assert(false);
}
}
wstring castString()
{
switch (type)
{
case TokenValueType.string_:
return string_;
default:
assert(false);
}
}
bool isNumber()
{
switch (type)
{
case TokenValueType.integer:
case TokenValueType.double_:
return true;
default:
return false;
}
}
bool isString()
{
switch (type)
{
case TokenValueType.string_:
return true;
default:
return false;
}
}
this(int v)
{
type = TokenValueType.integer;
integer = v;
}
this(wstring v)
{
type = TokenValueType.string_;
string_ = v;
}
this(double v)
{
type = TokenValueType.double_;
double_ = v;
}
Value toSBImm()
{
switch (type)
{
case TokenValueType.integer:
return Value(integer);
case TokenValueType.string_:
return Value(string_);
case TokenValueType.double_:
return Value(double_);
default:
assert(false);
}
}
}
struct Token
{
TokenType type;
Value value;
this(TokenType t, Value v)
TokenValue value;
this(TokenType t, TokenValue v)
{
type = t;
value = v;