1
0

多次元配列を実�

This commit is contained in:
otya128
2015-06-12 22:00:05 +09:00
parent fd74c8b071
commit f84c4d20e5
5 changed files with 14 additions and 23 deletions

View File

@@ -569,7 +569,7 @@ class PushArray : Code
override void execute(VM vm) override void execute(VM vm)
{ {
int[4] index; int[4] index;
for(int i = dim - 1; i >= 0; i--) for(int i = 0; i < dim; i++)
{ {
Value v; Value v;
vm.pop(v); vm.pop(v);
@@ -636,7 +636,7 @@ class PopGArray : Code
throw new TypeMismatch(); throw new TypeMismatch();
} }
int[4] index; int[4] index;
for(int i = 0; i < dim; i++)//for(int i = dim - 1; i >= 0; i--) for(int i = 0; i < dim; i++)
{ {
Value v; Value v;
vm.pop(v); vm.pop(v);

View File

@@ -274,14 +274,14 @@ class Compiler
{ {
DefineArray var = cast(DefineArray)v; DefineArray var = cast(DefineArray)v;
int siz = 0; int siz = 0;
foreach_reverse(Expression expr; var.dim) foreach_reverse(Expression expr; var.dim.expressions)
{ {
compileExpression(expr); compileExpression(expr);
siz++; siz++;
if(siz == 4) if(siz == 4)
break;//4次元まで(パーサーで除去するけど万が一に備えて break;//4次元まで(パーサーで除去するけど万が一に備えて
} }
genCode(new NewArray(getType(var.name), var.dim.length, defineGlobalVarIndex(var.name))); genCode(new NewArray(getType(var.name), var.dim.expressions.length, defineGlobalVarIndex(var.name)));
continue; continue;
} }
} }

View File

@@ -53,9 +53,9 @@ FOR I=0 TO 10
IF I==1 THEN CONTINUE IF I==1 THEN CONTINUE
?I ?I
NEXT NEXT
VAR V[10] VAR V[10,10]
V[0,1]=12 V[0,1]=12
?V[1] ?V[0,1]
?\"ABC\"[1][0] ?\"ABC\"[1][0]
GOSUB @A GOSUB @A
END END

View File

@@ -325,8 +325,8 @@ class DefineVariable : Statement
class DefineArray : Statement class DefineArray : Statement
{ {
wstring name; wstring name;
Expression[] dim; IndexExpressions dim;
this(wstring name, Expression[] dim) this(wstring name, IndexExpressions dim)
{ {
this.type = NodeType.DefineArray; this.type = NodeType.DefineArray;
this.name = name; this.name = name;

View File

@@ -649,20 +649,11 @@ class Parser
if(token.type == TokenType.LBracket) if(token.type == TokenType.LBracket)
{ {
lex.popFront(); lex.popFront();
Expression[] dim = new Expression[0]; auto dim = indexExpressions();
while(true) token = lex.front();
{ if(token.type != TokenType.RBracket)
expr = expression(); return null;
token = lex.front(); lex.popFront();
if(token.type != TokenType.RBracket)
{
syntaxError();
break;
}
dim ~= expr;
lex.popFront();
break;
}
DefineArray ary = new DefineArray(name, dim); DefineArray ary = new DefineArray(name, dim);
return ary; return ary;
} }
@@ -872,7 +863,7 @@ class Parser
{ {
op.item2 = indexExpressions(); op.item2 = indexExpressions();
//[演算子 //[演算子
if(lex.front().type != TokenType.RBracket) syntaxError(); if(lex.front().type != TokenType.RBracket) return null;
lex.popFront(); lex.popFront();
} }
else else