OUT関数を実装, 識別子に数字と_を認識するように修正
This commit is contained in:
@@ -34,6 +34,7 @@ class Function
|
||||
VMVariable[wstring] variable;
|
||||
int[wstring] label;
|
||||
bool returnExpr;
|
||||
int outArgCount;
|
||||
this(int address, wstring name, bool returnExpr, int argCount)
|
||||
{
|
||||
this.address = address;
|
||||
@@ -41,6 +42,10 @@ class Function
|
||||
this.returnExpr = returnExpr;
|
||||
this.argCount = argCount;
|
||||
this.variableIndex = 1;//0,bp,1,pc
|
||||
if(returnExpr)
|
||||
{
|
||||
outArgCount = 1;
|
||||
}
|
||||
}
|
||||
int getLocalVarIndex(wstring name, Compiler c)
|
||||
{
|
||||
@@ -72,6 +77,20 @@ class Function
|
||||
}
|
||||
return var;
|
||||
}
|
||||
int defineLocalVarIndexVoid(wstring name, Compiler c)
|
||||
{
|
||||
int var = this.variable.get(name, VMVariable()).index;
|
||||
if(var == 0)
|
||||
{
|
||||
this.variable[name] = VMVariable(var = ++variableIndex, ValueType.Void);
|
||||
}
|
||||
else
|
||||
{
|
||||
//error:二重定義
|
||||
throw new DuplicateVariable();
|
||||
}
|
||||
return var;
|
||||
}
|
||||
int defineArgumentIndex(wstring name, Compiler c)
|
||||
{
|
||||
int var = this.variable.get(name, VMVariable()).index;
|
||||
@@ -224,7 +243,7 @@ class Compiler
|
||||
{
|
||||
if(sc.func)
|
||||
{
|
||||
return sc.func.defineLocalVarIndex(name, this);
|
||||
return sc.func.defineLocalVarIndexVoid(name, this);
|
||||
}
|
||||
int global = this.global.get(name, VMVariable()).index;
|
||||
if(global == 0)
|
||||
@@ -447,7 +466,16 @@ class Compiler
|
||||
{
|
||||
func.defineArgumentIndex(arg, this);
|
||||
}
|
||||
foreach(wstring arg; node.outArguments)
|
||||
{
|
||||
func.defineLocalVarIndexVoid(arg, this);
|
||||
}
|
||||
if(!func.returnExpr)
|
||||
func.outArgCount = node.outArguments.length;
|
||||
compileStatements(node.functionBody, sc);
|
||||
if(func.returnExpr)
|
||||
genCodeImm(Value(ValueType.Void));
|
||||
genCode(new ReturnFunction(func));
|
||||
skip.address = this.code.length;
|
||||
this.functions[func.name] = func;
|
||||
}
|
||||
@@ -528,8 +556,7 @@ class Compiler
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO:実装中
|
||||
throw new SyntaxError();
|
||||
genCode(new ReturnFunction(s.func));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -564,6 +591,21 @@ class Compiler
|
||||
genCode(new PopArray(getGlobalVarIndex(assign.name), assign.indexExpression.expressions.length, !(s.func is null)));
|
||||
}
|
||||
break;
|
||||
case NodeType.CallFunctionStatement:
|
||||
{
|
||||
auto func = cast(CallFunctionStatement)i;
|
||||
foreach_reverse(Expression j ; func.args)
|
||||
{
|
||||
compileExpression(j, s);
|
||||
}
|
||||
genCode(new CallFunctionCode(func.name, func.args.length, func.outVariable.length));
|
||||
//TODO:OUT
|
||||
foreach_reverse(wstring var; func.outVariable)
|
||||
{
|
||||
genCodePopVar(var, s);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
stderr.writeln("Compile:NotImpl ", i.type);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user