1
0
Selaa lähdekoodia

Implement semantic analysis for the new for structure

Lucas de Souza 5 vuotta sitten
vanhempi
commit
5d5e955736
1 muutettua tiedostoa jossa 19 lisäystä ja 5 poistoa
  1. 19 5
      js/processor/semantic/semanticAnalyser.js

+ 19 - 5
js/processor/semantic/semanticAnalyser.js

@@ -322,12 +322,26 @@ export class SemanticAnalyser {
       this.checkCommands(type, cmd.commands, optional);
       return false;
     } else if (cmd instanceof For) {
-      this.checkCommand(type, cmd.assignment, optional);
-      const resultType = this.evaluateExpressionType(cmd.condition);
-      if (!resultType.isCompatible(Types.BOOLEAN)) {
-        throw ProcessorErrorFactory.for_condition_type_full(cmd.condition.toString(), cmd.sourceInfo);
+      const var_type = this.evaluateExpressionType(cmd.for_id);
+      if (!var_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("A variavel do comando repita_para deve ser do tipo inteiro");
+      }
+      const from_type = this.evaluateExpressionType(cmd.for_from);
+      if (!from_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("o paramentro 'de' do comando repita_para deve ser do tipo inteiro");
+      }
+      const to_type = this.evaluateExpressionType(cmd.for_to);
+      if (!to_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("o paramentro 'ate' do comando repita_para deve ser do tipo inteiro");
+      }
+      const pass_type = this.evaluateExpressionType(cmd.for_pass);
+      if (!pass_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("o paramentro 'passo' do comando repita_para deve ser do tipo inteiro");
       }
-      this.checkCommand(type, cmd.increment, optional);
       this.checkCommands(type, cmd.commands, optional);
       return false;
     } else if (cmd instanceof Switch) {