Kajetan Johannes Hammerle 4 years ago
parent
commit
f9abbf9728
9 changed files with 48 additions and 3 deletions
  1. 10 3
      Compiler.c
  2. 1 0
      Operation.h
  3. 10 0
      Script.c
  4. 2 0
      Tokenizer.c
  5. 1 0
      Tokenizer.h
  6. 0 0
      tests/calc/add
  7. 0 0
      tests/calc/add.out
  8. 12 0
      tests/calc/div
  9. 12 0
      tests/calc/div.out

+ 10 - 3
Compiler.c

@@ -200,9 +200,16 @@ static void cPrimary() {
 
 static void cMul() {
     cPrimary();
-    while(cConsumeTokenIf(T_MUL)) {
-        cPrimary();
-        cAddOperation(OP_MUL);
+    while(true) {
+        if(cConsumeTokenIf(T_MUL)) {
+            cPrimary();
+            cAddOperation(OP_MUL);
+        } else if(cConsumeTokenIf(T_DIV)) {
+            cPrimary();
+            cAddOperation(OP_DIV);
+        } else {
+            break;
+        }
     }
 }
 

+ 1 - 0
Operation.h

@@ -16,6 +16,7 @@ typedef enum Operation {
     OP_ADD,
     OP_SUB,
     OP_MUL,
+    OP_DIV,
     OP_LESS,
     OP_GREATER,
     OP_EQUAL,

+ 10 - 0
Script.c

@@ -193,6 +193,10 @@ static int sIntMul(int a, int b) {
     return a * b;
 }
 
+static int sIntDiv(int a, int b) {
+    return b / a;
+}
+
 static float sFloatAdd(float a, float b) {
     return a + b;
 }
@@ -205,6 +209,10 @@ static float sFloatMul(float a, float b) {
     return a * b;
 }
 
+static float sFloatDiv(float a, float b) {
+    return b / a;
+}
+
 static void sBoolBinary(Script* sc, bool (*fInt)(int, int), bool (*fFloat)(float, float)) {
     Object o[2];
     if(sPop(sc, o) || sPop(sc, o + 1)) {
@@ -339,6 +347,7 @@ static void sConsumeInstruction(Script* sc) {
         case OP_ADD: sIntBinary(sc, sIntAdd, sFloatAdd); break;
         case OP_SUB: sIntBinary(sc, sIntSub, sFloatSub); break;
         case OP_MUL: sIntBinary(sc, sIntMul, sFloatMul); break;
+        case OP_DIV: sIntBinary(sc, sIntDiv, sFloatDiv); break;
         case OP_LESS: sBoolBinary(sc, sIntLess, sFloatLess); break;
         case OP_GREATER: sBoolBinary(sc, sIntGreater, sFloatGreater); break;
         case OP_EQUAL: sEqual(sc); break;
@@ -434,6 +443,7 @@ void sPrintCode(Script* sc) {
             case OP_ADD: puts("Add"); break;
             case OP_SUB: puts("Sub"); break;
             case OP_MUL: puts("Mul"); break;
+            case OP_DIV: puts("Div"); break;
             case OP_LESS: puts("Less"); break;
             case OP_GREATER: puts("Greater"); break;
             case OP_EQUAL: puts("Equal"); break;

+ 2 - 0
Tokenizer.c

@@ -148,6 +148,7 @@ static bool tParseToken() {
         case '+': return tAddToken(T_ADD);
         case '-': return tAddToken(T_SUB);
         case '*': return tAddToken(T_MUL);
+        case '/': return tAddToken(T_DIV);
         case '<': return tReadIf('=') ? tAddToken(T_LESS_EQUAL) : tAddToken(T_LESS);
         case '>': return tReadIf('=') ? tAddToken(T_GREATER_EQUAL) : tAddToken(T_GREATER);
         case '=': return tReadIf('=') ? tAddToken(T_EQUAL) : tAddToken(T_SET);
@@ -248,6 +249,7 @@ const char* tGetTokenName(Token token) {
         case T_ADD: return "+";
         case T_SUB: return "-";
         case T_MUL: return "*";
+        case T_DIV: return "/";
         case T_LESS: return "<";
         case T_LESS_EQUAL: return "<=";
         case T_GREATER: return ">";

+ 1 - 0
Tokenizer.h

@@ -13,6 +13,7 @@ typedef enum Token {
     T_ADD,
     T_SUB,
     T_MUL,
+    T_DIV,
     T_LESS,
     T_LESS_EQUAL,
     T_GREATER,

+ 0 - 0
tests/calc/adding → tests/calc/add


+ 0 - 0
tests/calc/adding.out → tests/calc/add.out


+ 12 - 0
tests/calc/div

@@ -0,0 +1,12 @@
+print 1 / 2;
+print 7 / 3;
+print 7 / 3.0;
+print 7.0 / 3;
+print 7.0 / 3.0;
+print 3 / 4 + 5;
+print 6 + 7 / 8 + 9;
+print 3.5 / 5.5;
+print 4.0 / 1;
+print 1 / 2.0;
+print 20 * 2 / 3 / 5;
+print 20.0 * 2 / 3 / 5;

+ 12 - 0
tests/calc/div.out

@@ -0,0 +1,12 @@
+0
+2
+2.33
+2.33
+2.33
+5
+15
+0.64
+4.00
+0.50
+2
+2.67