@designliquido/potigol 0.7.2 → 0.8.1

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.
@@ -75,9 +75,9 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
75
75
  * @param tipoRetorno O tipo de retorno da função.
76
76
  * @returns Um construto do tipo `FuncaoDeclaracao`.
77
77
  */
78
- declaracaoFuncaoPotigolIniciadaPorIgualOuSeta(simboloPrimario, parametros, tipoRetorno) {
78
+ async declaracaoFuncaoPotigolIniciadaPorIgualOuSeta(simboloPrimario, parametros, tipoRetorno) {
79
79
  const corpo = new construtos_1.FuncaoConstruto(simboloPrimario.hashArquivo, simboloPrimario.linha, parametros, [
80
- new declaracoes_1.Retorna(simboloPrimario, this.expressao()),
80
+ new declaracoes_1.Retorna(simboloPrimario, await this.expressao()),
81
81
  ]);
82
82
  if (tipoRetorno) {
83
83
  corpo.tipo = tipoRetorno.lexema;
@@ -94,15 +94,15 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
94
94
  * @param tipoRetorno O tipo de retorno da função.
95
95
  * @returns Um construto do tipo `FuncaoDeclaracao`.
96
96
  */
97
- declaracaoFuncaoPotigolTerminadaPorFim(simboloPrimario, parenteseEsquerdo, parametros, tipoRetorno) {
98
- const corpo = this.corpoDaFuncao(simboloPrimario.lexema, parenteseEsquerdo, parametros);
97
+ async declaracaoFuncaoPotigolTerminadaPorFim(simboloPrimario, parenteseEsquerdo, parametros, tipoRetorno) {
98
+ const corpo = await this.corpoDaFuncao(simboloPrimario.lexema, parenteseEsquerdo, parametros);
99
99
  if (tipoRetorno) {
100
100
  corpo.tipo = tipoRetorno.lexema;
101
101
  }
102
102
  return new declaracoes_1.FuncaoDeclaracao(simboloPrimario, corpo, tipoRetorno.lexema);
103
103
  }
104
- corpoDaFuncao(nomeFuncao, simboloLocalizacao, parametros) {
105
- const corpo = this.blocoEscopo();
104
+ async corpoDaFuncao(nomeFuncao, simboloLocalizacao, parametros) {
105
+ const corpo = await this.blocoEscopo();
106
106
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloLocalizacao.linha), parametros, corpo);
107
107
  }
108
108
  /**
@@ -112,7 +112,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
112
112
  * @param {SimboloInterface} simboloNomeFuncao Normalmente um `Simbolo` do tipo `IDENTIFICADOR`.
113
113
  * @returns
114
114
  */
115
- logicaComumDefinicaoFuncaoComNome(simboloNomeFuncao) {
115
+ async logicaComumDefinicaoFuncaoComNome(simboloNomeFuncao) {
116
116
  // O parêntese esquerdo é considerado o símbolo inicial para
117
117
  // fins de localização.
118
118
  const parenteseEsquerdo = this.avancarEDevolverAnterior();
@@ -133,26 +133,26 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
133
133
  // seja após a dica de retorno, é uma declaração de função.
134
134
  if (this.simbolos[this.atual].tipo === lexico_regular_1.default.IGUAL) {
135
135
  this.avancarEDevolverAnterior();
136
- const corpoFuncao = this.declaracaoFuncaoPotigolIniciadaPorIgualOuSeta(simboloNomeFuncao, resolucaoParametros.parametros, tipoRetorno);
136
+ const corpoFuncao = await this.declaracaoFuncaoPotigolIniciadaPorIgualOuSeta(simboloNomeFuncao, resolucaoParametros.parametros, tipoRetorno);
137
137
  return new declaracoes_1.FuncaoDeclaracao(simboloNomeFuncao, corpoFuncao, tipoRetorno ? tipoRetorno.lexema : 'qualquer');
138
138
  }
139
139
  return this.declaracaoFuncaoPotigolTerminadaPorFim(simboloNomeFuncao, parenteseEsquerdo, resolucaoParametros.parametros, tipoRetorno);
140
140
  }
141
- declaracaoDeFuncaoComDef() {
141
+ async declaracaoDeFuncaoComDef() {
142
142
  this.avancarEDevolverAnterior(); // `def`
143
143
  const simboloNomeFuncao = this.consumir(lexico_regular_1.default.IDENTIFICADOR, `Esperado nome da função após palavra reservada 'def'. Atual: ${this.simbolos[this.atual].tipo}.`);
144
- return this.logicaComumDefinicaoFuncaoComNome(simboloNomeFuncao);
144
+ return await this.logicaComumDefinicaoFuncaoComNome(simboloNomeFuncao);
145
145
  }
146
- declaracaoDeFuncaoOuMetodo(construtoPrimario) {
147
- return this.logicaComumDefinicaoFuncaoComNome(construtoPrimario.simbolo);
146
+ async declaracaoDeFuncaoOuMetodo(construtoPrimario) {
147
+ return await this.logicaComumDefinicaoFuncaoComNome(construtoPrimario.simbolo);
148
148
  }
149
- finalizarChamada(entidadeChamada) {
149
+ async finalizarChamada(entidadeChamada) {
150
150
  const simbolosEntreParenteses = [];
151
151
  while (!this.verificarTipoSimboloAtual(lexico_regular_1.default.PARENTESE_DIREITO)) {
152
152
  simbolosEntreParenteses.push(this.avancarEDevolverAnterior());
153
153
  }
154
154
  this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
155
- const argumentos = this.microAvaliadorSintatico.analisar({ simbolos: simbolosEntreParenteses }, entidadeChamada.linha);
155
+ const argumentos = await this.microAvaliadorSintatico.analisar({ simbolos: simbolosEntreParenteses }, entidadeChamada.linha);
156
156
  return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, argumentos.declaracoes.filter((d) => d));
157
157
  }
158
158
  /**
@@ -214,10 +214,10 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
214
214
  tipagemDefinida,
215
215
  };
216
216
  }
217
- logicaLeiaMultiplo() {
217
+ async logicaLeiaMultiplo() {
218
218
  const simboloLeiaMultiplo = this.avancarEDevolverAnterior();
219
219
  this.consumir(lexico_regular_1.default.PARENTESE_ESQUERDO, `Esperado parêntese esquerdo após ${simboloLeiaMultiplo.lexema}.`);
220
- const argumento = this.expressao();
220
+ const argumento = await this.expressao();
221
221
  this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, `Esperado parêntese direito após número de parâmetros em chamada de ${simboloLeiaMultiplo.lexema}.`);
222
222
  switch (simboloLeiaMultiplo.tipo) {
223
223
  case lexico_regular_1.default.LEIA_INTEIROS:
@@ -289,12 +289,12 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
289
289
  return new SeletorTuplas(...argumentos) as Tupla;
290
290
  } */
291
291
  }
292
- primario() {
292
+ async primario() {
293
293
  const simboloAtual = this.simbolos[this.atual];
294
294
  switch (simboloAtual.tipo) {
295
295
  case lexico_regular_1.default.PARENTESE_ESQUERDO:
296
296
  this.avancarEDevolverAnterior();
297
- const expressao = this.ou();
297
+ const expressao = await this.ou();
298
298
  switch (this.simbolos[this.atual].tipo) {
299
299
  case lexico_regular_1.default.DOIS_PONTOS:
300
300
  const argumentosFuncao = this.logicaArgumentosTipados(expressao);
@@ -314,7 +314,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
314
314
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
315
315
  }
316
316
  while (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.COLCHETE_DIREITO)) {
317
- const valor = this.atribuir();
317
+ const valor = await this.atribuir();
318
318
  valores.push(valor);
319
319
  if (this.simbolos[this.atual].tipo !== lexico_regular_1.default.COLCHETE_DIREITO) {
320
320
  this.consumir(lexico_regular_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
@@ -351,14 +351,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
351
351
  case lexico_regular_1.default.LEIA_INTEIROS:
352
352
  case lexico_regular_1.default.LEIA_REAIS:
353
353
  case lexico_regular_1.default.LEIA_TEXTOS:
354
- return this.logicaLeiaMultiplo();
354
+ return await this.logicaLeiaMultiplo();
355
355
  default:
356
356
  const simboloIdentificador = this.avancarEDevolverAnterior();
357
357
  return new construtos_2.ConstanteOuVariavel(this.hashArquivo, simboloIdentificador);
358
358
  }
359
359
  }
360
- formato() {
361
- const expressao = this.primario();
360
+ async formato() {
361
+ const expressao = await this.primario();
362
362
  if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.FORMATO)) {
363
363
  // O próximo símbolo precisa ser um texto no padrão "%Nd" ou "%.Nf", onde N é um inteiro.
364
364
  const simboloMascaraFormato = this.consumir(lexico_regular_1.default.TEXTO, "Esperado máscara de formato após método 'formato'.");
@@ -375,14 +375,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
375
375
  * em sequência
376
376
  * @returns Um construto, ou vindo da continuação da análise, ou um Binário.
377
377
  */
378
- concatenacaoLista() {
379
- let expressao = this.formato();
378
+ async concatenacaoLista() {
379
+ let expressao = await this.formato();
380
380
  if (this.atual < this.simbolos.length) {
381
381
  if (this.simbolos[this.atual].tipo === lexico_regular_1.default.DOIS_PONTOS &&
382
382
  this.verificarTipoProximoSimbolo(lexico_regular_1.default.DOIS_PONTOS)) {
383
383
  const primeiroDoisPontos = this.avancarEDevolverAnterior();
384
384
  this.avancarEDevolverAnterior();
385
- const ladoDireito = this.formato();
385
+ const ladoDireito = await this.formato();
386
386
  // Como aqui precisamos resolver se o lado direito é constante ou variável,
387
387
  // e a concatenação funciona para o operando direito apenas como leitura,
388
388
  // é seguro emitir um construto de constante aqui.
@@ -403,14 +403,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
403
403
  * @returns Um construto do tipo `AcessoMetodo`, `AcessoIndiceVariavel` ou `Constante`,
404
404
  * dependendo dos símbolos encontrados.
405
405
  */
406
- chamar() {
407
- let expressao = this.concatenacaoLista();
406
+ async chamar() {
407
+ let expressao = await this.concatenacaoLista();
408
408
  while (true) {
409
409
  if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO)) {
410
410
  if (expressao instanceof construtos_2.ConstanteOuVariavel) {
411
411
  expressao = new construtos_1.Constante(expressao.hashArquivo, expressao.simbolo);
412
412
  }
413
- expressao = this.finalizarChamada(expressao);
413
+ expressao = await this.finalizarChamada(expressao);
414
414
  }
415
415
  else if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PONTO)) {
416
416
  if (this.verificarTipoSimboloAtual(lexico_regular_1.default.QUAL_TIPO)) {
@@ -428,7 +428,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
428
428
  }
429
429
  }
430
430
  else if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.COLCHETE_ESQUERDO)) {
431
- const indice = this.expressao();
431
+ const indice = await this.expressao();
432
432
  const simboloFechamento = this.consumir(lexico_regular_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
433
433
  const variavelVetor = new construtos_1.Variavel(expressao.hashArquivo, expressao.simbolo);
434
434
  expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, variavelVetor, indice, simboloFechamento);
@@ -452,11 +452,11 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
452
452
  }
453
453
  return expressao;
454
454
  }
455
- comparacaoIgualdade() {
456
- let expressao = this.comparar();
455
+ async comparacaoIgualdade() {
456
+ let expressao = await this.comparar();
457
457
  while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.DIFERENTE, lexico_regular_1.default.IGUAL_IGUAL)) {
458
458
  const operador = this.simbolos[this.atual - 1];
459
- const direito = this.comparar();
459
+ const direito = await this.comparar();
460
460
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
461
461
  }
462
462
  return expressao;
@@ -511,20 +511,18 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
511
511
  }
512
512
  }
513
513
  logicaComumInferenciaTiposLeia(inicializador) {
514
- // Por algum motivo (muito) estranho, `inicializador.constructor.name` não funciona aqui.
515
- // O nome da classe vai parar numa propriedade `name`.
516
- switch (inicializador.name) {
517
- case 'LeiaInteiros':
514
+ switch (inicializador.constructor) {
515
+ case construtos_2.LeiaInteiros:
518
516
  return 'inteiro[]';
519
- case 'LeiaInteiro':
517
+ case construtos_2.LeiaInteiro:
520
518
  return 'inteiro';
521
- case 'LeiaReais':
519
+ case construtos_2.LeiaReais:
522
520
  return 'real[]';
523
- case 'LeiaReal':
521
+ case construtos_2.LeiaReal:
524
522
  return 'real';
525
- case 'LeiaTextos':
523
+ case construtos_2.LeiaTextos:
526
524
  return 'texto[]';
527
- case 'LeiaTexto':
525
+ case construtos_2.LeiaTexto:
528
526
  return 'texto';
529
527
  default:
530
528
  return 'qualquer';
@@ -533,7 +531,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
533
531
  /**
534
532
  * Em Potigol, a palavra reservada `val` indica uma constante.
535
533
  */
536
- declaracaoDeConstanteExplicita() {
534
+ async declaracaoDeConstanteExplicita() {
537
535
  this.avancarEDevolverAnterior(); // `val`
538
536
  const nomeConstante = this.consumir(lexico_regular_1.default.IDENTIFICADOR, 'Esperado nome da constante.');
539
537
  let tipo = null;
@@ -546,13 +544,13 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
546
544
  this.avancarEDevolverAnterior();
547
545
  }
548
546
  this.consumir(lexico_regular_1.default.IGUAL, "Esperado '=' após identificador em instrução 'val'.");
549
- let inicializador = this.expressao();
550
- if (['LeiaInteiro', 'LeiaReal', 'LeiaTexto'].includes(inicializador.constructor.name)) {
547
+ let inicializador = await this.expressao();
548
+ if (inicializador instanceof construtos_2.LeiaInteiro || inicializador instanceof construtos_2.LeiaReal || inicializador instanceof construtos_2.LeiaTexto) {
551
549
  inicializador = this.logicaComumInicializadorLeia(inicializador, [nomeConstante]);
552
550
  }
553
551
  return new declaracoes_1.Const(nomeConstante, inicializador, tipo);
554
552
  }
555
- declaracaoDeConstantes(primeiroIdentificador) {
553
+ async declaracaoDeConstantes(primeiroIdentificador) {
556
554
  // Normalmente o símbolo atual aqui será uma vírgula.
557
555
  this.avancarEDevolverAnterior();
558
556
  const identificadores = [primeiroIdentificador.simbolo];
@@ -574,9 +572,8 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
574
572
  this.consumir(lexico_regular_1.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
575
573
  const inicializadores = [];
576
574
  do {
577
- let inicializador = this.expressao();
578
- if (identificadores.length > 1 &&
579
- ['LeiaInteiro', 'LeiaReal', 'LeiaTexto'].includes(inicializador.constructor.name)) {
575
+ let inicializador = await this.expressao();
576
+ if (identificadores.length > 1 && (inicializador instanceof construtos_2.LeiaInteiro || inicializador instanceof construtos_2.LeiaReal || inicializador instanceof construtos_2.LeiaTexto)) {
580
577
  inicializador = this.logicaComumInicializadorLeia(inicializador, identificadores);
581
578
  }
582
579
  inicializadores.push(inicializador);
@@ -585,10 +582,12 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
585
582
  // Pode ser que a inicialização seja feita por uma das
586
583
  // funções `leia`, que podem ler vários valores. Neste caso, não deve dar erro.
587
584
  if (!(inicializadores.length === 1 &&
588
- ['LeiaInteiros', 'LeiaReais', 'LeiaTextos'].includes(inicializadores[0].constructor.name))) {
589
- throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
585
+ (inicializadores[0] instanceof construtos_2.LeiaInteiro || inicializadores[0] instanceof construtos_2.LeiaInteiros ||
586
+ inicializadores[0] instanceof construtos_2.LeiaReal || inicializadores[0] instanceof construtos_2.LeiaReais ||
587
+ inicializadores[0] instanceof construtos_2.LeiaTexto || inicializadores[0] instanceof construtos_2.LeiaTextos))) {
588
+ throw this.erro(identificadores[0], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
590
589
  }
591
- const tipoConversao = this.logicaComumInferenciaTiposLeia(inicializadores[0].constructor);
590
+ const tipoConversao = this.logicaComumInferenciaTiposLeia(inicializadores[0]);
592
591
  return new declaracoes_1.ConstMultiplo(identificadores, inicializadores[0], tipoConversao);
593
592
  }
594
593
  let retorno = [];
@@ -607,7 +606,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
607
606
  * @param primeiroIdentificador Um construto de variável. É defiido em reatribuições.
608
607
  * @returns Um vetor de declarações `Var`.
609
608
  */
610
- declaracaoDeVariaveisPotigol(primeiroIdentificador) {
609
+ async declaracaoDeVariaveisPotigol(primeiroIdentificador) {
611
610
  const identificadores = [];
612
611
  let simboloVar;
613
612
  // Se houver primeiro identificador definido (reatribuição),
@@ -625,7 +624,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
625
624
  this.consumir(lexico_regular_1.default.REATRIBUIR, "Esperado ':=' após identificador em instrução 'var'.");
626
625
  const inicializadores = [];
627
626
  do {
628
- inicializadores.push(this.expressao());
627
+ inicializadores.push(await this.expressao());
629
628
  } while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
630
629
  if (identificadores.length !== inicializadores.length) {
631
630
  throw this.erro(simboloVar, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
@@ -638,7 +637,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
638
637
  }
639
638
  return retorno;
640
639
  }
641
- logicaAtribuicaoComDicaDeTipo(expressao) {
640
+ logicaAtribuicaoComDicaDeTipo() {
642
641
  // A dica de tipo é opcional.
643
642
  // Só que, se a avaliação entra na dica, só
644
643
  // podemos ter uma constante apenas.
@@ -659,9 +658,9 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
659
658
  * Em Potigol, `escreva` aceita apenas um argumento.
660
659
  * @returns Uma declaração `Escreva`.
661
660
  */
662
- declaracaoEscreva() {
661
+ async declaracaoEscreva() {
663
662
  const simboloAtual = this.avancarEDevolverAnterior();
664
- const argumento = this.ou();
663
+ const argumento = await this.ou();
665
664
  return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, [argumento]);
666
665
  }
667
666
  /**
@@ -670,9 +669,9 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
670
669
  * o resultado na saída na mesma linha.
671
670
  * @see https://potigol.github.io/docs/basico/entrada_saida.html
672
671
  */
673
- declaracaoImprima() {
672
+ async declaracaoImprima() {
674
673
  const simboloAtual = this.avancarEDevolverAnterior();
675
- const argumento = this.ou();
674
+ const argumento = await this.ou();
676
675
  return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), simboloAtual.hashArquivo, [argumento]);
677
676
  }
678
677
  /**
@@ -685,11 +684,11 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
685
684
  * - Em uma declaração `para`.
686
685
  * @returns Um vetor de `Declaracao`.
687
686
  */
688
- blocoEscopo() {
687
+ async blocoEscopo() {
689
688
  let declaracoes = [];
690
689
  this.pilhaEscoposVariaveisConhecidas.empilhar([]);
691
690
  while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(lexico_regular_1.default.FIM)) {
692
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
691
+ const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
693
692
  if (Array.isArray(retornoDeclaracao)) {
694
693
  declaracoes = declaracoes.concat(retornoDeclaracao);
695
694
  }
@@ -700,44 +699,44 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
700
699
  this.pilhaEscoposVariaveisConhecidas.removerUltimo();
701
700
  return declaracoes;
702
701
  }
703
- declaracaoSe() {
702
+ async declaracaoSe() {
704
703
  const simboloSe = this.avancarEDevolverAnterior();
705
- const condicao = this.expressao();
704
+ const condicao = await this.expressao();
706
705
  this.consumir(lexico_regular_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
707
706
  const declaracoes = [];
708
707
  do {
709
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
708
+ declaracoes.push(await this.resolverDeclaracaoForaDeBloco());
710
709
  } while (![lexico_regular_1.default.SENAO, lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo));
711
710
  let caminhoSenao = null;
712
711
  if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.SENAO)) {
713
712
  const simboloSenao = this.simbolos[this.atual - 1];
714
713
  const declaracoesSenao = [];
715
714
  do {
716
- declaracoesSenao.push(this.resolverDeclaracaoForaDeBloco());
715
+ declaracoesSenao.push(await this.resolverDeclaracaoForaDeBloco());
717
716
  } while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo));
718
717
  caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
719
718
  }
720
719
  this.consumir(lexico_regular_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'se'.");
721
720
  return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
722
721
  }
723
- declaracaoEnquanto() {
722
+ async declaracaoEnquanto() {
724
723
  const simboloAtual = this.avancarEDevolverAnterior();
725
- const condicao = this.expressao();
724
+ const condicao = await this.expressao();
726
725
  this.consumir(lexico_regular_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
727
726
  const declaracoes = [];
728
727
  do {
729
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
728
+ declaracoes.push(await this.resolverDeclaracaoForaDeBloco());
730
729
  } while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo));
731
730
  this.consumir(lexico_regular_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'enquanto'.");
732
731
  return new declaracoes_1.Enquanto(condicao, new declaracoes_1.Bloco(simboloAtual.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)));
733
732
  }
734
- declaracaoPara() {
733
+ async declaracaoPara() {
735
734
  const simboloPara = this.avancarEDevolverAnterior();
736
735
  const variavelIteracao = this.consumir(lexico_regular_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
737
736
  this.consumir(lexico_regular_1.default.DE, "Esperado palavra reservada 'de' após variável de controle de 'para'.");
738
- const literalOuVariavelInicio = this.adicaoOuSubtracao();
737
+ const literalOuVariavelInicio = await this.adicaoOuSubtracao();
739
738
  this.consumir(lexico_regular_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
740
- const literalOuVariavelFim = this.adicaoOuSubtracao();
739
+ const literalOuVariavelFim = await this.adicaoOuSubtracao();
741
740
  let operadorCondicao = new lexador_1.Simbolo(lexico_regular_1.default.MENOR_IGUAL, '<=', null, Number(simboloPara.linha), this.hashArquivo);
742
741
  let operadorCondicaoIncremento = new lexador_1.Simbolo(lexico_regular_1.default.MENOR, '<', null, Number(simboloPara.linha), this.hashArquivo);
743
742
  // Isso existe porque o laço `para` do Potigol pode ter o passo positivo ou negativo
@@ -748,7 +747,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
748
747
  let passo;
749
748
  let resolverIncrementoEmExecucao = false;
750
749
  if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PASSO)) {
751
- passo = this.unario();
750
+ passo = await this.unario();
752
751
  }
753
752
  else {
754
753
  if (literalOuVariavelInicio instanceof construtos_1.Literal && literalOuVariavelFim instanceof construtos_1.Literal) {
@@ -773,7 +772,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
773
772
  const declaracoesBlocoPara = [];
774
773
  let simboloAtualBlocoPara = this.simbolos[this.atual];
775
774
  while (simboloAtualBlocoPara.tipo !== lexico_regular_1.default.FIM) {
776
- declaracoesBlocoPara.push(this.resolverDeclaracaoForaDeBloco());
775
+ declaracoesBlocoPara.push(await this.resolverDeclaracaoForaDeBloco());
777
776
  simboloAtualBlocoPara = this.simbolos[this.atual];
778
777
  }
779
778
  this.consumir(lexico_regular_1.default.FIM, '');
@@ -783,9 +782,9 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
783
782
  para.resolverIncrementoEmExecucao = resolverIncrementoEmExecucao;
784
783
  return para;
785
784
  }
786
- declaracaoEscolha() {
785
+ async declaracaoEscolha() {
787
786
  this.avancarEDevolverAnterior();
788
- const condicao = this.expressao();
787
+ const condicao = await this.expressao();
789
788
  const caminhos = [];
790
789
  let caminhoPadrao = null;
791
790
  while (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.FIM)) {
@@ -798,7 +797,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
798
797
  throw excecao;
799
798
  }
800
799
  this.consumir(lexico_regular_1.default.SETA, "Esperado '=>' após palavra reservada 'caso'.");
801
- const declaracoesPadrao = [this.resolverDeclaracaoForaDeBloco()];
800
+ const declaracoesPadrao = [await this.resolverDeclaracaoForaDeBloco()];
802
801
  // TODO: Verificar se Potigol admite bloco de escopo para `escolha`.
803
802
  /* const declaracoesPadrao = [];
804
803
  do {
@@ -809,9 +808,9 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
809
808
  };
810
809
  continue;
811
810
  }
812
- const caminhoCondicoes = [this.expressao()];
811
+ const caminhoCondicoes = [await this.expressao()];
813
812
  this.consumir(lexico_regular_1.default.SETA, "Esperado '=>' após palavra reservada 'caso'.");
814
- const declaracoes = [this.resolverDeclaracaoForaDeBloco()];
813
+ const declaracoes = [await this.resolverDeclaracaoForaDeBloco()];
815
814
  // TODO: Verificar se Potigol admite bloco de escopo para `escolha`.
816
815
  /* const declaracoes = [];
817
816
  do {
@@ -833,9 +832,9 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
833
832
  *
834
833
  * @returns Um construto do tipo `Classe`.
835
834
  */
836
- declaracaoTipo() {
835
+ async declaracaoTipo() {
837
836
  const simboloTipo = this.avancarEDevolverAnterior();
838
- const construto = this.primario();
837
+ const construto = await this.primario();
839
838
  // TODO: Verificar se Potigol trabalha com herança.
840
839
  /* let superClasse = null;
841
840
  if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.HERDA)) {
@@ -844,12 +843,12 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
844
843
  } */
845
844
  const metodos = [];
846
845
  const propriedades = [];
847
- while (!this.verificarTipoSimboloAtual(lexico_regular_1.default.FIM) && !this.estaNoFinal()) {
846
+ while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(lexico_regular_1.default.FIM)) {
848
847
  const identificador = this.consumir(lexico_regular_1.default.IDENTIFICADOR, 'Esperado nome de propriedade ou método.');
849
848
  if (this.simbolos[this.atual].tipo === lexico_regular_1.default.PARENTESE_ESQUERDO) {
850
849
  // Método
851
850
  const construtoMetodo = new construtos_1.Constante(identificador.hashArquivo, identificador);
852
- metodos.push(this.declaracaoDeFuncaoOuMetodo(construtoMetodo));
851
+ metodos.push(await this.declaracaoDeFuncaoOuMetodo(construtoMetodo));
853
852
  }
854
853
  else {
855
854
  // Propriedade
@@ -875,23 +874,23 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
875
874
  metodos.unshift(construtor);
876
875
  return new declaracoes_1.Classe(construto.simbolo, undefined, metodos, propriedades);
877
876
  }
878
- atribuir() {
879
- const expressao = this.ou();
877
+ async atribuir() {
878
+ const expressao = await this.ou();
880
879
  if (!this.estaNoFinal()) {
881
880
  let tipoVariavelOuConstante;
882
881
  if (expressao instanceof construtos_1.Constante) {
883
882
  // Atribuição constante.
884
883
  let tipoExplicito = false;
885
884
  if (this.simbolos[this.atual].tipo === lexico_regular_1.default.DOIS_PONTOS) {
886
- tipoVariavelOuConstante = this.logicaAtribuicaoComDicaDeTipo(expressao);
885
+ tipoVariavelOuConstante = this.logicaAtribuicaoComDicaDeTipo();
887
886
  tipoExplicito = true;
888
887
  }
889
888
  switch (this.simbolos[this.atual].tipo) {
890
889
  case lexico_regular_1.default.VIRGULA:
891
- return this.declaracaoDeConstantes(expressao);
890
+ return await this.declaracaoDeConstantes(expressao);
892
891
  case lexico_regular_1.default.IGUAL:
893
892
  this.avancarEDevolverAnterior();
894
- const valorAtribuicao = this.ou();
893
+ const valorAtribuicao = await this.ou();
895
894
  return new declaracoes_1.Const(expressao.simbolo, valorAtribuicao, tipoVariavelOuConstante
896
895
  ? this.tiposPotigolParaDelegua[tipoVariavelOuConstante.lexema]
897
896
  : undefined, tipoExplicito);
@@ -901,10 +900,10 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
901
900
  // Reatribuição de variável.
902
901
  switch (this.simbolos[this.atual].tipo) {
903
902
  case lexico_regular_1.default.VIRGULA:
904
- return this.declaracaoDeVariaveisPotigol(expressao);
903
+ return await this.declaracaoDeVariaveisPotigol(expressao);
905
904
  case lexico_regular_1.default.REATRIBUIR:
906
905
  this.avancarEDevolverAnterior();
907
- const valorAtribuicao = this.ou();
906
+ const valorAtribuicao = await this.ou();
908
907
  return new declaracoes_2.ReatribuicaoVariavel(expressao.simbolo, valorAtribuicao, tipoVariavelOuConstante
909
908
  ? this.tiposPotigolParaDelegua[tipoVariavelOuConstante.lexema]
910
909
  : undefined);
@@ -918,7 +917,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
918
917
  * São eles: `leia_inteiro`, `leia_inteiros`, `leia_real`, `leia_reais`, `leia_texto` e
919
918
  * `leia_textos`.
920
919
  */
921
- expressaoLeia() {
920
+ async expressaoLeia() {
922
921
  throw new Error('Método não implementado.');
923
922
  }
924
923
  /**
@@ -934,17 +933,17 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
934
933
  * Se o próximo símbolo for parênteses, ou é uma definiçao de função,
935
934
  * ou uma chamada de função.
936
935
  */
937
- expressaoOuDefinicaoFuncao() {
936
+ async expressaoOuDefinicaoFuncao() {
938
937
  if (!this.estaNoFinal() && this.simbolos[this.atual].tipo === lexico_regular_1.default.IDENTIFICADOR) {
939
938
  if (this.atual + 1 < this.simbolos.length) {
940
939
  switch (this.simbolos[this.atual + 1].tipo) {
941
940
  case lexico_regular_1.default.PARENTESE_ESQUERDO:
942
- const construtoPrimario = this.primario();
941
+ const construtoPrimario = await this.primario();
943
942
  return this.declaracaoDeFuncaoOuMetodo(construtoPrimario);
944
943
  }
945
944
  }
946
945
  }
947
- return this.atribuir();
946
+ return await this.atribuir();
948
947
  }
949
948
  resolverDeclaracaoForaDeBloco() {
950
949
  const simboloAtual = this.simbolos[this.atual];
@@ -973,7 +972,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
973
972
  return this.expressaoOuDefinicaoFuncao();
974
973
  }
975
974
  }
976
- analisar(retornoLexador, hashArquivo) {
975
+ async analisar(retornoLexador, hashArquivo) {
977
976
  this.microAvaliadorSintatico = new micro_avaliador_sintatico_potigol_1.MicroAvaliadorSintaticoPotigol(hashArquivo);
978
977
  this.erros = [];
979
978
  this.atual = 0;
@@ -984,7 +983,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
984
983
  this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
985
984
  this.declaracoes = [];
986
985
  while (!this.estaNoFinal()) {
987
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
986
+ const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
988
987
  if (Array.isArray(retornoDeclaracao)) {
989
988
  this.declaracoes = this.declaracoes.concat(retornoDeclaracao);
990
989
  }