Kajetan Johannes Hammerle před 3 roky
rodič
revize
92b0d19b0a
9 změnil soubory, kde provedl 46 přidání a 3 odebrání
  1. 4 0
      Compiler.c
  2. 1 1
      Object.h
  3. 10 1
      Operation.h
  4. 7 0
      Script.c
  5. 1 0
      Test.c
  6. 6 0
      Tokenizer.c
  7. 13 1
      Tokenizer.h
  8. 2 0
      tests/types/bool
  9. 2 0
      tests/types/bool.out

+ 4 - 0
Compiler.c

@@ -71,6 +71,10 @@ static bool cPrimary() {
         return tReadInt(&value) && cAddOperation(OP_PUSH_INT) && cAddBytes(&value, sizeof(int));
     } else if(cConsumeTokenIf(T_NULL)) {
         return cAddOperation(OP_PUSH_NULL);
+    } else if(cConsumeTokenIf(T_TRUE)) {
+        return cAddOperation(OP_PUSH_TRUE);
+    } else if(cConsumeTokenIf(T_FALSE)) {
+        return cAddOperation(OP_PUSH_FALSE);
     } else if(cConsumeTokenIf(T_OPEN_BRACKET)) {
         return cExpression() && cConsumeToken(T_CLOSE_BRACKET);
     }

+ 1 - 1
Object.h

@@ -1,7 +1,7 @@
 #ifndef OBJECT_H
 #define OBJECT_H
 
-typedef enum ObjectType { OT_INT, OT_NULL } ObjectType;
+typedef enum ObjectType { OT_INT, OT_NULL, OT_BOOL } ObjectType;
 
 typedef struct Object {
     ObjectType type;

+ 10 - 1
Operation.h

@@ -1,6 +1,15 @@
 #ifndef OPERATION_H
 #define OPERATION_H
 
-typedef enum Operation { OP_NOTHING, OP_PUSH_INT, OP_PUSH_NULL, OP_ADD, OP_MUL, OP_PRINT } Operation;
+typedef enum Operation {
+    OP_NOTHING,
+    OP_PUSH_INT,
+    OP_PUSH_NULL,
+    OP_PUSH_TRUE,
+    OP_PUSH_FALSE,
+    OP_ADD,
+    OP_MUL,
+    OP_PRINT
+} Operation;
 
 #endif

+ 7 - 0
Script.c

@@ -76,6 +76,11 @@ static void sPushNull(Script* sc) {
     sPush(sc, &o);
 }
 
+static void sPushBool(Script* sc, bool b) {
+    Object o = {.type = OT_BOOL, .data.intValue = b};
+    sPush(sc, &o);
+}
+
 static void sIntBinary(Script* sc, int (*f)(int, int)) {
     Object a;
     if(sPop(sc, &a)) {
@@ -116,6 +121,8 @@ static void sConsumeInstruction(Script* sc) {
         case OP_NOTHING: break;
         case OP_PUSH_INT: sPushInt(sc); break;
         case OP_PUSH_NULL: sPushNull(sc); break;
+        case OP_PUSH_TRUE: sPushBool(sc, true); break;
+        case OP_PUSH_FALSE: sPushBool(sc, false); break;
         case OP_ADD: sIntBinary(sc, sIntAdd); break;
         case OP_MUL: sIntBinary(sc, sIntMul); break;
         case OP_PRINT: sPrint(sc); break;

+ 1 - 0
Test.c

@@ -37,6 +37,7 @@ static bool tsPrinter(Object* o) {
     switch(o->type) {
         case OT_INT: tsPrintToBuffer("%d\n", o->data.intValue); return false;
         case OT_NULL: tsPrintToBuffer("null\n"); return false;
+        case OT_BOOL: tsPrintToBuffer(o->data.intValue ? "true\n" : "false\n"); return false;
     }
     return true;
 }

+ 6 - 0
Tokenizer.c

@@ -71,6 +71,10 @@ static bool tParseLiteral(int c) {
         return tAddToken(T_PRINT);
     } else if(strcmp(buffer, "null") == 0) {
         return tAddToken(T_NULL);
+    } else if(strcmp(buffer, "true") == 0) {
+        return tAddToken(T_TRUE);
+    } else if(strcmp(buffer, "false") == 0) {
+        return tAddToken(T_FALSE);
     }
     return true;
 }
@@ -158,6 +162,8 @@ const char* tGetTokenName(Token token) {
     switch(token) {
         case T_INT: return "int";
         case T_NULL: return "null";
+        case T_TRUE: return "true";
+        case T_FALSE: return "false";
         case T_ADD: return "+";
         case T_MUL: return "*";
         case T_PRINT: return "print";

+ 13 - 1
Tokenizer.h

@@ -3,7 +3,19 @@
 
 #include <stdbool.h>
 
-typedef enum Token { T_INT, T_NULL, T_ADD, T_MUL, T_PRINT, T_SEMICOLON, T_OPEN_BRACKET, T_CLOSE_BRACKET, T_END } Token;
+typedef enum Token {
+    T_INT,
+    T_NULL,
+    T_TRUE,
+    T_FALSE,
+    T_ADD,
+    T_MUL,
+    T_PRINT,
+    T_SEMICOLON,
+    T_OPEN_BRACKET,
+    T_CLOSE_BRACKET,
+    T_END
+} Token;
 
 bool tTokenize(const char* path);
 const char* tGetError();

+ 2 - 0
tests/types/bool

@@ -0,0 +1,2 @@
+print true;
+print false;

+ 2 - 0
tests/types/bool.out

@@ -0,0 +1,2 @@
+true
+false