Browse Source

Implement Partial SwitchCase parser

Lucas de Souza 6 years ago
parent
commit
7b1c7e35c6
1 changed files with 25 additions and 5 deletions
  1. 25 5
      js/ast/ivprogParser.js

+ 25 - 5
js/ast/ivprogParser.js

@@ -16,7 +16,7 @@ export class IVProgParser {
   static get COMMAND () {
     return 2;
   }
-  static get LOOP () {
+  static get BREAKABLE () {
     return 4;
   }
   // </ END scope consts>
@@ -485,13 +485,13 @@ export class IVProgParser {
       } else if (token.type === this.lexerClass.RK_FOR) {
         cmd = this.parseFor();
       } else if (token.type === this.lexerClass.RK_BREAK ) {
-        if(scope !== IVProgParser.LOOP) {
+        if(scope !== IVProgParser.BREAKABLE) {
           // TODO better error message
           throw new Error("Break cannot be used outside of a loop.");
         }
         cmd = this.parseBreak();
       } else if (token.type === this.lexerClass.RK_SWITCH) {
-        
+        cmd = this.parseSwitchCase();
       } else if (token.type === this.lexerClass.RK_DO) {
         cmd = this.parseDoWhile();
       } else if (token.type === this.lexerClass.RK_IF) {
@@ -510,6 +510,26 @@ export class IVProgParser {
     return new Commands.CommandBlock(variablesDecl, commands);
   }
 
+  parseSwitchCase () {
+    this.pos++;
+    this.checkOpenParenthesis();
+    this.pos++;
+    this.consumeNewLines();
+    const exp = this.parseExpressionOR();
+    this.consumeNewLines();
+    this.checkCloseParenthesis();
+    this.pos++;
+    this.consumeNewLines();
+    this.checkOpenCurly();
+    this.pos++;
+    this.consumeNewLines();
+    const switchCases = this.parseCases();
+    this.consumeNewLines();
+    this.checkCloseCurly();
+    this.pos++;
+    this.consumeNewLines();
+  }
+
   parseDoWhile () {
     this.pos++;
     this.consumeNewLines();
@@ -573,7 +593,7 @@ export class IVProgParser {
     this.checkCloseParenthesis()
     this.pos++;
     this.consumeNewLines();
-    const commandsBlock = this.parseCommandBlock(IVProgParser.LOOP);
+    const commandsBlock = this.parseCommandBlock(IVProgParser.BREAKABLE);
     return new Commands.For(attribution, condition, increment, commandsBlock);
   }
 
@@ -587,7 +607,7 @@ export class IVProgParser {
     this.checkCloseParenthesis();
     this.pos++;
     this.consumeNewLines();
-    const cmdBlocks = this.parseCommandBlock(IVProgParser.LOOP);
+    const cmdBlocks = this.parseCommandBlock(IVProgParser.BREAKABLE);
     return new Commands.While(logicalExpression, cmdBlocks);
   }