Browse Source

Implement vector/matrix literal attribution check during syntatic analysis

Lucas de Souza 4 years ago
parent
commit
7b00bd4fa9
3 changed files with 24 additions and 1 deletions
  1. 3 1
      i18n/pt/error.json
  2. 8 0
      js/ast/error/syntaxErrorFactory.js
  3. 13 0
      js/ast/ivprogParser.js

+ 3 - 1
i18n/pt/error.json

@@ -99,5 +99,7 @@
   "invalid_matrix_literal_line": "A expressão $0 na linha $1 não possui um número de elementos igual a linha anterior. Todas as linhas de uma matriz devem ter a mesma quantidade de elementos.",
   "cannot_infer_matrix_line": "Não é possível inferir o número de linhas da matriz $0 na linha $1. É necessário que ela seja inicializada ou que o valor seja informado de forma explícita.",
   "cannot_infer_matrix_column": "Não é possível inferir o número de colunas da matriz $0 na linha $1. É necessário que ela seja inicializada ou que o valor seja informado de forma explícita.",
-  "cannot_infer_vector_size": "Não é possível inferir o número de elementos do vetor $0 na linha $1. É necessário que ele seja inicializado ou que o valor seja informado de forma explícita"
+  "cannot_infer_vector_size": "Não é possível inferir o número de elementos do vetor $0 na linha $1. É necessário que ele seja inicializado ou que o valor seja informado de forma explícita",
+  "matrix_to_vector_attr":  "Erro na linha $0: $1 representa uma matriz e não pode ser atribuída ao vetor $2.",
+  "vector_to_matrix_attr":  "Erro na linha $0: $1 representa um vetor e não pode ser atribuído a matriz $2."
 }

+ 8 - 0
js/ast/error/syntaxErrorFactory.js

@@ -96,5 +96,13 @@ export const SyntaxErrorFactory = Object.freeze({
   cannot_infer_vector_size: (name, sourceInfo) => {
     const context = [name, sourceInfo.line];
     return createError("cannot_infer_vector_size", context);
+  },
+  matrix_to_vector_attr: (name, exp, sourceInfo) => {
+    const context = [sourceInfo.line, exp, name];
+    return createError("matrix_to_vector_attr", context);
+  },
+  vector_to_matrix_attr: (name, exp, sourceInfo) => {
+    const context = [sourceInfo.line, exp, name];
+    return createError("vector_to_matrix_attr", context);
   }
 });

+ 13 - 0
js/ast/ivprogParser.js

@@ -358,6 +358,14 @@ export class IVProgParser {
       }
     }
 
+    if(dimensions === 1 && !initial.isVector) {
+      const expString = initial.toString();
+      throw SyntaxErrorFactory.matrix_to_vector_attr(idString, expString, initial.sourceInfo);
+    } else if (dimensions > 1 && initial.isVector) {
+      const expString = initial.toString();
+      throw SyntaxErrorFactory.vector_to_matrix_attr(idString, expString, initial.sourceInfo);
+    }
+
     if(dim1 == null) {
       n_lines = new Expressions.IntLiteral(toInt(initial.lines));
       n_lines.sourceInfo = sourceInfo;
@@ -478,6 +486,8 @@ export class IVProgParser {
     let dataDim = 1;
     if(data[0] instanceof Expressions.ArrayLiteral) {
       dataDim += 1;
+    } else if(data.length == 1) {
+      console.log("Talvez uma variável seja uma melhor opção");
     }
     const type = new CompoundType(typeString, dataDim);
     const exp = new Expressions.ArrayLiteral(type, data);
@@ -525,6 +535,9 @@ export class IVProgParser {
       this.pos += 1;
       this.consumeNewLines();
     }
+    if(list.length == 1) {
+      console.log("Talvez um vetor seja uma melhor opção");
+    }
     return list
   }