1
0
Просмотр исходного кода

Fix variable declaration after command

Lucas de Souza 5 лет назад
Родитель
Сommit
1570c62cf6
3 измененных файлов с 10 добавлено и 15 удалено
  1. 1 1
      i18n/pt/error.json
  2. 0 11
      js/ast/ivprogLexer.js
  3. 9 3
      js/ast/ivprogParser.js

+ 1 - 1
i18n/pt/error.json

@@ -7,7 +7,7 @@
   "invalid_array_size": "O tamnho do vetor/matriz excede o máximo de 2 na linha $0",
   "extra_lines": "Nenhum texto é permitido após '}' em 'programa {...}'",
   "invalid_main_return": "A função $0 deve retornar $1 na linha $2",
-  "invalid_var_declaration": "Erro na linha $0. Variáveis só podem ser declarados no corpo principal da função e de preferência nas primeiras linhas.",
+  "invalid_var_declaration": "Erro na linha $0: variáveis só podem ser declaradas no corpo principal da função e nas primeiras linhas, antes de qualquer comando.",
   "invalid_break_command": "Erro na linha $0. O comando $1 não pode ser usado fora de uma estrutura de repetição ou 'escolha...caso'",
   "invalid_terminal": "Não é possível utilizar $0 na expressão da linha: $1, coluna: $2. Tente um valor númerico, variável ou chamada de função.",
   "const_not_init": "Erro na linha: $0, coluna: $1. Uma variável declarada como const deve ser inicializada",

+ 0 - 11
js/ast/ivprogLexer.js

@@ -1,11 +0,0 @@
-import { SyntaxErrorFactory } from "./error/syntaxErrorFactory";
-
-export function recover (_) {
-    const start = this._tokenStartCharIndex;
-    const stop = this._input.index;
-    let text = this._input.getText(start, stop);
-    text = this.getErrorDisplay(text);
-    const line = this._tokenStartLine;
-    const column = this._tokenStartColumn;
-    throw SyntaxErrorFactory.invalid_character(text, line, column);
-}

+ 9 - 3
js/ast/ivprogParser.js

@@ -1,7 +1,7 @@
 import { CommonTokenStream, InputStream } from 'antlr4/index';
 import * as Expressions from './expressions/';
 import * as Commands from './commands/';
-import { recover } from "./ivprogLexer";
+import * as AstHelpers from "./ast_helpers";
 import { toInt, toString, toBool, toReal } from './../typeSystem/parsers';
 import { Types } from "./../typeSystem/types";
 import { CompoundType } from "./../typeSystem/compoundType";
@@ -36,7 +36,7 @@ export class IVProgParser {
   constructor (input, lexerClass) {
     this.lexerClass = lexerClass;
     this.lexer = new lexerClass(new InputStream(input));
-    this.lexer.recover = recover.bind(this.lexer);
+    this.lexer.recover = AstHelpers.recover.bind(this.lexer);
     this.tokenStream = new CommonTokenStream(this.lexer);
     this.tokenStream.fill();
     this.pos = 1;
@@ -608,6 +608,7 @@ export class IVProgParser {
       hasOpen = true;
     }
     this.consumeNewLines();
+    let parsedCommand =  false;
     while(true) {
 
       const cmd = this.parseCommand();
@@ -615,8 +616,13 @@ export class IVProgParser {
         break;
       if(cmd !== -1) {
         if (cmd instanceof Array) {
+          if(parsedCommand) {
+            const lastToken = this.getToken(this.pos - 1);
+            throw SyntaxErrorFactory.invalid_var_declaration(lastToken);
+          }
           variablesDecl = variablesDecl.concat(cmd);
         } else {
+          parsedCommand = true;
           commands.push(cmd);
         }
       }
@@ -634,7 +640,7 @@ export class IVProgParser {
     const token = this.getToken();
     if (this.isVariableType(token)) {
       if(!this.insideScope(IVProgParser.FUNCTION)) {
-        throw SyntaxErrorFactory.invalid_var_declaration(token.line);
+        throw SyntaxErrorFactory.invalid_var_declaration(token);
       }
       this.pushScope(IVProgParser.BASE);
       const varType = this.parseType();