|
@@ -204,6 +204,8 @@ static DataType cCallFunction(const char* name) {
|
|
|
static DataType cLoadVariable(Variable* v) {
|
|
|
switch(v->type) {
|
|
|
case DT_INT: cAddOperation(OP_LOAD_INT); break;
|
|
|
+ case DT_BOOL: cAddOperation(OP_LOAD_BOOL); break;
|
|
|
+ case DT_FLOAT: cAddOperation(OP_LOAD_FLOAT); break;
|
|
|
default: cError("cannot load type %s", dtGetName(v->type));
|
|
|
}
|
|
|
cAddInt(v->address);
|
|
@@ -216,6 +218,8 @@ static void cStoreVariable(Variable* v, DataType dt, const char* name) {
|
|
|
}
|
|
|
switch(v->type) {
|
|
|
case DT_INT: cAddOperation(OP_STORE_INT); break;
|
|
|
+ case DT_BOOL: cAddOperation(OP_STORE_BOOL); break;
|
|
|
+ case DT_FLOAT: cAddOperation(OP_STORE_FLOAT); break;
|
|
|
default: cError("cannot store type %s", dtGetName(v->type));
|
|
|
}
|
|
|
cAddInt(v->address);
|
|
@@ -268,7 +272,7 @@ static DataType cPrimary() {
|
|
|
Token t = cReadTokenAndLine();
|
|
|
switch(t) {
|
|
|
case T_CONST_INT: cConstantInt(); return DT_INT;
|
|
|
- case T_FLOAT: cConstantFloat(); return DT_FLOAT;
|
|
|
+ case T_CONST_FLOAT: cConstantFloat(); return DT_FLOAT;
|
|
|
case T_TRUE: cAddOperation(OP_PUSH_TRUE); return DT_BOOL;
|
|
|
case T_FALSE: cAddOperation(OP_PUSH_FALSE); return DT_BOOL;
|
|
|
case T_OPEN_BRACKET: return cBracketPrimary();
|
|
@@ -495,10 +499,6 @@ static DataType cExpression() {
|
|
|
return cOr();
|
|
|
}
|
|
|
|
|
|
-static void cSet(Variable* v) {
|
|
|
- cStoreVariable(v, cExpression(), "=");
|
|
|
-}
|
|
|
-
|
|
|
static void cOperationSet(Variable* v, const TypedOp* op) {
|
|
|
DataType a = cLoadVariable(v);
|
|
|
DataType b = cExpression();
|
|
@@ -534,7 +534,7 @@ static void cLineLiteral() {
|
|
|
}
|
|
|
Token t = cReadTokenAndLine();
|
|
|
switch(t) {
|
|
|
- case T_SET: cSet(v); break;
|
|
|
+ case T_SET: cStoreVariable(v, cExpression(), "="); break;
|
|
|
case T_ADD_SET: cOperationSet(v, &TYPED_ADD); break;
|
|
|
case T_SUB_SET: cOperationSet(v, &TYPED_SUB); break;
|
|
|
case T_MUL_SET: cOperationSet(v, &TYPED_MUL); break;
|
|
@@ -593,6 +593,7 @@ static void cReturn() {
|
|
|
switch(dt) {
|
|
|
case DT_INT: cAddReturn(OP_RETURN_INT); break;
|
|
|
case DT_BOOL: cAddReturn(OP_RETURN_BOOL); break;
|
|
|
+ case DT_FLOAT: cAddReturn(OP_RETURN_FLOAT); break;
|
|
|
default: cError("cannot return %s", dtGetName(dt));
|
|
|
}
|
|
|
cConsumeToken(T_SEMICOLON);
|
|
@@ -667,16 +668,16 @@ static void cWhile() {
|
|
|
cConsumeBreaks(breakStart, code->length);
|
|
|
}
|
|
|
|
|
|
-static void cInt() {
|
|
|
+static void cDeclare(DataType dt) {
|
|
|
cConsumeToken(T_LITERAL);
|
|
|
const char* var = cReadString();
|
|
|
Variable* v = vSearchScope(&vars, var);
|
|
|
if(v != NULL) {
|
|
|
cDeclared(var);
|
|
|
}
|
|
|
- v = vAdd(&vars, var, DT_INT);
|
|
|
+ v = vAdd(&vars, var, dt);
|
|
|
cConsumeToken(T_SET);
|
|
|
- cSet(v);
|
|
|
+ cStoreVariable(v, cExpression(), "=");
|
|
|
}
|
|
|
|
|
|
static void cAddPreLineChange(int change, const char* name) {
|
|
@@ -692,7 +693,9 @@ static void cAddPreLineChange(int change, const char* name) {
|
|
|
static void cLineExpression(Token t) {
|
|
|
switch(t) {
|
|
|
case T_LITERAL: cLineLiteral(); break;
|
|
|
- case T_INT: cInt(); break;
|
|
|
+ case T_INT: cDeclare(DT_INT); break;
|
|
|
+ case T_BOOL: cDeclare(DT_BOOL); break;
|
|
|
+ case T_FLOAT: cDeclare(DT_FLOAT); break;
|
|
|
case T_INCREMENT: cAddPreLineChange(1, "++"); break;
|
|
|
case T_DECREMENT: cAddPreLineChange(-1, "--"); break;
|
|
|
default: cUnexpectedToken(t);
|
|
@@ -892,6 +895,7 @@ static void cGlobalScope(Token t) {
|
|
|
case T_VOID: cFunction(DT_VOID); break;
|
|
|
case T_INT: cFunction(DT_INT); break;
|
|
|
case T_BOOL: cFunction(DT_BOOL); break;
|
|
|
+ case T_FLOAT: cFunction(DT_FLOAT); break;
|
|
|
default: cUnexpectedToken(t);
|
|
|
}
|
|
|
}
|