1
0

配列代入の構文解析を実装,配列宣言,配列参照を実装

This commit is contained in:
otya128
2015-06-12 20:25:53 +09:00
parent c050d4e066
commit 61020e9941
6 changed files with 225 additions and 14 deletions

View File

@@ -20,6 +20,21 @@ class Scope
}
class Compiler
{
ValueType getType(wstring name)
{
wchar s = name[name.length - 1];
switch(s)
{
case '$':
return ValueType.String;
case '#':
return ValueType.Double;
case '%':
return ValueType.Integer;
default:
return ValueType.Integer;//DEFINT時
}
}
Statements statements;
this(Statements statements)
{
@@ -219,7 +234,33 @@ class Compiler
breakAddr.address = code.length;
s.breakAddr.address = code.length;
}
void compileVar(Var node, Scope sc)
{
foreach(Statement v ; node.define)
{
if(v.type == NodeType.DefineVariable)
{
DefineVariable var = cast(DefineVariable)v;
//TODO:local variable
defineGlobalVarIndex(var.name);
continue;
}
if(v.type == NodeType.DefineArray)
{
DefineArray var = cast(DefineArray)v;
int siz = 0;
foreach_reverse(Expression expr; var.dim)
{
compileExpression(expr);
siz++;
if(siz == 4)
break;//4次元まで(パーサーで除去するけど万が一に備えて
}
genCode(new NewArray(getType(var.name), var.dim.length, defineGlobalVarIndex(var.name)));
continue;
}
}
}
void compileStatements(Statements statements, Scope sc)
{
foreach(Statement s ; statements.statements)
@@ -314,6 +355,9 @@ class Compiler
}
genCode(s.continueAddr);
break;
case NodeType.Var:
compileVar(cast(Var)i, s);
break;
default:
stderr.writeln("Compile:NotImpl ", i.type);
}