|
@@ -221,7 +221,12 @@ static void cStoreVariable(Variable* v, DataType dt, const char* name) {
|
|
case DT_INT: cAddOperation(OP_STORE_INT); break;
|
|
case DT_INT: cAddOperation(OP_STORE_INT); break;
|
|
case DT_BOOL: cAddOperation(OP_STORE_BOOL); break;
|
|
case DT_BOOL: cAddOperation(OP_STORE_BOOL); break;
|
|
case DT_FLOAT: cAddOperation(OP_STORE_FLOAT); break;
|
|
case DT_FLOAT: cAddOperation(OP_STORE_FLOAT); break;
|
|
- default: cError("cannot store type %s", dtGetName(v->type));
|
|
|
|
|
|
+ default:
|
|
|
|
+ if(dtIsArray(v->type)) {
|
|
|
|
+ cAddOperation(OP_STORE_ARRAY);
|
|
|
|
+ } else {
|
|
|
|
+ cError("cannot store type %s", dtGetName(v->type));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
cAddInt(v->address);
|
|
cAddInt(v->address);
|
|
}
|
|
}
|
|
@@ -269,6 +274,17 @@ static DataType cBracketPrimary() {
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static DataType cAllocArray(DataType dt, Operation op) {
|
|
|
|
+ cConsumeToken(T_OPEN_SQUARE_BRACKET);
|
|
|
|
+ DataType index = cExpression();
|
|
|
|
+ if(index != DT_INT) {
|
|
|
|
+ cError("array size must be an int");
|
|
|
|
+ }
|
|
|
|
+ cConsumeToken(T_CLOSE_SQUARE_BRACKET);
|
|
|
|
+ cAddOperation(op);
|
|
|
|
+ return dtArray(dt, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
static DataType cPrimary() {
|
|
static DataType cPrimary() {
|
|
Token t = cReadTokenAndLine();
|
|
Token t = cReadTokenAndLine();
|
|
switch(t) {
|
|
switch(t) {
|
|
@@ -278,6 +294,7 @@ static DataType cPrimary() {
|
|
case T_FALSE: cAddOperation(OP_PUSH_FALSE); return DT_BOOL;
|
|
case T_FALSE: cAddOperation(OP_PUSH_FALSE); return DT_BOOL;
|
|
case T_OPEN_BRACKET: return cBracketPrimary();
|
|
case T_OPEN_BRACKET: return cBracketPrimary();
|
|
case T_LITERAL: return cLiteral();
|
|
case T_LITERAL: return cLiteral();
|
|
|
|
+ case T_INT: return cAllocArray(DT_INT, OP_INT_ARRAY);
|
|
default: cUnexpectedToken(t); return DT_VOID;
|
|
default: cUnexpectedToken(t); return DT_VOID;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -670,7 +687,19 @@ static void cWhile() {
|
|
cConsumeBreaks(breakStart, code->length);
|
|
cConsumeBreaks(breakStart, code->length);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static DataType cDimension(DataType dt) {
|
|
|
|
+ int dimension = 0;
|
|
|
|
+ while(cConsumeTokenIf(T_MUL)) {
|
|
|
|
+ dimension++;
|
|
|
|
+ }
|
|
|
|
+ if(dimension > 0) {
|
|
|
|
+ dt = dtArray(dt, dimension);
|
|
|
|
+ }
|
|
|
|
+ return dt;
|
|
|
|
+}
|
|
|
|
+
|
|
static void cDeclare(DataType dt) {
|
|
static void cDeclare(DataType dt) {
|
|
|
|
+ dt = cDimension(dt);
|
|
cConsumeToken(T_LITERAL);
|
|
cConsumeToken(T_LITERAL);
|
|
const char* var = cReadString();
|
|
const char* var = cReadString();
|
|
Variable* v = vSearchScope(&vars, var);
|
|
Variable* v = vSearchScope(&vars, var);
|