RESTORE (式)に対応
This commit is contained in:
@@ -1332,6 +1332,26 @@ class RestoreCode : Code
|
||||
return "restore " ~ label.to!string;
|
||||
}
|
||||
}
|
||||
class RestoreExprCode : Code
|
||||
{
|
||||
DataTable datatable;
|
||||
this(DataTable datatable)
|
||||
{
|
||||
this.datatable = datatable;
|
||||
}
|
||||
override void execute(VM vm)
|
||||
{
|
||||
Value label;
|
||||
vm.pop(label);
|
||||
if(!label.isString)
|
||||
throw new TypeMismatch();
|
||||
datatable.dataIndex = datatable.label[label.stringValue];
|
||||
}
|
||||
override string toString(VM vm)
|
||||
{
|
||||
return "restore expr";
|
||||
}
|
||||
}
|
||||
class PushSystemVariable : Code
|
||||
{
|
||||
SystemVariable var;
|
||||
|
||||
@@ -699,6 +699,18 @@ class BuiltinFunction
|
||||
{
|
||||
p.getBG(layer).rot(rot);
|
||||
}
|
||||
static void EFCON()
|
||||
{
|
||||
}
|
||||
static void EFCOFF()
|
||||
{
|
||||
}
|
||||
static void EFCSET(Value[])
|
||||
{
|
||||
}
|
||||
static void EFCWET(Value[])
|
||||
{
|
||||
}
|
||||
//alias void function(PetitComputer, Value[], Value[]) BuiltinFunc;
|
||||
static BuiltinFunction[wstring] builtinFunctions;
|
||||
static this()
|
||||
@@ -1066,7 +1078,6 @@ template AddFuncArg(int L, int N, int M, int O, T, string NAME, P...)
|
||||
}
|
||||
template OutArgsInit(T, string N, int I = 0, int J = 0)
|
||||
{
|
||||
enum tuple = ParameterStorageClassTuple!(__traits(getMember, T, N))[I];
|
||||
alias param = ParameterTypeTuple!(__traits(getMember, T, N));
|
||||
static if(!param.length)
|
||||
{
|
||||
@@ -1074,6 +1085,7 @@ template OutArgsInit(T, string N, int I = 0, int J = 0)
|
||||
}
|
||||
else
|
||||
{
|
||||
enum tuple = ParameterStorageClassTuple!(__traits(getMember, T, N))[I];
|
||||
static if(tuple & ParameterStorageClass.out_)
|
||||
{
|
||||
enum add = 1;
|
||||
|
||||
@@ -847,7 +847,22 @@ class Compiler
|
||||
compileRead(cast(Read)i, s);
|
||||
break;
|
||||
case NodeType.Restore:
|
||||
genCode(new RestoreCodeS((cast(Constant)(cast(Restore)i).label).value.stringValue));
|
||||
{
|
||||
Restore restore = cast(Restore)i;
|
||||
Expression label = restore.label;
|
||||
if(label.type == NodeType.Constant)
|
||||
{
|
||||
Constant cons = cast(Constant)label;
|
||||
if(cons.value.isString)
|
||||
{
|
||||
genCode(new RestoreCodeS(cons.value.stringValue));
|
||||
break;
|
||||
//文字列じゃないならば定数でも実行時エラー
|
||||
}
|
||||
}
|
||||
compileExpression(label, s);
|
||||
genCode(new RestoreExprCode(s.data));
|
||||
}
|
||||
break;
|
||||
case NodeType.On:
|
||||
compileOn(cast(On)i, s);
|
||||
|
||||
@@ -856,10 +856,11 @@ class PetitComputer
|
||||
//とりあえず
|
||||
auto parser = new Parser(
|
||||
//readText("./SYS/GAME6TALK.TXT").to!wstring
|
||||
readText("./SYS/GAME4SHOOTER.TXT").to!wstring
|
||||
//readText("./SYS/GAME2RPG.TXT").to!wstring
|
||||
//readText("./SYS/GAME1DOTRC.TXT").to!wstring
|
||||
//readText(input("LOAD PROGRAM:", true).to!string).to!wstring
|
||||
readText("./SYS/EX8TECDEMO.TXT").to!wstring
|
||||
//readText("./SYS/EX8TECDEMO.TXT").to!wstring
|
||||
//readText("./SYS/EX1TEXT.TXT").to!wstring
|
||||
//readText("FIZZBUZZ.TXT").to!wstring
|
||||
//readText("TEST.TXT").to!wstring
|
||||
|
||||
Reference in New Issue
Block a user