diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 537a9df..13a8618 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -569,7 +569,7 @@ class PushArray : Code override void execute(VM vm) { int[4] index; - for(int i = dim - 1; i >= 0; i--) + for(int i = 0; i < dim; i++) { Value v; vm.pop(v); @@ -636,7 +636,7 @@ class PopGArray : Code throw new TypeMismatch(); } 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; vm.pop(v); diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 1af0360..c832e6f 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -274,14 +274,14 @@ class Compiler { DefineArray var = cast(DefineArray)v; int siz = 0; - foreach_reverse(Expression expr; var.dim) + foreach_reverse(Expression expr; var.dim.expressions) { compileExpression(expr); siz++; if(siz == 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; } } diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index 63577ba..63f5bd8 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -53,9 +53,9 @@ FOR I=0 TO 10 IF I==1 THEN CONTINUE ?I NEXT -VAR V[10] +VAR V[10,10] V[0,1]=12 -?V[1] +?V[0,1] ?\"ABC\"[1][0] GOSUB @A END diff --git a/SMILEBASIC/node.d b/SMILEBASIC/node.d index c05b5f0..f17faba 100644 --- a/SMILEBASIC/node.d +++ b/SMILEBASIC/node.d @@ -325,8 +325,8 @@ class DefineVariable : Statement class DefineArray : Statement { wstring name; - Expression[] dim; - this(wstring name, Expression[] dim) + IndexExpressions dim; + this(wstring name, IndexExpressions dim) { this.type = NodeType.DefineArray; this.name = name; diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index 0a20bca..751b94e 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -649,20 +649,11 @@ class Parser if(token.type == TokenType.LBracket) { lex.popFront(); - Expression[] dim = new Expression[0]; - while(true) - { - expr = expression(); - token = lex.front(); - if(token.type != TokenType.RBracket) - { - syntaxError(); - break; - } - dim ~= expr; - lex.popFront(); - break; - } + auto dim = indexExpressions(); + token = lex.front(); + if(token.type != TokenType.RBracket) + return null; + lex.popFront(); DefineArray ary = new DefineArray(name, dim); return ary; } @@ -872,7 +863,7 @@ class Parser { op.item2 = indexExpressions(); //[演算子 - if(lex.front().type != TokenType.RBracket) syntaxError(); + if(lex.front().type != TokenType.RBracket) return null; lex.popFront(); } else