@designliquido/delegua 0.35.2 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +3 -0
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +10 -0
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico.d.ts +3 -3
  6. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  7. package/avaliador-sintatico/avaliador-sintatico.js +236 -231
  8. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  9. package/bibliotecas/biblioteca-global.js +2 -2
  10. package/bibliotecas/biblioteca-global.js.map +1 -1
  11. package/bin/package.json +1 -1
  12. package/construtos/atribuir.d.ts +3 -1
  13. package/construtos/atribuir.d.ts.map +1 -1
  14. package/construtos/atribuir.js +7 -1
  15. package/construtos/atribuir.js.map +1 -1
  16. package/estruturas/delegua-funcao.js +1 -1
  17. package/estruturas/delegua-funcao.js.map +1 -1
  18. package/estruturas/{delegua-classe.d.ts → descritor-tipo-classe.d.ts} +7 -5
  19. package/estruturas/descritor-tipo-classe.d.ts.map +1 -0
  20. package/estruturas/{delegua-classe.js → descritor-tipo-classe.js} +8 -6
  21. package/estruturas/descritor-tipo-classe.js.map +1 -0
  22. package/estruturas/index.d.ts +1 -1
  23. package/estruturas/index.d.ts.map +1 -1
  24. package/estruturas/index.js +1 -1
  25. package/estruturas/index.js.map +1 -1
  26. package/estruturas/objeto-delegua-classe.d.ts +4 -4
  27. package/estruturas/objeto-delegua-classe.d.ts.map +1 -1
  28. package/estruturas/objeto-delegua-classe.js +1 -1
  29. package/estruturas/objeto-delegua-classe.js.map +1 -1
  30. package/interfaces/pilha-escopos-execucao-interface.d.ts +1 -1
  31. package/interfaces/pilha-escopos-execucao-interface.d.ts.map +1 -1
  32. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +6 -6
  33. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  34. package/interpretador/interpretador-base.d.ts +3 -2
  35. package/interpretador/interpretador-base.d.ts.map +1 -1
  36. package/interpretador/interpretador-base.js +24 -18
  37. package/interpretador/interpretador-base.js.map +1 -1
  38. package/interpretador/pilha-escopos-execucao.d.ts +1 -1
  39. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  40. package/interpretador/pilha-escopos-execucao.js +17 -7
  41. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  42. package/package.json +1 -1
  43. package/umd/delegua.js +373 -344
  44. package/estruturas/delegua-classe.d.ts.map +0 -1
  45. package/estruturas/delegua-classe.js.map +0 -1
package/umd/delegua.js CHANGED
@@ -230,14 +230,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
230
230
  };
231
231
  Object.defineProperty(exports, "__esModule", { value: true });
232
232
  exports.AvaliadorSintatico = void 0;
233
- const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
234
- const delegua_2 = __importDefault(require("../tipos-de-dados/delegua"));
235
233
  const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
234
+ const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
235
+ const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
236
236
  const construtos_1 = require("../construtos");
237
237
  const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
238
+ const tuplas_1 = require("../construtos/tuplas");
238
239
  const declaracoes_1 = require("../declaracoes");
239
240
  const lexador_1 = require("../lexador");
240
- const tuplas_1 = require("../construtos/tuplas");
241
241
  /**
242
242
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
243
243
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -273,13 +273,13 @@ class AvaliadorSintatico {
273
273
  return this.simbolos[this.atual + 1].tipo === tipo;
274
274
  }
275
275
  verificarDefinicaoTipoAtual() {
276
- const tipos = [...Object.values(delegua_2.default)];
276
+ const tipos = [...Object.values(delegua_1.default)];
277
277
  const lexema = this.simboloAtual().lexema.toLowerCase();
278
278
  const contemTipo = tipos.find((tipo) => tipo === lexema);
279
- if (contemTipo && this.verificarTipoProximoSimbolo(delegua_1.default.COLCHETE_ESQUERDO)) {
279
+ if (contemTipo && this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
280
280
  const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
281
281
  this.avancarEDevolverAnterior();
282
- if (!this.verificarTipoProximoSimbolo(delegua_1.default.COLCHETE_DIREITO)) {
282
+ if (!this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_DIREITO)) {
283
283
  throw this.erro(this.simbolos[this.atual], "Esperado símbolo de fechamento do vetor ']'.");
284
284
  }
285
285
  const contemTipoVetor = tiposVetores.find((tipo) => tipo === `${lexema}[]`);
@@ -316,124 +316,124 @@ class AvaliadorSintatico {
316
316
  const simboloAtual = this.simbolos[this.atual];
317
317
  let valores = [];
318
318
  switch (simboloAtual.tipo) {
319
- case delegua_1.default.CHAVE_ESQUERDA:
319
+ case delegua_2.default.CHAVE_ESQUERDA:
320
320
  this.avancarEDevolverAnterior();
321
321
  const chaves = [];
322
322
  valores = [];
323
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
323
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
324
324
  return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
325
325
  }
326
- while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
326
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
327
327
  const chave = this.atribuir();
328
- this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
328
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
329
329
  const valor = this.atribuir();
330
330
  chaves.push(chave);
331
331
  valores.push(valor);
332
- if (this.simbolos[this.atual].tipo !== delegua_1.default.CHAVE_DIREITA) {
333
- this.consumir(delegua_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
332
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
333
+ this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
334
334
  }
335
335
  }
336
336
  return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
337
- case delegua_1.default.COLCHETE_ESQUERDO:
337
+ case delegua_2.default.COLCHETE_ESQUERDO:
338
338
  this.avancarEDevolverAnterior();
339
339
  valores = [];
340
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_DIREITO)) {
340
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
341
341
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
342
342
  }
343
- while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_DIREITO)) {
343
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
344
344
  let valor = null;
345
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PARENTESE_ESQUERDO)) {
345
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
346
346
  const expressao = this.expressao();
347
347
  const argumentos = [expressao];
348
- while (this.simbolos[this.atual].tipo === delegua_1.default.VIRGULA) {
348
+ while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
349
349
  this.avancarEDevolverAnterior();
350
350
  argumentos.push(this.expressao());
351
351
  }
352
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
353
- this.consumir(delegua_1.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
352
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
353
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
354
354
  return new tuplas_1.SeletorTuplas(...argumentos);
355
355
  }
356
356
  valor = this.atribuir();
357
357
  valores.push(valor);
358
- if (this.simbolos[this.atual].tipo !== delegua_1.default.COLCHETE_DIREITO) {
359
- this.consumir(delegua_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
358
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
359
+ this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
360
360
  }
361
361
  }
362
362
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
363
- case delegua_1.default.FALSO:
363
+ case delegua_2.default.FALSO:
364
364
  this.avancarEDevolverAnterior();
365
365
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
366
- case delegua_1.default.FUNCAO:
367
- case delegua_1.default.FUNÇÃO:
366
+ case delegua_2.default.FUNCAO:
367
+ case delegua_2.default.FUNÇÃO:
368
368
  const simboloFuncao = this.avancarEDevolverAnterior();
369
369
  return this.corpoDaFuncao(simboloFuncao.lexema);
370
- case delegua_1.default.IDENTIFICADOR:
370
+ case delegua_2.default.IDENTIFICADOR:
371
371
  const simboloIdentificador = this.avancarEDevolverAnterior();
372
372
  // Se o próximo símbolo é um incremento ou um decremento,
373
373
  // aqui deve retornar um unário correspondente.
374
374
  // Caso contrário, apenas retornar um construto de variável.
375
375
  if (this.simbolos[this.atual] &&
376
- [delegua_1.default.INCREMENTAR, delegua_1.default.DECREMENTAR].includes(this.simbolos[this.atual].tipo)) {
376
+ [delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR].includes(this.simbolos[this.atual].tipo)) {
377
377
  const simboloIncrementoDecremento = this.avancarEDevolverAnterior();
378
378
  return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador), 'DEPOIS');
379
379
  }
380
380
  return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador);
381
- case delegua_1.default.IMPORTAR:
381
+ case delegua_2.default.IMPORTAR:
382
382
  this.avancarEDevolverAnterior();
383
383
  return this.declaracaoImportar();
384
- case delegua_1.default.ISTO:
384
+ case delegua_2.default.ISTO:
385
385
  this.avancarEDevolverAnterior();
386
386
  return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
387
- case delegua_1.default.NULO:
387
+ case delegua_2.default.NULO:
388
388
  this.avancarEDevolverAnterior();
389
389
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null);
390
- case delegua_1.default.NUMERO:
391
- case delegua_1.default.TEXTO:
390
+ case delegua_2.default.NUMERO:
391
+ case delegua_2.default.TEXTO:
392
392
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
393
393
  return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal);
394
- case delegua_1.default.PARENTESE_ESQUERDO:
394
+ case delegua_2.default.PARENTESE_ESQUERDO:
395
395
  this.avancarEDevolverAnterior();
396
396
  const expressao = this.expressao();
397
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
397
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
398
398
  return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
399
- case delegua_1.default.SUPER:
399
+ case delegua_2.default.SUPER:
400
400
  const simboloSuper = this.avancarEDevolverAnterior();
401
401
  // Se o próximo símbolo for uma abertura de parênteses, significa que
402
402
  // é uma chamada ao construtor da classe ancestral (superclasse).
403
403
  // Se o próximo símbolo for um ponto, significa que é uma chamada
404
404
  // a um método da superclasse.
405
405
  switch (this.simbolos[this.atual].tipo) {
406
- case delegua_1.default.PARENTESE_ESQUERDO:
407
- return new construtos_1.Super(this.hashArquivo, simboloSuper, new lexador_1.Simbolo(delegua_1.default.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo));
406
+ case delegua_2.default.PARENTESE_ESQUERDO:
407
+ return new construtos_1.Super(this.hashArquivo, simboloSuper, new lexador_1.Simbolo(delegua_2.default.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo));
408
408
  default:
409
- this.consumir(delegua_1.default.PONTO, "Esperado '.' após 'super'.");
410
- const metodoSuperclasse = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
409
+ this.consumir(delegua_2.default.PONTO, "Esperado '.' após 'super'.");
410
+ const metodoSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
411
411
  return new construtos_1.Super(this.hashArquivo, simboloSuper, metodoSuperclasse);
412
412
  }
413
- case delegua_1.default.VERDADEIRO:
413
+ case delegua_2.default.VERDADEIRO:
414
414
  this.avancarEDevolverAnterior();
415
415
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
416
- case delegua_1.default.TIPO:
416
+ case delegua_2.default.TIPO:
417
417
  this.avancarEDevolverAnterior();
418
- this.consumir(delegua_1.default.DE, "Esperado 'de' após 'tipo'.");
418
+ this.consumir(delegua_2.default.DE, "Esperado 'de' após 'tipo'.");
419
419
  let _expressao;
420
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.ESCREVA, delegua_1.default.LEIA, delegua_1.default.FUNCAO, delegua_1.default.FUNÇÃO, delegua_1.default.SE, delegua_1.default.ENQUANTO, delegua_1.default.PARA, delegua_1.default.RETORNA, delegua_2.default.INTEIRO, delegua_2.default.TEXTO, delegua_2.default.VETOR, delegua_2.default.LOGICO, delegua_2.default.LÓGICO, delegua_2.default.VAZIO)) {
420
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESCREVA, delegua_2.default.LEIA, delegua_2.default.FUNCAO, delegua_2.default.FUNÇÃO, delegua_2.default.SE, delegua_2.default.ENQUANTO, delegua_2.default.PARA, delegua_2.default.RETORNA, delegua_1.default.INTEIRO, delegua_1.default.TEXTO, delegua_1.default.VETOR, delegua_1.default.LOGICO, delegua_1.default.LÓGICO, delegua_1.default.VAZIO)) {
421
421
  _expressao = this.simboloAnterior();
422
422
  }
423
423
  else {
424
424
  _expressao = this.expressao();
425
425
  }
426
426
  return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, _expressao instanceof construtos_1.Literal ? _expressao.valor : _expressao);
427
- case delegua_1.default.EXPRESSAO_REGULAR:
427
+ case delegua_2.default.EXPRESSAO_REGULAR:
428
428
  let valor = '';
429
429
  let linhaAtual = this.simbolos[this.atual].linha;
430
- let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_1.default.EXPRESSAO_REGULAR)
430
+ let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
431
431
  .length %
432
432
  2 ===
433
433
  0;
434
434
  if (eParExpressaoRegular) {
435
435
  this.avancarEDevolverAnterior();
436
- while (!this.verificarTipoSimboloAtual(delegua_1.default.EXPRESSAO_REGULAR)) {
436
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
437
437
  valor += this.simboloAtual().lexema || '';
438
438
  this.avancarEDevolverAnterior();
439
439
  }
@@ -445,30 +445,30 @@ class AvaliadorSintatico {
445
445
  }
446
446
  finalizarChamada(entidadeChamada) {
447
447
  const argumentos = [];
448
- if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
448
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
449
449
  do {
450
450
  if (argumentos.length >= 255) {
451
451
  throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
452
452
  }
453
453
  argumentos.push(this.expressao());
454
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
454
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
455
455
  }
456
- const parenteseDireito = this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
456
+ const parenteseDireito = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
457
457
  return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
458
458
  }
459
459
  chamar() {
460
460
  let expressao = this.primario();
461
461
  while (true) {
462
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PARENTESE_ESQUERDO)) {
462
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
463
463
  expressao = this.finalizarChamada(expressao);
464
464
  }
465
- else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO)) {
466
- const nome = this.consumir(delegua_1.default.IDENTIFICADOR, "Esperado nome do método após '.'.");
465
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
466
+ const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
467
467
  expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
468
468
  }
469
- else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_ESQUERDO)) {
469
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
470
470
  const indice = this.expressao();
471
- const simboloFechamento = this.consumir(delegua_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
471
+ const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
472
472
  expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
473
473
  }
474
474
  else {
@@ -478,7 +478,7 @@ class AvaliadorSintatico {
478
478
  return expressao;
479
479
  }
480
480
  unario() {
481
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.NEGACAO, delegua_1.default.SUBTRACAO, delegua_1.default.BIT_NOT, delegua_1.default.INCREMENTAR, delegua_1.default.DECREMENTAR)) {
481
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.NEGACAO, delegua_2.default.SUBTRACAO, delegua_2.default.BIT_NOT, delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR)) {
482
482
  const operador = this.simbolos[this.atual - 1];
483
483
  const direito = this.unario();
484
484
  return new construtos_1.Unario(this.hashArquivo, operador, direito, 'ANTES');
@@ -487,7 +487,7 @@ class AvaliadorSintatico {
487
487
  }
488
488
  exponenciacao() {
489
489
  let expressao = this.unario();
490
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EXPONENCIACAO)) {
490
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
491
491
  const operador = this.simbolos[this.atual - 1];
492
492
  const direito = this.unario();
493
493
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -496,7 +496,7 @@ class AvaliadorSintatico {
496
496
  }
497
497
  multiplicar() {
498
498
  let expressao = this.exponenciacao();
499
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIVISAO, delegua_1.default.DIVISAO_IGUAL, delegua_1.default.DIVISAO_INTEIRA, delegua_1.default.DIVISAO_INTEIRA_IGUAL, delegua_1.default.MODULO, delegua_1.default.MODULO_IGUAL, delegua_1.default.MULTIPLICACAO, delegua_1.default.MULTIPLICACAO_IGUAL)) {
499
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIVISAO, delegua_2.default.DIVISAO_IGUAL, delegua_2.default.DIVISAO_INTEIRA, delegua_2.default.DIVISAO_INTEIRA_IGUAL, delegua_2.default.MODULO, delegua_2.default.MODULO_IGUAL, delegua_2.default.MULTIPLICACAO, delegua_2.default.MULTIPLICACAO_IGUAL)) {
500
500
  const operador = this.simbolos[this.atual - 1];
501
501
  const direito = this.exponenciacao();
502
502
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -510,7 +510,7 @@ class AvaliadorSintatico {
510
510
  */
511
511
  adicaoOuSubtracao() {
512
512
  let expressao = this.multiplicar();
513
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SUBTRACAO, delegua_1.default.ADICAO, delegua_1.default.MAIS_IGUAL, delegua_1.default.MENOS_IGUAL)) {
513
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MAIS_IGUAL, delegua_2.default.MENOS_IGUAL)) {
514
514
  const operador = this.simbolos[this.atual - 1];
515
515
  const direito = this.multiplicar();
516
516
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -519,7 +519,7 @@ class AvaliadorSintatico {
519
519
  }
520
520
  bitShift() {
521
521
  let expressao = this.adicaoOuSubtracao();
522
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MENOR_MENOR, delegua_1.default.MAIOR_MAIOR)) {
522
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MENOR_MENOR, delegua_2.default.MAIOR_MAIOR)) {
523
523
  const operador = this.simbolos[this.atual - 1];
524
524
  const direito = this.adicaoOuSubtracao();
525
525
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -528,7 +528,7 @@ class AvaliadorSintatico {
528
528
  }
529
529
  bitE() {
530
530
  let expressao = this.bitShift();
531
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.BIT_AND)) {
531
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_AND)) {
532
532
  const operador = this.simbolos[this.atual - 1];
533
533
  const direito = this.bitShift();
534
534
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -537,7 +537,7 @@ class AvaliadorSintatico {
537
537
  }
538
538
  bitOu() {
539
539
  let expressao = this.bitE();
540
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.BIT_OR, delegua_1.default.BIT_XOR)) {
540
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_OR, delegua_2.default.BIT_XOR)) {
541
541
  const operador = this.simbolos[this.atual - 1];
542
542
  const direito = this.bitE();
543
543
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -546,7 +546,7 @@ class AvaliadorSintatico {
546
546
  }
547
547
  comparar() {
548
548
  let expressao = this.bitOu();
549
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MAIOR, delegua_1.default.MAIOR_IGUAL, delegua_1.default.MENOR, delegua_1.default.MENOR_IGUAL)) {
549
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
550
550
  const operador = this.simbolos[this.atual - 1];
551
551
  const direito = this.bitOu();
552
552
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -555,7 +555,7 @@ class AvaliadorSintatico {
555
555
  }
556
556
  comparacaoIgualdade() {
557
557
  let expressao = this.comparar();
558
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIFERENTE, delegua_1.default.IGUAL_IGUAL)) {
558
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIFERENTE, delegua_2.default.IGUAL_IGUAL)) {
559
559
  const operador = this.simbolos[this.atual - 1];
560
560
  const direito = this.comparar();
561
561
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
@@ -564,7 +564,7 @@ class AvaliadorSintatico {
564
564
  }
565
565
  em() {
566
566
  let expressao = this.comparacaoIgualdade();
567
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EM)) {
567
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EM)) {
568
568
  const operador = this.simbolos[this.atual - 1];
569
569
  const direito = this.comparacaoIgualdade();
570
570
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
@@ -573,7 +573,7 @@ class AvaliadorSintatico {
573
573
  }
574
574
  e() {
575
575
  let expressao = this.em();
576
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.E)) {
576
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.E)) {
577
577
  const operador = this.simbolos[this.atual - 1];
578
578
  const direito = this.em();
579
579
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
@@ -582,7 +582,7 @@ class AvaliadorSintatico {
582
582
  }
583
583
  ou() {
584
584
  let expressao = this.e();
585
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.OU)) {
585
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.OU)) {
586
586
  const operador = this.simbolos[this.atual - 1];
587
587
  const direito = this.e();
588
588
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
@@ -597,16 +597,21 @@ class AvaliadorSintatico {
597
597
  const expressao = this.ou();
598
598
  if (expressao instanceof construtos_1.Binario &&
599
599
  [
600
- delegua_1.default.MAIS_IGUAL,
601
- delegua_1.default.MENOS_IGUAL,
602
- delegua_1.default.MULTIPLICACAO_IGUAL,
603
- delegua_1.default.DIVISAO_IGUAL,
604
- delegua_1.default.DIVISAO_INTEIRA_IGUAL,
605
- delegua_1.default.MODULO_IGUAL,
600
+ delegua_2.default.MAIS_IGUAL,
601
+ delegua_2.default.MENOS_IGUAL,
602
+ delegua_2.default.MULTIPLICACAO_IGUAL,
603
+ delegua_2.default.DIVISAO_IGUAL,
604
+ delegua_2.default.DIVISAO_INTEIRA_IGUAL,
605
+ delegua_2.default.MODULO_IGUAL,
606
606
  ].includes(expressao.operador.tipo)) {
607
- return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda.simbolo, expressao);
607
+ let simbolo = expressao.esquerda.simbolo;
608
+ if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
609
+ simbolo = expressao.esquerda.entidadeChamada.simbolo;
610
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, expressao.esquerda.indice);
611
+ }
612
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
608
613
  }
609
- else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.IGUAL)) {
614
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
610
615
  const igual = this.simbolos[this.atual - 1];
611
616
  const valor = this.expressao();
612
617
  if (expressao instanceof construtos_1.Variavel) {
@@ -625,13 +630,13 @@ class AvaliadorSintatico {
625
630
  return expressao;
626
631
  }
627
632
  expressao() {
628
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.LEIA))
633
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.LEIA))
629
634
  return this.declaracaoLeia();
630
635
  return this.atribuir();
631
636
  }
632
637
  blocoEscopo() {
633
638
  let declaracoes = [];
634
- while (!this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
639
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
635
640
  const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
636
641
  if (Array.isArray(retornoDeclaracao)) {
637
642
  declaracoes = declaracoes.concat(retornoDeclaracao);
@@ -640,8 +645,8 @@ class AvaliadorSintatico {
640
645
  declaracoes.push(retornoDeclaracao);
641
646
  }
642
647
  }
643
- this.consumir(delegua_1.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
644
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
648
+ this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
649
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
645
650
  return declaracoes;
646
651
  }
647
652
  declaracaoEnquanto() {
@@ -657,22 +662,22 @@ class AvaliadorSintatico {
657
662
  }
658
663
  declaracaoEscreva() {
659
664
  const simboloAtual = this.simbolos[this.atual];
660
- this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
665
+ this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
661
666
  const argumentos = [];
662
- if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
667
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
663
668
  do {
664
669
  argumentos.push(this.expressao());
665
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
670
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
666
671
  }
667
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
672
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
668
673
  // Ponto-e-vírgula é opcional aqui.
669
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
674
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
670
675
  return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
671
676
  }
672
677
  declaracaoExpressao() {
673
678
  const expressao = this.expressao();
674
679
  // Ponto-e-vírgula é opcional aqui.
675
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
680
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
676
681
  return new declaracoes_1.Expressao(expressao);
677
682
  }
678
683
  declaracaoComentarioMultilinha() {
@@ -681,7 +686,7 @@ class AvaliadorSintatico {
681
686
  do {
682
687
  simboloComentario = this.avancarEDevolverAnterior();
683
688
  conteudos.push(simboloComentario.literal);
684
- } while (simboloComentario.tipo === delegua_1.default.LINHA_COMENTARIO);
689
+ } while (simboloComentario.tipo === delegua_2.default.LINHA_COMENTARIO);
685
690
  return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, conteudos, true);
686
691
  }
687
692
  declaracaoComentarioUmaLinha() {
@@ -693,24 +698,24 @@ class AvaliadorSintatico {
693
698
  this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
694
699
  }
695
700
  // Ponto-e-vírgula é opcional aqui.
696
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
701
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
697
702
  return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
698
703
  }
699
704
  declaracaoEscolha() {
700
705
  try {
701
706
  this.blocos += 1;
702
707
  const condicao = this.expressao();
703
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
708
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
704
709
  const caminhos = [];
705
710
  let caminhoPadrao = null;
706
- while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
707
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CASO)) {
711
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
712
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
708
713
  const caminhoCondicoes = [this.expressao()];
709
- this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
710
- while (this.verificarTipoSimboloAtual(delegua_1.default.CASO)) {
711
- this.consumir(delegua_1.default.CASO, null);
714
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
715
+ while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
716
+ this.consumir(delegua_2.default.CASO, null);
712
717
  caminhoCondicoes.push(this.expressao());
713
- this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
718
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
714
719
  }
715
720
  let declaracoes = [];
716
721
  do {
@@ -721,27 +726,27 @@ class AvaliadorSintatico {
721
726
  else {
722
727
  declaracoes.push(retornoDeclaracao);
723
728
  }
724
- } while (!this.verificarTipoSimboloAtual(delegua_1.default.CASO) &&
725
- !this.verificarTipoSimboloAtual(delegua_1.default.PADRAO) &&
726
- !this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA));
729
+ } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
730
+ !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
731
+ !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
727
732
  caminhos.push({
728
733
  condicoes: caminhoCondicoes,
729
734
  declaracoes,
730
735
  });
731
736
  }
732
- else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PADRAO)) {
737
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PADRAO)) {
733
738
  if (caminhoPadrao !== null) {
734
739
  const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
735
740
  this.erros.push(excecao);
736
741
  throw excecao;
737
742
  }
738
- this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
743
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
739
744
  const declaracoes = [];
740
745
  do {
741
746
  declaracoes.push(this.resolverDeclaracao());
742
- } while (!this.verificarTipoSimboloAtual(delegua_1.default.CASO) &&
743
- !this.verificarTipoSimboloAtual(delegua_1.default.PADRAO) &&
744
- !this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA));
747
+ } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
748
+ !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
749
+ !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
745
750
  caminhoPadrao = {
746
751
  declaracoes,
747
752
  };
@@ -762,7 +767,7 @@ class AvaliadorSintatico {
762
767
  try {
763
768
  this.blocos += 1;
764
769
  const caminhoFazer = this.resolverDeclaracao();
765
- this.consumir(delegua_1.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
770
+ this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
766
771
  const condicaoEnquanto = this.expressao();
767
772
  return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
768
773
  }
@@ -771,9 +776,9 @@ class AvaliadorSintatico {
771
776
  }
772
777
  }
773
778
  declaracaoImportar() {
774
- this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
779
+ this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
775
780
  const caminho = this.expressao();
776
- const simboloFechamento = this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
781
+ const simboloFechamento = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
777
782
  return new declaracoes_1.Importar(caminho, simboloFechamento);
778
783
  }
779
784
  /**
@@ -782,21 +787,21 @@ class AvaliadorSintatico {
782
787
  */
783
788
  declaracaoLeia() {
784
789
  const simboloLeia = this.simbolos[this.atual];
785
- this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos argumentos em instrução `leia`.");
790
+ this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos argumentos em instrução `leia`.");
786
791
  const argumentos = [];
787
- if (this.simbolos[this.atual].tipo !== delegua_1.default.PARENTESE_DIREITO) {
792
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
788
793
  do {
789
794
  argumentos.push(this.expressao());
790
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
795
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
791
796
  }
792
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
797
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
793
798
  return new declaracoes_1.Leia(simboloLeia, argumentos);
794
799
  }
795
800
  declaracaoPara() {
796
801
  try {
797
802
  const simboloPara = this.simbolos[this.atual - 1];
798
803
  this.blocos += 1;
799
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CADA)) {
804
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
800
805
  return this.declaracaoParaCada(simboloPara);
801
806
  }
802
807
  return this.declaracaoParaTradicional(simboloPara);
@@ -806,8 +811,8 @@ class AvaliadorSintatico {
806
811
  }
807
812
  }
808
813
  declaracaoParaCada(simboloPara) {
809
- const nomeVariavelIteracao = this.consumir(delegua_1.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
810
- if (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.DE, delegua_1.default.EM)) {
814
+ const nomeVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
815
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
811
816
  throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
812
817
  }
813
818
  const vetor = this.expressao();
@@ -815,33 +820,33 @@ class AvaliadorSintatico {
815
820
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
816
821
  }
817
822
  declaracaoParaTradicional(simboloPara) {
818
- const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_1.default.PARENTESE_ESQUERDO);
823
+ const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
819
824
  let inicializador;
820
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA)) {
825
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA)) {
821
826
  inicializador = null;
822
827
  }
823
- else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VARIAVEL)) {
828
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VARIAVEL)) {
824
829
  inicializador = this.declaracaoDeVariaveis();
825
830
  }
826
- else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CONSTANTE)) {
831
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CONSTANTE)) {
827
832
  inicializador = this.declaracaoDeConstantes();
828
833
  }
829
834
  else {
830
835
  inicializador = this.declaracaoExpressao();
831
836
  }
832
837
  let condicao = null;
833
- if (!this.verificarTipoSimboloAtual(delegua_1.default.PONTO_E_VIRGULA)) {
838
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PONTO_E_VIRGULA)) {
834
839
  condicao = this.expressao();
835
840
  }
836
841
  // Ponto-e-vírgula é opcional aqui.
837
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
842
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
838
843
  let incrementar = null;
839
- if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
844
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
840
845
  incrementar = this.expressao();
841
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.INCREMENTAR, delegua_1.default.DECREMENTAR);
846
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR);
842
847
  }
843
848
  if (comParenteses) {
844
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
849
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
845
850
  }
846
851
  const corpo = this.resolverDeclaracao();
847
852
  return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
@@ -850,30 +855,30 @@ class AvaliadorSintatico {
850
855
  const simboloChave = this.simbolos[this.atual - 1];
851
856
  let valor = null;
852
857
  if ([
853
- delegua_1.default.CHAVE_ESQUERDA,
854
- delegua_1.default.COLCHETE_ESQUERDO,
855
- delegua_1.default.FALSO,
856
- delegua_1.default.IDENTIFICADOR,
857
- delegua_1.default.ISTO,
858
- delegua_1.default.NEGACAO,
859
- delegua_1.default.NUMERO,
860
- delegua_1.default.NULO,
861
- delegua_1.default.PARENTESE_ESQUERDO,
862
- delegua_1.default.SUPER,
863
- delegua_1.default.TEXTO,
864
- delegua_1.default.VERDADEIRO,
858
+ delegua_2.default.CHAVE_ESQUERDA,
859
+ delegua_2.default.COLCHETE_ESQUERDO,
860
+ delegua_2.default.FALSO,
861
+ delegua_2.default.IDENTIFICADOR,
862
+ delegua_2.default.ISTO,
863
+ delegua_2.default.NEGACAO,
864
+ delegua_2.default.NUMERO,
865
+ delegua_2.default.NULO,
866
+ delegua_2.default.PARENTESE_ESQUERDO,
867
+ delegua_2.default.SUPER,
868
+ delegua_2.default.TEXTO,
869
+ delegua_2.default.VERDADEIRO,
865
870
  ].includes(this.simbolos[this.atual].tipo)) {
866
871
  valor = this.expressao();
867
872
  }
868
873
  // Ponto-e-vírgula é opcional aqui.
869
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
874
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
870
875
  return new declaracoes_1.Retorna(simboloChave, valor);
871
876
  }
872
877
  declaracaoSe() {
873
878
  const condicao = this.expressao();
874
879
  const caminhoEntao = this.resolverDeclaracao();
875
880
  let caminhoSenao = null;
876
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SENAO, delegua_1.default.SENÃO)) {
881
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
877
882
  caminhoSenao = this.resolverDeclaracao();
878
883
  }
879
884
  return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
@@ -883,16 +888,16 @@ class AvaliadorSintatico {
883
888
  this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
884
889
  }
885
890
  // Ponto-e-vírgula é opcional aqui.
886
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
891
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
887
892
  return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
888
893
  }
889
894
  declaracaoTente() {
890
895
  const simboloTente = this.simbolos[this.atual - 1];
891
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
896
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
892
897
  const blocoTente = this.blocoEscopo();
893
898
  let blocoPegue = null;
894
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PEGUE)) {
895
- if (this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_ESQUERDO)) {
899
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PEGUE)) {
900
+ if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_ESQUERDO)) {
896
901
  // Caso 1: com parâmetro de erro.
897
902
  // `pegue` recebe um `FuncaoConstruto`.
898
903
  blocoPegue = this.corpoDaFuncao('bloco `pegue`');
@@ -900,25 +905,25 @@ class AvaliadorSintatico {
900
905
  else {
901
906
  // Caso 2: sem parâmetro de erro.
902
907
  // `pegue` recebe um bloco.
903
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
908
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
904
909
  blocoPegue = this.blocoEscopo();
905
910
  }
906
911
  }
907
912
  let blocoSenao = null;
908
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SENAO, delegua_1.default.SENÃO)) {
909
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
913
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
914
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
910
915
  blocoSenao = this.blocoEscopo();
911
916
  }
912
917
  let blocoFinalmente = null;
913
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.FINALMENTE)) {
914
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
918
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.FINALMENTE)) {
919
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
915
920
  blocoFinalmente = this.blocoEscopo();
916
921
  }
917
922
  return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
918
923
  }
919
924
  resolverDecorador() {
920
925
  this.pilhaDecoradores = [];
921
- while (this.verificarTipoSimboloAtual(delegua_1.default.ARROBA)) {
926
+ while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
922
927
  let nomeDecorador = '';
923
928
  let linha;
924
929
  let parametros = [];
@@ -926,12 +931,12 @@ class AvaliadorSintatico {
926
931
  linha = this.simbolos[this.atual].linha;
927
932
  let simbolosLinhaAtual = this.simbolos.filter((l) => l.linha === linha);
928
933
  for (let simbolo of simbolosLinhaAtual) {
929
- parenteseEsquerdo = this.verificarSeSimboloAtualEIgualA(delegua_1.default.PARENTESE_ESQUERDO);
934
+ parenteseEsquerdo = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
930
935
  if (parenteseEsquerdo) {
931
- if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
936
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
932
937
  parametros = this.logicaComumParametros();
933
938
  }
934
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
939
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
935
940
  break;
936
941
  }
937
942
  this.avancarEDevolverAnterior();
@@ -950,65 +955,65 @@ class AvaliadorSintatico {
950
955
  */
951
956
  resolverDeclaracao() {
952
957
  switch (this.simbolos[this.atual].tipo) {
953
- case delegua_1.default.CHAVE_ESQUERDA:
958
+ case delegua_2.default.CHAVE_ESQUERDA:
954
959
  const simboloInicioBloco = this.avancarEDevolverAnterior();
955
960
  return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
956
- case delegua_1.default.COMENTARIO:
961
+ case delegua_2.default.COMENTARIO:
957
962
  return this.declaracaoComentarioUmaLinha();
958
- case delegua_1.default.CONSTANTE:
963
+ case delegua_2.default.CONSTANTE:
959
964
  this.avancarEDevolverAnterior();
960
965
  return this.declaracaoDeConstantes();
961
- case delegua_1.default.CONTINUA:
966
+ case delegua_2.default.CONTINUA:
962
967
  this.avancarEDevolverAnterior();
963
968
  return this.declaracaoContinua();
964
- case delegua_1.default.ENQUANTO:
969
+ case delegua_2.default.ENQUANTO:
965
970
  this.avancarEDevolverAnterior();
966
971
  return this.declaracaoEnquanto();
967
- case delegua_1.default.ESCOLHA:
972
+ case delegua_2.default.ESCOLHA:
968
973
  this.avancarEDevolverAnterior();
969
974
  return this.declaracaoEscolha();
970
- case delegua_1.default.ESCREVA:
975
+ case delegua_2.default.ESCREVA:
971
976
  this.avancarEDevolverAnterior();
972
977
  return this.declaracaoEscreva();
973
- case delegua_1.default.FALHAR:
978
+ case delegua_2.default.FALHAR:
974
979
  this.avancarEDevolverAnterior();
975
980
  return this.declaracaoFalhar();
976
- case delegua_1.default.FAZER:
981
+ case delegua_2.default.FAZER:
977
982
  this.avancarEDevolverAnterior();
978
983
  return this.declaracaoFazer();
979
- case delegua_1.default.LINHA_COMENTARIO:
984
+ case delegua_2.default.LINHA_COMENTARIO:
980
985
  return this.declaracaoComentarioMultilinha();
981
- case delegua_1.default.PARA:
986
+ case delegua_2.default.PARA:
982
987
  this.avancarEDevolverAnterior();
983
988
  return this.declaracaoPara();
984
- case delegua_1.default.PAUSA:
985
- case delegua_1.default.SUSTAR:
989
+ case delegua_2.default.PAUSA:
990
+ case delegua_2.default.SUSTAR:
986
991
  this.avancarEDevolverAnterior();
987
992
  return this.declaracaoSustar();
988
- case delegua_1.default.SE:
993
+ case delegua_2.default.SE:
989
994
  this.avancarEDevolverAnterior();
990
995
  return this.declaracaoSe();
991
- case delegua_1.default.RETORNA:
996
+ case delegua_2.default.RETORNA:
992
997
  this.avancarEDevolverAnterior();
993
998
  return this.declaracaoRetorna();
994
- case delegua_1.default.TENDO:
999
+ case delegua_2.default.TENDO:
995
1000
  this.avancarEDevolverAnterior();
996
1001
  return this.declaracaoTendoComo();
997
- case delegua_1.default.TENTE:
1002
+ case delegua_2.default.TENTE:
998
1003
  this.avancarEDevolverAnterior();
999
1004
  return this.declaracaoTente();
1000
- case delegua_1.default.VARIAVEL:
1005
+ case delegua_2.default.VARIAVEL:
1001
1006
  this.avancarEDevolverAnterior();
1002
1007
  return this.declaracaoDeVariaveis();
1003
1008
  }
1004
1009
  const simboloAtual = this.simbolos[this.atual];
1005
- if (simboloAtual.tipo === delegua_1.default.IDENTIFICADOR) {
1010
+ if (simboloAtual.tipo === delegua_2.default.IDENTIFICADOR) {
1006
1011
  // Pela gramática, a seguinte situação não pode ocorrer:
1007
1012
  // 1. O símbolo anterior ser um identificador; e
1008
1013
  // 2. O símbolo anterior estar na mesma linha do identificador atual.
1009
1014
  const simboloAnterior = this.simbolos[this.atual - 1];
1010
1015
  if (!!simboloAnterior &&
1011
- simboloAnterior.tipo === delegua_1.default.IDENTIFICADOR &&
1016
+ simboloAnterior.tipo === delegua_2.default.IDENTIFICADOR &&
1012
1017
  simboloAnterior.linha === simboloAtual.linha) {
1013
1018
  this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
1014
1019
  }
@@ -1018,19 +1023,19 @@ class AvaliadorSintatico {
1018
1023
  declaracaoTendoComo() {
1019
1024
  const simboloTendo = this.simbolos[this.atual - 1];
1020
1025
  const expressaoInicializacao = this.expressao();
1021
- this.consumir(delegua_1.default.COMO, "Esperado palavra reservada 'como' após expressão de inicialização de variável, em declaração 'tendo'.");
1022
- const simboloNomeVariavel = this.consumir(delegua_1.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
1023
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
1026
+ this.consumir(delegua_2.default.COMO, "Esperado palavra reservada 'como' após expressão de inicialização de variável, em declaração 'tendo'.");
1027
+ const simboloNomeVariavel = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
1028
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
1024
1029
  const blocoCorpo = this.blocoEscopo();
1025
1030
  return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
1026
1031
  }
1027
1032
  declaracaoDesestruturacaoVariavel() {
1028
1033
  const identificadores = [];
1029
1034
  do {
1030
- identificadores.push(this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1031
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1032
- this.consumir(delegua_1.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
1033
- this.consumir(delegua_1.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
1035
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1036
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1037
+ this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
1038
+ this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
1034
1039
  const inicializador = this.expressao();
1035
1040
  // TODO: Para cada variável dos identificadores, emitir um `AcessoMetodoOuPropriedade` usando
1036
1041
  // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
@@ -1048,45 +1053,45 @@ class AvaliadorSintatico {
1048
1053
  const identificadores = [];
1049
1054
  let retorno = [];
1050
1055
  let tipo = null;
1051
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_ESQUERDA)) {
1056
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1052
1057
  return this.declaracaoDesestruturacaoVariavel();
1053
1058
  }
1054
1059
  do {
1055
- identificadores.push(this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1056
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1057
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DOIS_PONTOS)) {
1060
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1061
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1062
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1058
1063
  tipo = this.verificarDefinicaoTipoAtual();
1059
1064
  this.avancarEDevolverAnterior();
1060
1065
  }
1061
- if (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.IGUAL)) {
1066
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1062
1067
  // Inicialização de variáveis sem valor.
1063
1068
  for (let [indice, identificador] of identificadores.entries()) {
1064
1069
  retorno.push(new declaracoes_1.Var(identificador, null, tipo));
1065
1070
  }
1066
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
1071
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1067
1072
  return retorno;
1068
1073
  }
1069
1074
  const inicializadores = [];
1070
1075
  do {
1071
1076
  inicializadores.push(this.expressao());
1072
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1077
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1073
1078
  if (identificadores.length !== inicializadores.length) {
1074
1079
  throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1075
1080
  }
1076
1081
  for (let [indice, identificador] of identificadores.entries()) {
1077
- tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_2.default.TUPLA : tipo;
1082
+ tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
1078
1083
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
1079
1084
  }
1080
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
1085
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1081
1086
  return retorno;
1082
1087
  }
1083
1088
  declaracaoDesestruturacaoConstante() {
1084
1089
  const identificadores = [];
1085
1090
  do {
1086
- identificadores.push(this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1087
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1088
- this.consumir(delegua_1.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
1089
- this.consumir(delegua_1.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
1091
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1092
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1093
+ this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
1094
+ this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
1090
1095
  const inicializador = this.expressao();
1091
1096
  // TODO: Para cada variável dos identificadores, emitir um `AcessoMetodoOuPropriedade` usando
1092
1097
  // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
@@ -1103,21 +1108,21 @@ class AvaliadorSintatico {
1103
1108
  declaracaoDeConstantes() {
1104
1109
  const identificadores = [];
1105
1110
  let tipo = null;
1106
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_ESQUERDA)) {
1111
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1107
1112
  return this.declaracaoDesestruturacaoConstante();
1108
1113
  }
1109
1114
  do {
1110
- identificadores.push(this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da constante.'));
1111
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1112
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DOIS_PONTOS)) {
1115
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da constante.'));
1116
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1117
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1113
1118
  tipo = this.verificarDefinicaoTipoAtual();
1114
1119
  this.avancarEDevolverAnterior();
1115
1120
  }
1116
- this.consumir(delegua_1.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
1121
+ this.consumir(delegua_2.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
1117
1122
  const inicializadores = [];
1118
1123
  do {
1119
1124
  inicializadores.push(this.expressao());
1120
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1125
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1121
1126
  if (identificadores.length !== inicializadores.length) {
1122
1127
  throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1123
1128
  }
@@ -1125,18 +1130,18 @@ class AvaliadorSintatico {
1125
1130
  for (let [indice, identificador] of identificadores.entries()) {
1126
1131
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
1127
1132
  }
1128
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
1133
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1129
1134
  return retorno;
1130
1135
  }
1131
1136
  funcao(tipo) {
1132
1137
  let simbolo;
1133
1138
  switch (this.simbolos[this.atual].tipo) {
1134
- case delegua_1.default.CONSTRUTOR:
1139
+ case delegua_2.default.CONSTRUTOR:
1135
1140
  simbolo = this.avancarEDevolverAnterior();
1136
1141
  this.pilhaDecoradores = [];
1137
1142
  break;
1138
1143
  default:
1139
- simbolo = this.consumir(delegua_1.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
1144
+ simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
1140
1145
  break;
1141
1146
  }
1142
1147
  return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, this.pilhaDecoradores);
@@ -1145,18 +1150,18 @@ class AvaliadorSintatico {
1145
1150
  const parametros = [];
1146
1151
  do {
1147
1152
  const parametro = {};
1148
- if (this.simbolos[this.atual].tipo === delegua_1.default.MULTIPLICACAO) {
1149
- this.consumir(delegua_1.default.MULTIPLICACAO, null);
1153
+ if (this.simbolos[this.atual].tipo === delegua_2.default.MULTIPLICACAO) {
1154
+ this.consumir(delegua_2.default.MULTIPLICACAO, null);
1150
1155
  parametro.abrangencia = 'multiplo';
1151
1156
  }
1152
1157
  else {
1153
1158
  parametro.abrangencia = 'padrao';
1154
1159
  }
1155
- parametro.nome = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
1156
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.IGUAL)) {
1160
+ parametro.nome = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
1161
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1157
1162
  parametro.valorPadrao = this.primario();
1158
1163
  }
1159
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DOIS_PONTOS)) {
1164
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1160
1165
  let tipoDadoParametro = this.verificarDefinicaoTipoAtual();
1161
1166
  parametro.tipoDado = {
1162
1167
  nome: this.simbolos[this.atual - 2].lexema,
@@ -1168,43 +1173,43 @@ class AvaliadorSintatico {
1168
1173
  parametros.push(parametro);
1169
1174
  if (parametro.abrangencia === 'multiplo')
1170
1175
  break;
1171
- } while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
1176
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1172
1177
  return parametros;
1173
1178
  }
1174
1179
  corpoDaFuncao(tipo) {
1175
1180
  // O parêntese esquerdo é considerado o símbolo inicial para
1176
1181
  // fins de pragma.
1177
- const parenteseEsquerdo = this.consumir(delegua_1.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
1182
+ const parenteseEsquerdo = this.consumir(delegua_2.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
1178
1183
  let parametros = [];
1179
- if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
1184
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1180
1185
  parametros = this.logicaComumParametros();
1181
1186
  }
1182
- this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1187
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1183
1188
  let tipoRetorno = null;
1184
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DOIS_PONTOS)) {
1189
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1185
1190
  tipoRetorno = this.verificarDefinicaoTipoAtual();
1186
1191
  this.avancarEDevolverAnterior();
1187
1192
  }
1188
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1193
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1189
1194
  const corpo = this.blocoEscopo();
1190
1195
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
1191
1196
  }
1192
1197
  declaracaoDeClasse() {
1193
- const simbolo = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
1198
+ const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
1194
1199
  const pilhaDecoradoresClasse = this.pilhaDecoradores;
1195
1200
  let superClasse = null;
1196
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.HERDA)) {
1197
- this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
1201
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
1202
+ this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
1198
1203
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
1199
1204
  }
1200
- this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
1205
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
1201
1206
  this.pilhaDecoradores = [];
1202
1207
  const metodos = [];
1203
1208
  const propriedades = [];
1204
- while (!this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
1209
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
1205
1210
  // Se o símbolo atual é arroba, é um decorador.
1206
1211
  // Caso contrário, verificamos o próximo símbolo.
1207
- if (this.simbolos[this.atual].tipo === delegua_1.default.ARROBA) {
1212
+ if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
1208
1213
  this.resolverDecorador();
1209
1214
  continue;
1210
1215
  }
@@ -1212,15 +1217,15 @@ class AvaliadorSintatico {
1212
1217
  // Caso contrário, é uma propriedade.
1213
1218
  const proximoSimbolo = this.simbolos[this.atual + 1];
1214
1219
  switch (proximoSimbolo.tipo) {
1215
- case delegua_1.default.PARENTESE_ESQUERDO:
1220
+ case delegua_2.default.PARENTESE_ESQUERDO:
1216
1221
  metodos.push(this.funcao('método'));
1217
1222
  this.pilhaDecoradores = [];
1218
1223
  break;
1219
- case delegua_1.default.DOIS_PONTOS:
1220
- const nomePropriedade = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
1221
- this.consumir(delegua_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
1224
+ case delegua_2.default.DOIS_PONTOS:
1225
+ const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
1226
+ this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
1222
1227
  const tipoPropriedade = this.avancarEDevolverAnterior();
1223
- this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA);
1228
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1224
1229
  propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
1225
1230
  this.pilhaDecoradores = [];
1226
1231
  break;
@@ -1228,7 +1233,7 @@ class AvaliadorSintatico {
1228
1233
  throw this.erro(this.simbolos[this.atual], 'Esperado definição de método ou propriedade.');
1229
1234
  }
1230
1235
  }
1231
- this.consumir(delegua_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
1236
+ this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
1232
1237
  return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
1233
1238
  }
1234
1239
  /**
@@ -1241,13 +1246,13 @@ class AvaliadorSintatico {
1241
1246
  */
1242
1247
  resolverDeclaracaoForaDeBloco() {
1243
1248
  try {
1244
- if ((this.verificarTipoSimboloAtual(delegua_1.default.FUNCAO) ||
1245
- this.verificarTipoSimboloAtual(delegua_1.default.FUNÇÃO)) &&
1246
- this.verificarTipoProximoSimbolo(delegua_1.default.IDENTIFICADOR)) {
1249
+ if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1250
+ this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1251
+ this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
1247
1252
  this.avancarEDevolverAnterior();
1248
1253
  return this.funcao('funcao');
1249
1254
  }
1250
- if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CLASSE)) {
1255
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CLASSE)) {
1251
1256
  return this.declaracaoDeClasse();
1252
1257
  }
1253
1258
  return this.resolverDeclaracao();
@@ -1268,15 +1273,15 @@ class AvaliadorSintatico {
1268
1273
  while (!this.estaNoFinal()) {
1269
1274
  const tipoSimboloAtual = this.simbolos[this.atual - 1].tipo;
1270
1275
  switch (tipoSimboloAtual) {
1271
- case delegua_1.default.CLASSE:
1272
- case delegua_1.default.FUNCAO:
1273
- case delegua_1.default.FUNÇÃO:
1274
- case delegua_1.default.VARIAVEL:
1275
- case delegua_1.default.PARA:
1276
- case delegua_1.default.SE:
1277
- case delegua_1.default.ENQUANTO:
1278
- case delegua_1.default.ESCREVA:
1279
- case delegua_1.default.RETORNA:
1276
+ case delegua_2.default.CLASSE:
1277
+ case delegua_2.default.FUNCAO:
1278
+ case delegua_2.default.FUNÇÃO:
1279
+ case delegua_2.default.VARIAVEL:
1280
+ case delegua_2.default.PARA:
1281
+ case delegua_2.default.SE:
1282
+ case delegua_2.default.ENQUANTO:
1283
+ case delegua_2.default.ESCREVA:
1284
+ case delegua_2.default.RETORNA:
1280
1285
  return;
1281
1286
  }
1282
1287
  this.avancarEDevolverAnterior();
@@ -3410,7 +3415,7 @@ exports.tupla = exports.todosEmCondicao = exports.texto = exports.tamanho = expo
3410
3415
  const excecoes_1 = require("../excecoes");
3411
3416
  const objeto_delegua_classe_1 = require("../estruturas/objeto-delegua-classe");
3412
3417
  const funcao_padrao_1 = require("../estruturas/funcao-padrao");
3413
- const delegua_classe_1 = require("../estruturas/delegua-classe");
3418
+ const descritor_tipo_classe_1 = require("../estruturas/descritor-tipo-classe");
3414
3419
  const estruturas_1 = require("../estruturas");
3415
3420
  const construtos_1 = require("../construtos");
3416
3421
  /**
@@ -3815,7 +3820,7 @@ async function tamanho(interpretador, objeto) {
3815
3820
  if (valorObjeto instanceof funcao_padrao_1.FuncaoPadrao) {
3816
3821
  return Promise.resolve(valorObjeto.valorAridade);
3817
3822
  }
3818
- if (valorObjeto instanceof delegua_classe_1.DeleguaClasse) {
3823
+ if (valorObjeto instanceof descritor_tipo_classe_1.DescritorTipoClasse) {
3819
3824
  const metodos = valorObjeto.metodos;
3820
3825
  let tamanho = 0;
3821
3826
  if (metodos.inicializacao && metodos.inicializacao.eInicializador) {
@@ -3903,7 +3908,7 @@ async function tupla(interpretador, vetor) {
3903
3908
  }
3904
3909
  exports.tupla = tupla;
3905
3910
 
3906
- },{"../construtos":39,"../estruturas":100,"../estruturas/delegua-classe":97,"../estruturas/funcao-padrao":99,"../estruturas/objeto-delegua-classe":103,"../excecoes":106}],16:[function(require,module,exports){
3911
+ },{"../construtos":39,"../estruturas":100,"../estruturas/descritor-tipo-classe":98,"../estruturas/funcao-padrao":99,"../estruturas/objeto-delegua-classe":103,"../excecoes":106}],16:[function(require,module,exports){
3907
3912
  "use strict";
3908
3913
  Object.defineProperty(exports, "__esModule", { value: true });
3909
3914
  exports.default = {
@@ -4171,11 +4176,17 @@ exports.Atribuir = void 0;
4171
4176
  * Construto de atribuição de um valor a um símbolo.
4172
4177
  */
4173
4178
  class Atribuir {
4174
- constructor(hashArquivo, simbolo, valor) {
4179
+ constructor(hashArquivo, simbolo, valor,
4180
+ // indice so é usado para variaveis de vetores
4181
+ // TODO: criar alguma validaçao para garantir que indice so seja passado para variaveis de vetores
4182
+ indice) {
4175
4183
  this.linha = Number(simbolo.linha);
4176
4184
  this.hashArquivo = hashArquivo;
4177
4185
  this.simbolo = simbolo;
4178
4186
  this.valor = valor;
4187
+ if (indice !== undefined) {
4188
+ this.indice = indice;
4189
+ }
4179
4190
  }
4180
4191
  async aceitar(visitante) {
4181
4192
  return await visitante.visitarExpressaoDeAtribuicao(this);
@@ -5656,85 +5667,6 @@ exports.ClassePadrao = ClassePadrao;
5656
5667
  },{"./chamavel":95}],97:[function(require,module,exports){
5657
5668
  "use strict";
5658
5669
  Object.defineProperty(exports, "__esModule", { value: true });
5659
- exports.DeleguaClasse = void 0;
5660
- const excecoes_1 = require("../excecoes");
5661
- const chamavel_1 = require("./chamavel");
5662
- const objeto_delegua_classe_1 = require("./objeto-delegua-classe");
5663
- /**
5664
- * Estrutura de declaração de classe.
5665
- */
5666
- class DeleguaClasse extends chamavel_1.Chamavel {
5667
- constructor(simboloOriginal, superClasse, metodos, propriedades) {
5668
- super();
5669
- this.simboloOriginal = simboloOriginal;
5670
- this.superClasse = superClasse;
5671
- this.metodos = metodos || {};
5672
- this.propriedades = propriedades || [];
5673
- this.dialetoRequerDeclaracaoPropriedades = false;
5674
- }
5675
- encontrarMetodo(nome) {
5676
- if (this.metodos.hasOwnProperty(nome)) {
5677
- return this.metodos[nome];
5678
- }
5679
- if (this.superClasse !== null && this.superClasse !== undefined) {
5680
- return this.superClasse.encontrarMetodo(nome);
5681
- }
5682
- return undefined;
5683
- }
5684
- encontrarPropriedade(nome) {
5685
- if (nome in this.propriedades) {
5686
- return this.propriedades[nome];
5687
- }
5688
- if (this.superClasse !== null && this.superClasse !== undefined) {
5689
- return this.superClasse.encontrarPropriedade(nome);
5690
- }
5691
- if (this.dialetoRequerDeclaracaoPropriedades) {
5692
- throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${this.simboloOriginal.lexema}.`);
5693
- }
5694
- return undefined;
5695
- }
5696
- /**
5697
- * Método utilizado por Delégua para representar esta classe quando impressa.
5698
- * @returns {string} A representação da classe como texto.
5699
- */
5700
- paraTexto() {
5701
- let texto = `<classe ${this.simboloOriginal.lexema}`;
5702
- for (let propriedade of this.propriedades) {
5703
- texto += ` ${propriedade.nome}`;
5704
- if (propriedade.tipo) {
5705
- texto += `:${propriedade.tipo}`;
5706
- }
5707
- texto += ' ';
5708
- }
5709
- texto += '>';
5710
- return texto;
5711
- }
5712
- /**
5713
- * Método utilizado pelo VSCode para inspecionar esta classe em depuração.
5714
- * @returns {string} A representação da classe como texto.
5715
- */
5716
- toString() {
5717
- return this.paraTexto();
5718
- }
5719
- aridade() {
5720
- const inicializador = this.encontrarMetodo('construtor');
5721
- return inicializador ? inicializador.aridade() : 0;
5722
- }
5723
- async chamar(visitante, argumentos) {
5724
- const instancia = new objeto_delegua_classe_1.ObjetoDeleguaClasse(this);
5725
- const inicializador = this.encontrarMetodo('construtor');
5726
- if (inicializador) {
5727
- const metodoConstrutor = inicializador.funcaoPorMetodoDeClasse(instancia);
5728
- await metodoConstrutor.chamar(visitante, argumentos);
5729
- }
5730
- return instancia;
5731
- }
5732
- }
5733
- exports.DeleguaClasse = DeleguaClasse;
5734
-
5735
- },{"../excecoes":106,"./chamavel":95,"./objeto-delegua-classe":103}],98:[function(require,module,exports){
5736
- "use strict";
5737
- Object.defineProperty(exports, "__esModule", { value: true });
5738
5670
  exports.DeleguaFuncao = void 0;
5739
5671
  const chamavel_1 = require("./chamavel");
5740
5672
  const espaco_variaveis_1 = require("../espaco-variaveis");
@@ -5796,7 +5728,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
5796
5728
  }
5797
5729
  resolverParametrosEspalhados(argumentos, indiceArgumentoAtual) {
5798
5730
  const argumentosResolvidos = [];
5799
- for (let i = indiceArgumentoAtual; i < argumentos.length; indiceArgumentoAtual++) {
5731
+ for (let i = indiceArgumentoAtual; i < argumentos.length; i++) {
5800
5732
  const argumentoAtual = argumentos[i];
5801
5733
  argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor') ? argumentoAtual.valor : argumentoAtual);
5802
5734
  }
@@ -5875,7 +5807,88 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
5875
5807
  }
5876
5808
  exports.DeleguaFuncao = DeleguaFuncao;
5877
5809
 
5878
- },{"../declaracoes":77,"../espaco-variaveis":94,"../interpretador/inferenciador":134,"../quebras":153,"./chamavel":95}],99:[function(require,module,exports){
5810
+ },{"../declaracoes":77,"../espaco-variaveis":94,"../interpretador/inferenciador":134,"../quebras":153,"./chamavel":95}],98:[function(require,module,exports){
5811
+ "use strict";
5812
+ Object.defineProperty(exports, "__esModule", { value: true });
5813
+ exports.DescritorTipoClasse = void 0;
5814
+ const excecoes_1 = require("../excecoes");
5815
+ const chamavel_1 = require("./chamavel");
5816
+ const objeto_delegua_classe_1 = require("./objeto-delegua-classe");
5817
+ /**
5818
+ * Descritor de tipo de classe. Quando uma declaração de classe é visitada, o que
5819
+ * vai para a pilha de escopos de execução é esta estrutura. Quando uma nova instância
5820
+ * de classe é criada, a referência para a instância é implementada aqui.
5821
+ */
5822
+ class DescritorTipoClasse extends chamavel_1.Chamavel {
5823
+ constructor(simboloOriginal, superClasse, metodos, propriedades) {
5824
+ super();
5825
+ this.simboloOriginal = simboloOriginal;
5826
+ this.superClasse = superClasse;
5827
+ this.metodos = metodos || {};
5828
+ this.propriedades = propriedades || [];
5829
+ this.dialetoRequerDeclaracaoPropriedades = false;
5830
+ }
5831
+ encontrarMetodo(nome) {
5832
+ if (this.metodos.hasOwnProperty(nome)) {
5833
+ return this.metodos[nome];
5834
+ }
5835
+ if (this.superClasse !== null && this.superClasse !== undefined) {
5836
+ return this.superClasse.encontrarMetodo(nome);
5837
+ }
5838
+ return undefined;
5839
+ }
5840
+ encontrarPropriedade(nome) {
5841
+ if (nome in this.propriedades) {
5842
+ return this.propriedades[nome];
5843
+ }
5844
+ if (this.superClasse !== null && this.superClasse !== undefined) {
5845
+ return this.superClasse.encontrarPropriedade(nome);
5846
+ }
5847
+ if (this.dialetoRequerDeclaracaoPropriedades) {
5848
+ throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${this.simboloOriginal.lexema}.`);
5849
+ }
5850
+ return undefined;
5851
+ }
5852
+ /**
5853
+ * Método utilizado por Delégua para representar esta classe quando impressa.
5854
+ * @returns {string} A representação da classe como texto.
5855
+ */
5856
+ paraTexto() {
5857
+ let texto = `<classe ${this.simboloOriginal.lexema}`;
5858
+ for (let propriedade of this.propriedades) {
5859
+ texto += ` ${propriedade.nome.lexema}`;
5860
+ if (propriedade.tipo) {
5861
+ texto += `:${propriedade.tipo}`;
5862
+ }
5863
+ texto += ' ';
5864
+ }
5865
+ texto += '>';
5866
+ return texto;
5867
+ }
5868
+ /**
5869
+ * Método utilizado pelo VSCode para inspecionar esta classe em depuração.
5870
+ * @returns {string} A representação da classe como texto.
5871
+ */
5872
+ toString() {
5873
+ return this.paraTexto();
5874
+ }
5875
+ aridade() {
5876
+ const inicializador = this.encontrarMetodo('construtor');
5877
+ return inicializador ? inicializador.aridade() : 0;
5878
+ }
5879
+ async chamar(visitante, argumentos) {
5880
+ const instancia = new objeto_delegua_classe_1.ObjetoDeleguaClasse(this);
5881
+ const inicializador = this.encontrarMetodo('construtor');
5882
+ if (inicializador) {
5883
+ const metodoConstrutor = inicializador.funcaoPorMetodoDeClasse(instancia);
5884
+ await metodoConstrutor.chamar(visitante, argumentos);
5885
+ }
5886
+ return instancia;
5887
+ }
5888
+ }
5889
+ exports.DescritorTipoClasse = DescritorTipoClasse;
5890
+
5891
+ },{"../excecoes":106,"./chamavel":95,"./objeto-delegua-classe":103}],99:[function(require,module,exports){
5879
5892
  "use strict";
5880
5893
  Object.defineProperty(exports, "__esModule", { value: true });
5881
5894
  exports.FuncaoPadrao = void 0;
@@ -5930,7 +5943,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
5930
5943
  Object.defineProperty(exports, "__esModule", { value: true });
5931
5944
  __exportStar(require("./chamavel"), exports);
5932
5945
  __exportStar(require("./classe-padrao"), exports);
5933
- __exportStar(require("./delegua-classe"), exports);
5946
+ __exportStar(require("./descritor-tipo-classe"), exports);
5934
5947
  __exportStar(require("./funcao-padrao"), exports);
5935
5948
  __exportStar(require("./delegua-funcao"), exports);
5936
5949
  __exportStar(require("./metodo-primitiva"), exports);
@@ -5938,7 +5951,7 @@ __exportStar(require("./modulo"), exports);
5938
5951
  __exportStar(require("./objeto-delegua-classe"), exports);
5939
5952
  __exportStar(require("./objeto-padrao"), exports);
5940
5953
 
5941
- },{"./chamavel":95,"./classe-padrao":96,"./delegua-classe":97,"./delegua-funcao":98,"./funcao-padrao":99,"./metodo-primitiva":101,"./modulo":102,"./objeto-delegua-classe":103,"./objeto-padrao":104}],101:[function(require,module,exports){
5954
+ },{"./chamavel":95,"./classe-padrao":96,"./delegua-funcao":97,"./descritor-tipo-classe":98,"./funcao-padrao":99,"./metodo-primitiva":101,"./modulo":102,"./objeto-delegua-classe":103,"./objeto-padrao":104}],101:[function(require,module,exports){
5942
5955
  "use strict";
5943
5956
  Object.defineProperty(exports, "__esModule", { value: true });
5944
5957
  exports.MetodoPrimitiva = void 0;
@@ -6014,7 +6027,7 @@ const excecoes_1 = require("../excecoes");
6014
6027
  /**
6015
6028
  * A instância de uma classe em Delégua.
6016
6029
  * Possui propriedades e métodos. Propriedades são definidas localmente.
6017
- * Métodos são extraídos da definição de classe.
6030
+ * Métodos são extraídos do descritor da classe, uma `DeleguaClasse`.
6018
6031
  */
6019
6032
  class ObjetoDeleguaClasse {
6020
6033
  constructor(classe) {
@@ -7686,7 +7699,7 @@ class InterpretadorBase {
7686
7699
  if (entidadeChamada instanceof estruturas_1.DeleguaFuncao) {
7687
7700
  return entidadeChamada.declaracao.parametros;
7688
7701
  }
7689
- if (entidadeChamada instanceof estruturas_1.DeleguaClasse) {
7702
+ if (entidadeChamada instanceof estruturas_1.DescritorTipoClasse) {
7690
7703
  return entidadeChamada.metodos.construtor
7691
7704
  ? entidadeChamada.metodos.construtor.declaracao.parametros
7692
7705
  : [];
@@ -7753,7 +7766,7 @@ class InterpretadorBase {
7753
7766
  });
7754
7767
  }
7755
7768
  }
7756
- // Por algum motivo misterioso, `entidadeChamada instanceof Chamavel` dá `false` em Liquido,
7769
+ // Por algum motivo misterioso, `entidadeChamada instanceof Chamavel` dá `false` em Liquido,
7757
7770
  // mesmo que esteja tudo certo com `DeleguaFuncao`,
7758
7771
  // então precisamos testar o nome do construtor também.
7759
7772
  if (entidadeChamada instanceof estruturas_1.Chamavel || entidadeChamada.constructor.name === 'DeleguaFuncao') {
@@ -7788,7 +7801,11 @@ class InterpretadorBase {
7788
7801
  async visitarExpressaoDeAtribuicao(expressao) {
7789
7802
  const valor = await this.avaliar(expressao.valor);
7790
7803
  const valorResolvido = valor !== undefined && valor.hasOwnProperty('valor') ? valor.valor : valor;
7791
- this.pilhaEscoposExecucao.atribuirVariavel(expressao.simbolo, valorResolvido);
7804
+ let indice = null;
7805
+ if (expressao.indice) {
7806
+ indice = await this.avaliar(expressao.indice);
7807
+ }
7808
+ this.pilhaEscoposExecucao.atribuirVariavel(expressao.simbolo, valorResolvido, indice);
7792
7809
  return valorResolvido;
7793
7810
  }
7794
7811
  procurarVariavel(simbolo) {
@@ -8190,7 +8207,7 @@ class InterpretadorBase {
8190
8207
  else if (objeto.constructor === Object ||
8191
8208
  objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
8192
8209
  objeto instanceof estruturas_1.DeleguaFuncao ||
8193
- objeto instanceof estruturas_1.DeleguaClasse ||
8210
+ objeto instanceof estruturas_1.DescritorTipoClasse ||
8194
8211
  objeto instanceof estruturas_1.DeleguaModulo) {
8195
8212
  objeto[indice] = valor;
8196
8213
  }
@@ -8218,14 +8235,17 @@ class InterpretadorBase {
8218
8235
  }
8219
8236
  return objeto[valorIndice];
8220
8237
  }
8221
- else if (objeto.constructor === Object ||
8238
+ if (objeto instanceof construtos_1.Vetor) {
8239
+ return objeto.valores[valorIndice];
8240
+ }
8241
+ if (objeto.constructor === Object ||
8222
8242
  objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
8223
8243
  objeto instanceof estruturas_1.DeleguaFuncao ||
8224
- objeto instanceof estruturas_1.DeleguaClasse ||
8244
+ objeto instanceof estruturas_1.DescritorTipoClasse ||
8225
8245
  objeto instanceof estruturas_1.DeleguaModulo) {
8226
8246
  return objeto[valorIndice] || null;
8227
8247
  }
8228
- else if (typeof objeto === primitivos_1.default.TEXTO) {
8248
+ if (typeof objeto === primitivos_1.default.TEXTO) {
8229
8249
  if (!Number.isInteger(valorIndice)) {
8230
8250
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Somente inteiros podem ser usados para indexar um vetor.', expressao.linha));
8231
8251
  }
@@ -8239,9 +8259,7 @@ class InterpretadorBase {
8239
8259
  }
8240
8260
  return objeto.charAt(valorIndice);
8241
8261
  }
8242
- else {
8243
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.entidadeChamada.nome, 'Somente listas, dicionários, classes e objetos podem ter seus valores indexados.', expressao.linha));
8244
- }
8262
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.entidadeChamada.nome, 'Somente listas, dicionários, classes e objetos podem ter seus valores indexados.', expressao.linha));
8245
8263
  }
8246
8264
  async visitarExpressaoDefinirValor(expressao) {
8247
8265
  const variavelObjeto = await this.avaliar(expressao.objeto);
@@ -8264,6 +8282,7 @@ class InterpretadorBase {
8264
8282
  }
8265
8283
  /**
8266
8284
  * Executa uma declaração de classe.
8285
+ * Uma variável do tipo `DeleguaClasse` é adicionada à pilha de escopos de execução.
8267
8286
  * @param declaracao A declaração de classe.
8268
8287
  * @returns Sempre retorna nulo, por ser requerido pelo contrato de visita.
8269
8288
  */
@@ -8272,7 +8291,7 @@ class InterpretadorBase {
8272
8291
  if (declaracao.superClasse !== null && declaracao.superClasse !== undefined) {
8273
8292
  const variavelSuperClasse = await this.avaliar(declaracao.superClasse);
8274
8293
  superClasse = variavelSuperClasse.valor;
8275
- if (!(superClasse instanceof estruturas_1.DeleguaClasse)) {
8294
+ if (!(superClasse instanceof estruturas_1.DescritorTipoClasse)) {
8276
8295
  throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.superClasse.nome, 'Superclasse precisa ser uma classe.', declaracao.linha);
8277
8296
  }
8278
8297
  }
@@ -8289,15 +8308,15 @@ class InterpretadorBase {
8289
8308
  const funcao = new estruturas_1.DeleguaFuncao(metodoAtual.simbolo.lexema, metodoAtual.funcao, undefined, eInicializador);
8290
8309
  metodos[metodoAtual.simbolo.lexema] = funcao;
8291
8310
  }
8292
- const deleguaClasse = new estruturas_1.DeleguaClasse(declaracao.simbolo, superClasse, metodos, declaracao.propriedades);
8293
- deleguaClasse.dialetoRequerExpansaoPropriedadesEspacoVariaveis =
8311
+ const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClasse, metodos, declaracao.propriedades);
8312
+ descritorTipoClasse.dialetoRequerExpansaoPropriedadesEspacoVariaveis =
8294
8313
  this.expandirPropriedadesDeObjetosEmEspacoVariaveis;
8295
- deleguaClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
8314
+ descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
8296
8315
  // TODO: Recolocar isso se for necessário.
8297
8316
  /* if (superClasse !== null) {
8298
8317
  this.ambiente = this.ambiente.enclosing;
8299
8318
  } */
8300
- this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, deleguaClasse);
8319
+ this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
8301
8320
  return null;
8302
8321
  }
8303
8322
  /**
@@ -8307,15 +8326,15 @@ class InterpretadorBase {
8307
8326
  */
8308
8327
  async visitarExpressaoAcessoMetodo(expressao) {
8309
8328
  let variavelObjeto = await this.avaliar(expressao.objeto);
8310
- // Este caso acontece quando há encadeamento de métodos.
8329
+ // Este caso acontece quando há encadeamento de métodos.
8311
8330
  // Por exemplo, `objeto1.metodo1().metodo2()`.
8312
- // Como `RetornoQuebra` também possui `valor`, precisamos extrair o
8331
+ // Como `RetornoQuebra` também possui `valor`, precisamos extrair o
8313
8332
  // valor dele primeiro.
8314
8333
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
8315
8334
  variavelObjeto = variavelObjeto.valor;
8316
8335
  }
8317
8336
  const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
8318
- // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
8337
+ // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
8319
8338
  // então testamos também o nome do construtor.
8320
8339
  if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto.constructor.name === 'ObjetoDeleguaClasse') {
8321
8340
  return objeto.obter(expressao.simbolo) || null;
@@ -9294,7 +9313,7 @@ class PilhaEscoposExecucao {
9294
9313
  imutavel: false,
9295
9314
  };
9296
9315
  }
9297
- atribuirVariavel(simbolo, valor) {
9316
+ atribuirVariavel(simbolo, valor, indice) {
9298
9317
  for (let i = 1; i <= this.pilha.length; i++) {
9299
9318
  const ambiente = this.pilha[this.pilha.length - i].ambiente;
9300
9319
  if (ambiente.valores[simbolo.lexema] !== undefined) {
@@ -9304,11 +9323,21 @@ class PilhaEscoposExecucao {
9304
9323
  }
9305
9324
  const tipo = (variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : (0, inferenciador_1.inferirTipoVariavel)(valor)).toLowerCase();
9306
9325
  const valorResolvido = this.converterValor(tipo, valor);
9307
- ambiente.valores[simbolo.lexema] = {
9308
- valor: valorResolvido,
9309
- tipo,
9310
- imutavel: false,
9311
- };
9326
+ if (indice !== undefined && indice !== null) {
9327
+ if (variavel.valor instanceof Array) {
9328
+ variavel.valor[indice] = valorResolvido;
9329
+ }
9330
+ else {
9331
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, "Variável não é um vetor.");
9332
+ }
9333
+ }
9334
+ else {
9335
+ ambiente.valores[simbolo.lexema] = {
9336
+ valor: valorResolvido,
9337
+ tipo,
9338
+ imutavel: false,
9339
+ };
9340
+ }
9312
9341
  return;
9313
9342
  }
9314
9343
  }
@@ -9385,7 +9414,7 @@ class PilhaEscoposExecucao {
9385
9414
  const ambiente = this.pilha[this.pilha.length - 1].ambiente;
9386
9415
  for (const [nome, corpo] of Object.entries(ambiente.valores)) {
9387
9416
  const corpoValor = corpo.hasOwnProperty('valor') ? corpo.valor : corpo;
9388
- if (corpoValor instanceof estruturas_1.DeleguaClasse) {
9417
+ if (corpoValor instanceof estruturas_1.DescritorTipoClasse) {
9389
9418
  retorno[nome] = corpoValor;
9390
9419
  }
9391
9420
  }