Kajetan Johannes Hammerle 4 роки тому
батько
коміт
130412de6e
5 змінених файлів з 29 додано та 2 видалено
  1. 14 0
      Compiler.c
  2. 4 2
      Tokenizer.c
  3. 1 0
      Tokenizer.h
  4. 5 0
      tests/loops/while
  5. 5 0
      tests/loops/while.out

+ 14 - 0
Compiler.c

@@ -436,6 +436,19 @@ static void cIf() {
     }
 }
 
+static void cWhile() {
+    int start = code->length;
+    cConsumeToken(T_OPEN_BRACKET);
+    cExpression();
+    cConsumeToken(T_CLOSE_BRACKET);
+    cAddOperation(OP_IF_GOTO);
+    int ifP = cReserveInt();
+    cConsumeBody();
+    cAddOperation(OP_GOTO);
+    cAddInt(start);
+    cSetInt(ifP, code->length);
+}
+
 static void cLine(Token t) {
     cAddOperation(OP_LINE);
     cAddInt16(line);
@@ -445,6 +458,7 @@ static void cLine(Token t) {
         case T_FUNCTION: cFunction(); break;
         case T_RETURN: cReturn(); break;
         case T_IF: cIf(); break;
+        case T_WHILE: cWhile(); break;
         default: cUnexpectedToken(t);
     }
 }

+ 4 - 2
Tokenizer.c

@@ -22,8 +22,9 @@ typedef struct Literal {
     Token token;
 } Literal;
 
-Literal LITERALS[] = {{"print", T_PRINT},       {"null", T_NULL},     {"true", T_TRUE}, {"false", T_FALSE},
-                      {"function", T_FUNCTION}, {"return", T_RETURN}, {"if", T_IF},     {"else", T_ELSE}};
+Literal LITERALS[] = {{"print", T_PRINT}, {"null", T_NULL},         {"true", T_TRUE},
+                      {"false", T_FALSE}, {"function", T_FUNCTION}, {"return", T_RETURN},
+                      {"if", T_IF},       {"else", T_ELSE},         {"while", T_WHILE}};
 const int LITERAL_AMOUNT = sizeof(LITERALS) / sizeof(Literal);
 
 static void tError(const char* format, ...) {
@@ -270,6 +271,7 @@ const char* tGetTokenName(Token token) {
         case T_PRINT: return "print";
         case T_IF: return "if";
         case T_ELSE: return "else";
+        case T_WHILE: return "while";
         case T_FUNCTION: return "function";
         case T_RETURN: return "return";
         case T_COMMA: return ",";

+ 1 - 0
Tokenizer.h

@@ -31,6 +31,7 @@ typedef enum Token {
     T_PRINT,
     T_IF,
     T_ELSE,
+    T_WHILE,
     T_FUNCTION,
     T_RETURN,
     T_COMMA,

+ 5 - 0
tests/loops/while

@@ -0,0 +1,5 @@
+a = 0;
+while(a < 5) {
+    print a;
+    a = a + 1;
+}

+ 5 - 0
tests/loops/while.out

@@ -0,0 +1,5 @@
+0
+1
+2
+3
+4