Value => TokenValue
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user