Kajetan Johannes Hammerle пре 2 недеља
родитељ
комит
41ce23f28f
1 измењених фајлова са 21 додато и 2 уклоњено
  1. 21 2
      src/Compiler.c

+ 21 - 2
src/Compiler.c

@@ -17,7 +17,7 @@ static u8 tokens[MAX_TOKENS] = {};
 static size_t tokenReadIndex = 0;
 static size_t tokenWriteIndex = 0;
 
-typedef enum : u8 { LITERAL, INT64, DOUBLE, STRING, NEWLINE, END } Token;
+typedef enum : u8 { LITERAL, INT64, DOUBLE, STRING, PLUS, NEWLINE, END } Token;
 
 #define THROW_ERROR(...)                                   \
     snprintf(error.text, sizeof(error.text), __VA_ARGS__); \
@@ -165,6 +165,9 @@ static void tokenizeLineString(const char* s) {
             break;
         } else if(c == ' ') {
             s++;
+        } else if(c == '+') {
+            addToken(PLUS);
+            s++;
         } else if(c == '\0') {
             break;
         } else {
@@ -256,6 +259,9 @@ static double readDouble() {
             THROW_ERROR(
                 "Unexpected string(%s) on line %zu", readString(), lineCounter);
             break;
+        case PLUS:
+            THROW_ERROR("Unexpected plus on line %zu", lineCounter);
+            break;
         case NEWLINE:
             THROW_ERROR("Unexpected newline on line %zu", lineCounter);
             break;
@@ -264,7 +270,7 @@ static double readDouble() {
     THROW_ERROR("Unexpected unknown token on line %zu", lineCounter);
 }
 
-static void compileExpression() {
+static void compileConstant() {
     Token t = nextToken();
     if(t == STRING) {
         CODE(codePushInstruction(PUSH_CONSTANT_STRING));
@@ -277,6 +283,19 @@ static void compileExpression() {
     }
 }
 
+static void compileAdd() {
+    compileConstant();
+    while(peekToken() == PLUS) {
+        nextToken();
+        compileConstant();
+        CODE(codePushInstruction(ADD));
+    }
+}
+
+static void compileExpression() {
+    compileAdd();
+}
+
 static void compileLine(Token t) {
     if(t != LITERAL) {
         unexpectedToken(t);