1
0

FORを実�

This commit is contained in:
otya128
2015-06-07 13:28:19 +09:00
parent 46b7b2ede3
commit 65fe8558a2
6 changed files with 243 additions and 5 deletions

View File

@@ -17,6 +17,10 @@ class Compiler
int[wstring] global;
int[wstring] globalLabel;
int globalIndex = 0;
void genCode(Code c)
{
code ~= c;
}
void genCodeImm(Value value)
{
code ~= new Push(value);
@@ -43,6 +47,12 @@ class Compiler
code ~= c;
return c;
}
GotoAddr genCodeGoto(int addr)
{
auto c = new GotoAddr(addr);
code ~= c;
return c;
}
GotoTrue genCodeGotoTrue()
{
auto c = new GotoTrue(-1);
@@ -137,6 +147,64 @@ class Compiler
else_.address = code.length;
}
}
void compileFor(For node)
{
compileStatement(node.initExpression);
auto forstart = code.length;
compileExpression(node.stepExpression);
genCodeImm(Value(0));
//step>=0
genCodeOP(TokenType.GreaterEqual);
auto positiveZero = genCodeGotoTrue();//正の値または0
//stepが負の値の時の処理
//toよりcounterが小さい場合はBREAK
//to==counterの時はBREAKしない
//t c
//0>0 false
//FOR I=0 TO -1 STEP -1
//-1>0 false
//1>0 true
/*
genCodeImm(Value("Helloneg\n"));
compileExpression(node.toExpression);
genCodeImm(Value("\nTo\n"));
compileExpression(node.stepExpression);
genCodeImm(Value("Step\n"));
*/
//code ~= new PrintCode(5);
compileExpression(node.toExpression);
genCodePushGlobal(getGlobalVarIndex(node.initExpression.name));
genCodeOP(TokenType.Greater);
auto breakAddr = genCodeGotoTrue();
auto forAddr = genCodeGoto();
positiveZero.address = code.length;
//stepが正の値の時の処理
//toよりcounterが大きい場合はBREAK
//t c
//0<0 false
//1<0 false
//0<1 true break
/*
genCodeImm(Value("HelloPositive\n"));
compileExpression(node.toExpression);
genCodeImm(Value("\nTo\n"));
compileExpression(node.stepExpression);
genCodeImm(Value("Step\n"));
code ~= new PrintCode(5);*/
compileExpression(node.toExpression);
genCodePushGlobal(getGlobalVarIndex(node.initExpression.name));
genCodeOP(TokenType.Less);
genCode(breakAddr);
forAddr.address = code.length;
compileStatements(node.statements);
//counterに加算する
genCodePushGlobal(getGlobalVarIndex(node.initExpression.name));
compileExpression(node.stepExpression);
genCodeOP(TokenType.Plus);
genCodePopGlobal(getGlobalVarIndex(node.initExpression.name));
genCodeGoto(forstart);
breakAddr.address = code.length;
}
void compileStatements(Statements statements)
{
@@ -193,6 +261,9 @@ class Compiler
case NodeType.If:
compileIf(cast(If)i);
break;
case NodeType.For:
compileFor(cast(For)i);
break;
default:
stderr.writeln("Compile:NotImpl ", i.type);
}