Bladeren bron

improved support for bools and floats

Kajetan Johannes Hammerle 4 jaren geleden
bovenliggende
commit
2f6eb6637c
6 gewijzigde bestanden met toevoegingen van 43 en 13 verwijderingen
  1. 14 10
      Compiler.c
  2. 20 0
      tests/types/types
  3. 3 0
      tests/types/types.out
  4. 3 1
      tokenizer/Token.c
  5. 2 1
      tokenizer/Token.h
  6. 1 1
      tokenizer/Tokenizer.c

+ 14 - 10
Compiler.c

@@ -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);
     }
 }

+ 20 - 0
tests/types/types

@@ -0,0 +1,20 @@
+int intFunction() {
+    return 1;
+}
+
+bool boolFunction() {
+    return true;
+}
+
+float floatFunction() {
+    return 2.0;
+}
+
+void main() {
+    int i = intFunction();
+    print i;
+    bool b = boolFunction();
+    print b;
+    float f = floatFunction();
+    print f;
+}

+ 3 - 0
tests/types/types.out

@@ -0,0 +1,3 @@
+1
+true
+2.00

+ 3 - 1
tokenizer/Token.c

@@ -8,8 +8,9 @@ const char* tGetName(Token token) {
         case T_VOID: return "void";
         case T_INT: return "int";
         case T_BOOL: return "bool";
-        case T_CONST_INT: return "const int";
         case T_FLOAT: return "float";
+        case T_CONST_INT: return "const int";
+        case T_CONST_FLOAT: return "const float";
         case T_TEXT: return "text";
         case T_NULL: return "null";
         case T_TRUE: return "true";
@@ -92,5 +93,6 @@ Token tFromName(const char* name) {
     MATCH_TOKEN("int", T_INT);
     MATCH_TOKEN("void", T_VOID);
     MATCH_TOKEN("bool", T_BOOL);
+    MATCH_TOKEN("float", T_FLOAT);
     return T_END;
 }

+ 2 - 1
tokenizer/Token.h

@@ -5,8 +5,9 @@ typedef enum {
     T_VOID,
     T_INT,
     T_BOOL,
-    T_CONST_INT,
     T_FLOAT,
+    T_CONST_INT,
+    T_CONST_FLOAT,
     T_TEXT,
     T_NULL,
     T_TRUE,

+ 1 - 1
tokenizer/Tokenizer.c

@@ -92,7 +92,7 @@ static bool tParseNumber(int c) {
             tError("invalid float on line %d", line);
             return false;
         }
-        return tAddToken(T_FLOAT) && tAdd(&f, sizeof(float));
+        return tAddToken(T_CONST_FLOAT) && tAdd(&f, sizeof(float));
     } else {
         char* end = NULL;
         long l = strtol(buffer, &end, 10);