@designliquido/delegua 0.73.0 → 1.0.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 (133) hide show
  1. package/analisador-semantico/analisador-semantico.js +1 -1
  2. package/analisador-semantico/analisador-semantico.js.map +1 -1
  3. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +4 -4
  4. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +34 -34
  6. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  7. package/avaliador-sintatico/avaliador-sintatico-base.js +35 -34
  8. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts +77 -73
  10. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  11. package/avaliador-sintatico/avaliador-sintatico.js +266 -245
  12. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts +14 -14
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts.map +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js +29 -28
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +1 -1
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +3 -3
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +13 -13
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +17 -17
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  25. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +41 -40
  26. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  27. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +208 -140
  28. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  29. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +13 -13
  30. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  31. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +25 -25
  32. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  33. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts +37 -38
  34. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
  35. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +105 -110
  36. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  37. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts +35 -35
  38. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  39. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +98 -101
  40. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  41. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts +1 -1
  42. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
  43. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js +3 -3
  44. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
  45. package/bibliotecas/biblioteca-global.d.ts +3 -2
  46. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  47. package/bibliotecas/biblioteca-global.js +92 -151
  48. package/bibliotecas/biblioteca-global.js.map +1 -1
  49. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +3 -2
  50. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  51. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +20 -25
  52. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  53. package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts +6 -0
  54. package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts.map +1 -0
  55. package/bibliotecas/dialetos/pitugues/primitivas-tupla.js +23 -0
  56. package/bibliotecas/dialetos/pitugues/primitivas-tupla.js.map +1 -0
  57. package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
  58. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +16 -0
  59. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
  60. package/bibliotecas/primitivas-tupla.d.ts +6 -0
  61. package/bibliotecas/primitivas-tupla.d.ts.map +1 -0
  62. package/bibliotecas/primitivas-tupla.js +45 -0
  63. package/bibliotecas/primitivas-tupla.js.map +1 -0
  64. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  65. package/bibliotecas/primitivas-vetor.js +38 -0
  66. package/bibliotecas/primitivas-vetor.js.map +1 -1
  67. package/bin/package.json +1 -1
  68. package/construtos/dicionario.d.ts +2 -1
  69. package/construtos/dicionario.d.ts.map +1 -1
  70. package/construtos/dicionario.js +2 -1
  71. package/construtos/dicionario.js.map +1 -1
  72. package/construtos/literal.d.ts +1 -1
  73. package/construtos/literal.d.ts.map +1 -1
  74. package/construtos/literal.js +4 -0
  75. package/construtos/literal.js.map +1 -1
  76. package/formatadores/formatador-delegua.d.ts.map +1 -1
  77. package/formatadores/formatador-delegua.js +10 -3
  78. package/formatadores/formatador-delegua.js.map +1 -1
  79. package/interfaces/avaliador-sintatico-interface.d.ts +1 -1
  80. package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
  81. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -1
  82. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +1 -1
  83. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  84. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  85. package/interpretador/dialetos/pitugues/comum.js +19 -0
  86. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  87. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -1
  88. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  89. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +3 -4
  90. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  91. package/interpretador/interpretador-base.d.ts.map +1 -1
  92. package/interpretador/interpretador-base.js +60 -15
  93. package/interpretador/interpretador-base.js.map +1 -1
  94. package/interpretador/interpretador.d.ts.map +1 -1
  95. package/interpretador/interpretador.js +49 -15
  96. package/interpretador/interpretador.js.map +1 -1
  97. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  98. package/lexador/dialetos/lexador-pitugues.js +8 -0
  99. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  100. package/lexador/lexador.d.ts.map +1 -1
  101. package/lexador/lexador.js +4 -0
  102. package/lexador/lexador.js.map +1 -1
  103. package/package.json +1 -1
  104. package/tipos-de-simbolos/delegua.d.ts +1 -0
  105. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  106. package/tipos-de-simbolos/delegua.js +1 -0
  107. package/tipos-de-simbolos/delegua.js.map +1 -1
  108. package/tipos-de-simbolos/pitugues.d.ts +2 -0
  109. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  110. package/tipos-de-simbolos/pitugues.js +2 -0
  111. package/tipos-de-simbolos/pitugues.js.map +1 -1
  112. package/tradutores/tradutor-assembly-x64.js +122 -122
  113. package/tradutores/tradutor-assemblyscript.js +1 -1
  114. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  115. package/tradutores/tradutor-calango.d.ts +4 -3
  116. package/tradutores/tradutor-calango.d.ts.map +1 -1
  117. package/tradutores/tradutor-calango.js +7 -14
  118. package/tradutores/tradutor-calango.js.map +1 -1
  119. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  120. package/tradutores/tradutor-javascript.js +12 -5
  121. package/tradutores/tradutor-javascript.js.map +1 -1
  122. package/tradutores/tradutor-mermaidjs.js +1 -1
  123. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  124. package/tradutores/tradutor-portugol-ipt.d.ts +1 -1
  125. package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
  126. package/tradutores/tradutor-portugol-ipt.js +3 -3
  127. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  128. package/tradutores/tradutor-python.d.ts.map +1 -1
  129. package/tradutores/tradutor-python.js +12 -5
  130. package/tradutores/tradutor-python.js.map +1 -1
  131. package/tradutores/tradutor-reverso-tenda.js +1 -1
  132. package/tradutores/tradutor-reverso-tenda.js.map +1 -1
  133. package/umd/delegua.js +1219 -1247
@@ -91,9 +91,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
91
91
  }
92
92
  return tipoElementarResolvido;
93
93
  }
94
- construtoAjuda() {
94
+ async construtoAjuda() {
95
95
  const simboloAjuda = this.avancarEDevolverAnterior();
96
- if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
96
+ if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
97
97
  return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
98
98
  }
99
99
  this.avancarEDevolverAnterior(); // parêntese esquerdo
@@ -102,18 +102,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
102
102
  return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, true);
103
103
  }
104
104
  this.emAjuda = true;
105
- const expressaoAjuda = this.expressao();
105
+ const expressaoAjuda = await this.expressao();
106
106
  this.emAjuda = false;
107
107
  this.consumir(delegua_2.default.PARENTESE_DIREITO, `Esperado parêntese direito após expressão usada como argumento em ajuda(). Atual: ${this.simbolos[this.atual].lexema}.`);
108
108
  return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, expressaoAjuda);
109
109
  }
110
- obterChaveDicionario() {
110
+ async obterChaveDicionario() {
111
111
  switch (this.simbolos[this.atual].tipo) {
112
112
  case delegua_2.default.NUMERO:
113
113
  case delegua_2.default.TEXTO:
114
114
  case delegua_2.default.FALSO:
115
115
  case delegua_2.default.VERDADEIRO:
116
- return this.primario();
116
+ return await this.primario();
117
117
  case delegua_2.default.IDENTIFICADOR:
118
118
  const simboloIdentificador = this.avancarEDevolverAnterior();
119
119
  let tipoOperando;
@@ -130,14 +130,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
130
130
  case delegua_2.default.COLCHETE_ESQUERDO:
131
131
  this.avancarEDevolverAnterior();
132
132
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
133
- return this.construtoTupla();
133
+ return await this.construtoTupla();
134
134
  }
135
135
  throw this.erro(this.simbolos[this.atual], `Esperado parêntese esquerdo após colchete esquerdo para definição de chave de dicionário. Atual: ${this.simbolos[this.atual].tipo}.`);
136
136
  default:
137
137
  throw this.erro(this.simbolos[this.atual], `Símbolo ${this.simbolos[this.atual].tipo} inesperado ou inválido como chave de dicionário.`);
138
138
  }
139
139
  }
140
- construtoDicionario(simboloChaveEsquerda) {
140
+ async construtoDicionario(simboloChaveEsquerda) {
141
141
  this.avancarEDevolverAnterior();
142
142
  const chaves = [];
143
143
  const valores = [];
@@ -145,9 +145,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
145
145
  return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), [], []);
146
146
  }
147
147
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
148
- const chave = this.obterChaveDicionario();
148
+ const chave = await this.obterChaveDicionario();
149
149
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
150
- const valor = this.atribuir();
150
+ const valor = await this.atribuir();
151
151
  chaves.push(chave);
152
152
  valores.push(valor);
153
153
  if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
@@ -156,68 +156,72 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
156
156
  }
157
157
  return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), chaves, valores);
158
158
  }
159
- construtoImportar() {
159
+ /**
160
+ * `delegua-node` e a extensão para VSCode precisam que este método seja assíncrono.
161
+ * @returns
162
+ */
163
+ async construtoImportar() {
160
164
  this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
161
- const caminho = this.expressao();
165
+ const caminho = await this.expressao();
162
166
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
163
- return new construtos_1.ImportarComoConstruto(caminho);
167
+ return Promise.resolve(new construtos_1.ImportarComoConstruto(caminho));
164
168
  }
165
- construtoTupla() {
166
- const expressao = this.expressao();
169
+ async construtoTupla() {
170
+ const expressao = await this.expressao();
167
171
  const argumentos = [expressao];
168
172
  while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
169
173
  this.avancarEDevolverAnterior();
170
- argumentos.push(this.expressao());
174
+ argumentos.push(await this.expressao());
171
175
  }
172
176
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
173
177
  this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
174
178
  return new tuplas_1.SeletorTuplas(...argumentos);
175
179
  }
176
- enquantoComoConstruto() {
177
- const { condicao, corpo } = this.logicaComumEnquanto();
180
+ async enquantoComoConstruto() {
181
+ const { condicao, corpo } = await this.logicaComumEnquanto();
178
182
  return new construtos_1.EnquantoComoConstruto(condicao, corpo);
179
183
  }
180
- fazerComoConstruto(simboloFazer) {
184
+ async fazerComoConstruto(simboloFazer) {
181
185
  try {
182
186
  this.blocos += 1;
183
- const { caminhoFazer, condicaoEnquanto } = this.logicaComumFazer();
187
+ const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
184
188
  return new construtos_1.FazerComoConstruto(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
185
189
  }
186
190
  finally {
187
191
  this.blocos -= 1;
188
192
  }
189
193
  }
190
- paraCadaComoConstrutoVetor(simboloPara) {
191
- const { variavelIteracao, vetor, corpo } = this.logicaComumParaCadaVetor(simboloPara);
194
+ async paraCadaComoConstrutoVetor(simboloPara) {
195
+ const { variavelIteracao, vetor, corpo } = await this.logicaComumParaCadaVetor(simboloPara);
192
196
  return new construtos_1.ParaCadaComoConstruto(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, vetor, corpo);
193
197
  }
194
- paraCadaComoConstrutoDicionario(simboloPara) {
195
- const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = this.logicaParaCadaDicionario(simboloPara);
198
+ async paraCadaComoConstrutoDicionario(simboloPara) {
199
+ const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = await this.logicaParaCadaDicionario(simboloPara);
196
200
  return new construtos_1.ParaCadaComoConstruto(this.hashArquivo, Number(simboloPara.linha), new tuplas_1.Dupla(new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelChave.lexema), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelValor.lexema)), dicionario, corpo);
197
201
  }
198
- paraCadaComoConstruto(simboloPara) {
202
+ async paraCadaComoConstruto(simboloPara) {
199
203
  if (this.verificarTipoSimboloAtual(delegua_2.default.IDENTIFICADOR)) {
200
- return this.paraCadaComoConstrutoVetor(simboloPara);
204
+ return await this.paraCadaComoConstrutoVetor(simboloPara);
201
205
  }
202
206
  if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
203
- return this.paraCadaComoConstrutoDicionario(simboloPara);
207
+ return await this.paraCadaComoConstrutoDicionario(simboloPara);
204
208
  }
205
209
  throw this.erro(simboloPara, 'Identificador de iteração deve ser ou um par chave-valor, ou um nome de variável.');
206
210
  }
207
- paraTradicionalComoConstruto(simboloPara) {
208
- const { inicializador, condicao, incrementar, corpo } = this.logicaComumPara();
211
+ async paraTradicionalComoConstruto(simboloPara) {
212
+ const { inicializador, condicao, incrementar, corpo } = await this.logicaComumPara();
209
213
  return new construtos_1.ParaComoConstruto(simboloPara.hashArquivo, simboloPara.linha, inicializador, condicao, incrementar, corpo);
210
214
  }
211
215
  /**
212
216
  * Método que resolve `para` ou `para cada` como construto.
213
217
  */
214
- paraComoConstruto(simboloPara) {
218
+ async paraComoConstruto(simboloPara) {
215
219
  try {
216
220
  this.blocos += 1;
217
221
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
218
- return this.paraCadaComoConstruto(simboloPara);
222
+ return await this.paraCadaComoConstruto(simboloPara);
219
223
  }
220
- return this.paraTradicionalComoConstruto(simboloPara);
224
+ return await this.paraTradicionalComoConstruto(simboloPara);
221
225
  }
222
226
  finally {
223
227
  this.blocos -= 1;
@@ -227,7 +231,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
227
231
  * Resolve uma lista de compreensão.
228
232
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
229
233
  */
230
- resolverCompreensaoDeLista(retornoExpressao) {
234
+ async resolverCompreensaoDeLista(retornoExpressao) {
231
235
  this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificado.");
232
236
  this.consumir(delegua_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
233
237
  const simboloVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
@@ -235,10 +239,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
235
239
  throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução em lista de compreensão.");
236
240
  }
237
241
  const localizacaoVetor = this.simboloAnterior();
238
- const vetor = this.ou();
242
+ const vetor = await this.ou();
239
243
  let condicao = null;
240
244
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SE)) {
241
- condicao = this.expressao();
245
+ condicao = await this.expressao();
242
246
  }
243
247
  else {
244
248
  condicao = new construtos_1.Literal(this.hashArquivo, Number(localizacaoVetor.linha), true);
@@ -256,14 +260,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
256
260
  ])), 'qualquer[]' // TODO: Talvez um dia inferir o tipo aqui.
257
261
  );
258
262
  }
259
- primario() {
263
+ async primario() {
260
264
  const simboloAtual = this.simbolos[this.atual];
261
265
  let valores = [];
262
266
  switch (simboloAtual.tipo) {
263
267
  case delegua_2.default.AJUDA:
264
- return this.construtoAjuda();
268
+ return await this.construtoAjuda();
265
269
  case delegua_2.default.CHAVE_ESQUERDA:
266
- return this.construtoDicionario(simboloAtual);
270
+ return await this.construtoDicionario(simboloAtual);
267
271
  case delegua_2.default.COLCHETE_ESQUERDO:
268
272
  this.avancarEDevolverAnterior();
269
273
  valores = [];
@@ -276,10 +280,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
276
280
  // Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
277
281
  // de lista serão tratados como 'qualquer', para evitar erros de tipo.
278
282
  this.intuirTipoQualquerParaIdentificadores = true;
279
- const retornoExpressaoOuPrimeiroValor = this.seTernario();
283
+ const retornoExpressaoOuPrimeiroValor = await this.seTernario();
280
284
  this.intuirTipoQualquerParaIdentificadores = false;
281
285
  if (this.simbolos[this.atual].tipo === delegua_2.default.PARA) {
282
- return this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
286
+ return await this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
283
287
  }
284
288
  // Aqui já sabemos que não é uma compreensão de lista.
285
289
  valores.push(retornoExpressaoOuPrimeiroValor);
@@ -294,7 +298,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
294
298
  valores.push(new construtos_1.ComentarioComoConstruto(simboloComentario));
295
299
  break;
296
300
  default:
297
- const valor = this.seTernario();
301
+ const valor = await this.seTernario();
298
302
  valores.push(valor);
299
303
  break;
300
304
  }
@@ -321,7 +325,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
321
325
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores, valores.length, tipoVetor);
322
326
  case delegua_2.default.ENQUANTO:
323
327
  this.avancarEDevolverAnterior();
324
- return this.enquantoComoConstruto();
328
+ return await this.enquantoComoConstruto();
325
329
  case delegua_2.default.EXPRESSAO_REGULAR:
326
330
  let valor = '';
327
331
  let linhaAtual = this.simbolos[this.atual].linha;
@@ -342,11 +346,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
342
346
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false, 'lógico');
343
347
  case delegua_2.default.FAZER:
344
348
  const simboloFazer = this.avancarEDevolverAnterior();
345
- return this.fazerComoConstruto(simboloFazer);
349
+ return await this.fazerComoConstruto(simboloFazer);
346
350
  case delegua_2.default.FUNCAO:
347
351
  case delegua_2.default.FUNÇÃO:
348
352
  const simboloFuncao = this.avancarEDevolverAnterior();
349
- const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
353
+ const corpoDaFuncao = await this.corpoDaFuncao(simboloFuncao.lexema);
350
354
  this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloFuncao.lexema, 'função'));
351
355
  return corpoDaFuncao;
352
356
  case delegua_2.default.IDENTIFICADOR:
@@ -381,12 +385,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
381
385
  return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando || 'qualquer');
382
386
  case delegua_2.default.IMPORTAR:
383
387
  this.avancarEDevolverAnterior();
384
- return this.construtoImportar();
388
+ return await this.construtoImportar();
385
389
  case delegua_2.default.ISTO:
386
390
  this.avancarEDevolverAnterior();
387
391
  return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
388
392
  case delegua_2.default.LEIA:
389
- return this.expressaoLeia();
393
+ return await this.expressaoLeia();
390
394
  case delegua_2.default.NULO:
391
395
  this.avancarEDevolverAnterior();
392
396
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
@@ -399,10 +403,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
399
403
  return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
400
404
  case delegua_2.default.PARA:
401
405
  const simboloPara = this.avancarEDevolverAnterior();
402
- return this.paraComoConstruto(simboloPara);
406
+ return await this.paraComoConstruto(simboloPara);
403
407
  case delegua_2.default.PARENTESE_ESQUERDO:
404
408
  this.avancarEDevolverAnterior();
405
- const expressao = this.expressao();
409
+ const expressao = await this.expressao();
406
410
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
407
411
  return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
408
412
  case delegua_2.default.SUPER:
@@ -422,7 +426,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
422
426
  construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
423
427
  }
424
428
  else {
425
- construto = this.expressao();
429
+ construto = await this.expressao();
426
430
  }
427
431
  if (construto.constructor === construtos_1.AcessoMetodoOuPropriedade) {
428
432
  const construtoTipado = construto;
@@ -479,6 +483,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
479
483
  }
480
484
  return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
481
485
  }
486
+ // TODO: O correto seria emitir algum aviso aqui que este avaliador sintático não consegue
487
+ // lidar com tópicos de ajuda neste ponto.
482
488
  if (this.emAjuda) {
483
489
  console.log(this.simbolos[this.atual]);
484
490
  }
@@ -515,15 +521,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
515
521
  }
516
522
  return tipoAcesso;
517
523
  }
518
- resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
524
+ async resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
519
525
  if (!this.simbolos[this.atual]) {
520
526
  return expressaoAnterior;
521
527
  }
522
528
  switch (this.simbolos[this.atual].tipo) {
523
529
  case delegua_2.default.PARENTESE_ESQUERDO:
524
530
  this.avancarEDevolverAnterior();
525
- const chamada = this.finalizarChamada(expressaoAnterior, tipoAnterior);
526
- return this.resolverCadeiaChamadas(chamada);
531
+ const chamada = await this.finalizarChamada(expressaoAnterior, tipoAnterior);
532
+ return await this.resolverCadeiaChamadas(chamada);
527
533
  case delegua_2.default.PONTO:
528
534
  this.avancarEDevolverAnterior();
529
535
  this.verificarSeSimboloAtualEIgualA();
@@ -541,21 +547,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
541
547
  }
542
548
  }
543
549
  const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
544
- return this.resolverCadeiaChamadas(acesso, tipoInferido);
550
+ return await this.resolverCadeiaChamadas(acesso, tipoInferido);
545
551
  case delegua_2.default.COLCHETE_ESQUERDO:
546
552
  const tipoAcesso = this.resolverTipoAcessoIndiceVariavel(expressaoAnterior);
547
553
  this.avancarEDevolverAnterior();
548
- const indice = this.expressao();
554
+ const indice = await this.expressao();
549
555
  const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
550
556
  const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento, tipoAcesso);
551
- return this.resolverCadeiaChamadas(acessoVariavel);
557
+ return await this.resolverCadeiaChamadas(acessoVariavel);
552
558
  default:
553
559
  return expressaoAnterior;
554
560
  }
555
561
  }
556
- chamar() {
557
- let expressao = this.primario();
558
- return this.resolverCadeiaChamadas(expressao);
562
+ async chamar() {
563
+ let expressao = await this.primario();
564
+ return await this.resolverCadeiaChamadas(expressao);
559
565
  }
560
566
  /**
561
567
  * `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
@@ -699,7 +705,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
699
705
  }
700
706
  return entidadeChamada;
701
707
  }
702
- finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
708
+ async finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
703
709
  const argumentos = [];
704
710
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
705
711
  do {
@@ -707,7 +713,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
707
713
  if (argumentos.length >= 255) {
708
714
  throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
709
715
  }
710
- argumentos.push(this.expressao());
716
+ argumentos.push(await this.expressao());
711
717
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
712
718
  }
713
719
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
@@ -720,24 +726,24 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
720
726
  construtoChamada.tipo = 'qualquer';
721
727
  return construtoChamada;
722
728
  }
723
- unario() {
729
+ async unario() {
724
730
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.NAO, delegua_2.default.NEGACAO, delegua_2.default.ADICAO, delegua_2.default.SUBTRACAO, delegua_2.default.BIT_NOT, delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR)) {
725
731
  const operador = this.simbolos[this.atual - 1];
726
- const direito = this.unario();
732
+ const direito = await this.unario();
727
733
  return new construtos_1.Unario(this.hashArquivo, operador, direito, 'ANTES');
728
734
  }
729
- return this.chamar();
735
+ return await this.chamar();
730
736
  }
731
737
  /**
732
738
  * A exponenciacão é uma exceção na ordem de avaliação (resolve primeiro à direita).
733
739
  * Por isso `direito` chama `exponenciacao()`, e não `unario()`.
734
740
  * @returns {Binario} A expressão binária na forma do construto `Binario`.
735
741
  */
736
- exponenciacao() {
737
- let expressao = this.unario();
742
+ async exponenciacao() {
743
+ let expressao = await this.unario();
738
744
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
739
745
  const operador = this.simbolos[this.atual - 1];
740
- const direito = this.exponenciacao();
746
+ const direito = await this.exponenciacao();
741
747
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
742
748
  }
743
749
  return expressao;
@@ -789,11 +795,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
789
795
  }
790
796
  }
791
797
  }
792
- multiplicar() {
793
- let expressao = this.exponenciacao();
798
+ async multiplicar() {
799
+ let expressao = await this.exponenciacao();
794
800
  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)) {
795
801
  const operador = this.simbolos[this.atual - 1];
796
- const direito = this.exponenciacao();
802
+ const direito = await this.exponenciacao();
797
803
  this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
798
804
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
799
805
  }
@@ -804,68 +810,68 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
804
810
  * ser avaliado pelo Interpretador.
805
811
  * @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
806
812
  */
807
- adicaoOuSubtracao() {
808
- let expressao = this.multiplicar();
813
+ async adicaoOuSubtracao() {
814
+ let expressao = await this.multiplicar();
809
815
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MENOS_IGUAL)) {
810
816
  const operador = this.simbolos[this.atual - 1];
811
- const direito = this.multiplicar();
817
+ const direito = await this.multiplicar();
812
818
  this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
813
819
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
814
820
  }
815
821
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIS_IGUAL)) {
816
822
  const operador = this.simbolos[this.atual - 1];
817
- const direito = this.atribuir();
823
+ const direito = await this.ou();
818
824
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
819
825
  }
820
826
  return expressao;
821
827
  }
822
- bitShift() {
823
- let expressao = this.adicaoOuSubtracao();
828
+ async bitShift() {
829
+ let expressao = await this.adicaoOuSubtracao();
824
830
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MENOR_MENOR, delegua_2.default.MAIOR_MAIOR)) {
825
831
  const operador = this.simbolos[this.atual - 1];
826
- const direito = this.adicaoOuSubtracao();
832
+ const direito = await this.adicaoOuSubtracao();
827
833
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
828
834
  }
829
835
  return expressao;
830
836
  }
831
- bitE() {
832
- let expressao = this.bitShift();
837
+ async bitE() {
838
+ let expressao = await this.bitShift();
833
839
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_AND)) {
834
840
  const operador = this.simbolos[this.atual - 1];
835
- const direito = this.bitShift();
841
+ const direito = await this.bitShift();
836
842
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
837
843
  }
838
844
  return expressao;
839
845
  }
840
- bitOu() {
841
- let expressao = this.bitE();
846
+ async bitOu() {
847
+ let expressao = await this.bitE();
842
848
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_OR, delegua_2.default.BIT_XOR)) {
843
849
  const operador = this.simbolos[this.atual - 1];
844
- const direito = this.bitE();
850
+ const direito = await this.bitE();
845
851
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
846
852
  }
847
853
  return expressao;
848
854
  }
849
- comparar() {
850
- let expressao = this.bitOu();
855
+ async comparar() {
856
+ let expressao = await this.bitOu();
851
857
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
852
858
  const operador = this.simbolos[this.atual - 1];
853
- const direito = this.bitOu();
859
+ const direito = await this.bitOu();
854
860
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
855
861
  }
856
862
  return expressao;
857
863
  }
858
- comparacaoIgualdade() {
859
- let expressao = this.comparar();
864
+ async comparacaoIgualdade() {
865
+ let expressao = await this.comparar();
860
866
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIFERENTE, delegua_2.default.IGUAL_IGUAL)) {
861
867
  const operador = this.simbolos[this.atual - 1];
862
- const direito = this.comparar();
868
+ const direito = await this.comparar();
863
869
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
864
870
  }
865
871
  return expressao;
866
872
  }
867
- em() {
868
- let expressao = this.comparacaoIgualdade();
873
+ async em() {
874
+ let expressao = await this.comparacaoIgualdade();
869
875
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EM, delegua_2.default.CONTEM, delegua_2.default.NAO)) {
870
876
  let operador = this.simbolos[this.atual - 1];
871
877
  let negado = false;
@@ -873,36 +879,36 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
873
879
  operador = this.consumir(delegua_2.default.CONTEM, `Esperado palavra reservada 'contém' ou 'contem' após palavra reservada ${operador.lexema}.`);
874
880
  negado = true;
875
881
  }
876
- const direito = this.comparacaoIgualdade();
882
+ const direito = await this.comparacaoIgualdade();
877
883
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
878
884
  expressao.negado = negado;
879
885
  }
880
886
  return expressao;
881
887
  }
882
- e() {
883
- let expressao = this.em();
888
+ async e() {
889
+ let expressao = await this.em();
884
890
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.E)) {
885
891
  const operador = this.simbolos[this.atual - 1];
886
- const direito = this.em();
892
+ const direito = await this.em();
887
893
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
888
894
  }
889
895
  return expressao;
890
896
  }
891
- elvis() {
892
- let expressao = this.ou();
897
+ async elvis() {
898
+ let expressao = await this.ou();
893
899
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ELVIS)) {
894
- const direito = this.ou();
900
+ const direito = await this.ou();
895
901
  return new construtos_1.Elvis(this.hashArquivo, expressao, direito);
896
902
  }
897
903
  return expressao;
898
904
  }
899
- seTernario() {
900
- let expressaoOuCondicao = this.elvis();
905
+ async seTernario() {
906
+ let expressaoOuCondicao = await this.elvis();
901
907
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.INTERROGACAO)) {
902
908
  const operador = this.simbolos[this.atual - 1];
903
- const expressaoEntao = this.seTernario();
909
+ const expressaoEntao = await this.seTernario();
904
910
  this.consumir(delegua_2.default.DOIS_PONTOS, `Esperado dois-pontos após caminho positivo em se ternário. Atual: ${this.simbolos[this.atual].lexema}.`);
905
- const expressaoSenao = this.seTernario();
911
+ const expressaoSenao = await this.seTernario();
906
912
  expressaoOuCondicao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
907
913
  }
908
914
  return expressaoOuCondicao;
@@ -911,8 +917,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
911
917
  * Método que resolve atribuições.
912
918
  * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
913
919
  */
914
- atribuir() {
915
- const expressao = this.seTernario();
920
+ async atribuir() {
921
+ const expressao = await this.seTernario();
916
922
  if (expressao instanceof construtos_1.Binario &&
917
923
  [
918
924
  delegua_2.default.MAIS_IGUAL,
@@ -928,9 +934,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
928
934
  }
929
935
  return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda, expressao, undefined, expressao.operador);
930
936
  }
931
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
937
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
932
938
  const igual = this.simbolos[this.atual - 1];
933
- const valor = this.seTernario();
939
+ const valor = await this.seTernario();
934
940
  switch (expressao.constructor) {
935
941
  case construtos_1.Variavel:
936
942
  return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
@@ -949,7 +955,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
949
955
  * Declaração para comando `leia`, para ler dados de entrada do usuário.
950
956
  * @returns Um objeto da classe `Leia`.
951
957
  */
952
- expressaoLeia() {
958
+ async expressaoLeia() {
953
959
  const simboloLeia = this.avancarEDevolverAnterior();
954
960
  if (this.emAjuda && this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
955
961
  return new construtos_1.Leia(simboloLeia, []);
@@ -958,22 +964,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
958
964
  const argumentos = [];
959
965
  if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
960
966
  do {
961
- argumentos.push(this.expressao());
967
+ argumentos.push(await this.expressao());
962
968
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
963
969
  }
964
970
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
965
971
  return new construtos_1.Leia(simboloLeia, argumentos);
966
972
  }
967
973
  // TODO: Depreciar.
968
- expressao() {
969
- return this.atribuir();
974
+ async expressao() {
975
+ return await this.atribuir();
970
976
  }
971
- blocoEscopo() {
977
+ async blocoEscopo() {
972
978
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
973
979
  let declaracoes = [];
974
980
  while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
975
981
  !this.estaNoFinal()) {
976
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
982
+ const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
977
983
  if (Array.isArray(retornoDeclaracao)) {
978
984
  declaracoes = declaracoes.concat(retornoDeclaracao);
979
985
  }
@@ -1007,45 +1013,45 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1007
1013
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1008
1014
  return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
1009
1015
  }
1010
- logicaComumEnquanto() {
1011
- const condicao = this.expressao();
1016
+ async logicaComumEnquanto() {
1017
+ const condicao = await this.expressao();
1012
1018
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1013
- const corpo = this.resolverDeclaracao();
1019
+ const corpo = await this.resolverDeclaracao();
1014
1020
  return {
1015
1021
  condicao,
1016
1022
  corpo,
1017
1023
  };
1018
1024
  }
1019
- declaracaoEnquanto() {
1025
+ async declaracaoEnquanto() {
1020
1026
  try {
1021
1027
  this.blocos += 1;
1022
- const { condicao, corpo } = this.logicaComumEnquanto();
1028
+ const { condicao, corpo } = await this.logicaComumEnquanto();
1023
1029
  return new declaracoes_1.Enquanto(condicao, corpo);
1024
1030
  }
1025
1031
  finally {
1026
1032
  this.blocos -= 1;
1027
1033
  }
1028
1034
  }
1029
- declaracaoEscolha() {
1035
+ async declaracaoEscolha() {
1030
1036
  try {
1031
1037
  this.blocos += 1;
1032
- const condicao = this.expressao();
1038
+ const condicao = await this.expressao();
1033
1039
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
1034
1040
  const caminhos = [];
1035
1041
  let caminhoPadrao = null;
1036
1042
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
1037
1043
  !this.estaNoFinal()) {
1038
1044
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
1039
- const caminhoCondicoes = [this.expressao()];
1045
+ const caminhoCondicoes = [await this.expressao()];
1040
1046
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
1041
1047
  while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
1042
1048
  this.consumir(delegua_2.default.CASO, null);
1043
- caminhoCondicoes.push(this.expressao());
1049
+ caminhoCondicoes.push(await this.expressao());
1044
1050
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
1045
1051
  }
1046
1052
  let declaracoes = [];
1047
1053
  do {
1048
- const retornoDeclaracao = this.resolverDeclaracao();
1054
+ const retornoDeclaracao = await this.resolverDeclaracao();
1049
1055
  if (Array.isArray(retornoDeclaracao)) {
1050
1056
  declaracoes = declaracoes.concat(retornoDeclaracao);
1051
1057
  }
@@ -1069,7 +1075,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1069
1075
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
1070
1076
  const declaracoes = [];
1071
1077
  do {
1072
- declaracoes.push(this.resolverDeclaracao());
1078
+ declaracoes.push(await this.resolverDeclaracao());
1073
1079
  } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
1074
1080
  !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
1075
1081
  !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
@@ -1084,13 +1090,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1084
1090
  this.blocos -= 1;
1085
1091
  }
1086
1092
  }
1087
- declaracaoEscreva() {
1093
+ async declaracaoEscreva() {
1088
1094
  const simboloAtual = this.simbolos[this.atual];
1089
1095
  this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
1090
1096
  const argumentos = [];
1091
1097
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1092
1098
  do {
1093
- argumentos.push(this.expressao());
1099
+ argumentos.push(await this.expressao());
1094
1100
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1095
1101
  }
1096
1102
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
@@ -1098,33 +1104,34 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1098
1104
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1099
1105
  return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
1100
1106
  }
1101
- declaracaoExpressao() {
1107
+ async declaracaoExpressao() {
1102
1108
  // Se há decoradores a serem adicionados aqui, obtemo-los agora,
1103
1109
  // para evitar que outros passos recursivos peguem-los antes.
1104
1110
  const decoradores = Array.from(this.pilhaDecoradores);
1105
1111
  this.pilhaDecoradores = [];
1106
- const expressao = this.expressao();
1112
+ const expressao = await this.expressao();
1107
1113
  // Ponto-e-vírgula é opcional aqui.
1108
1114
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1109
1115
  return new declaracoes_1.Expressao(expressao, decoradores);
1110
1116
  }
1111
- declaracaoFalhar() {
1117
+ async declaracaoFalhar() {
1112
1118
  const simboloFalha = this.simbolos[this.atual - 1];
1113
- return new declaracoes_1.Falhar(simboloFalha, this.declaracaoExpressao().expressao);
1119
+ const expressaoFalha = await this.expressao();
1120
+ return new declaracoes_1.Falhar(simboloFalha, expressaoFalha);
1114
1121
  }
1115
- logicaComumFazer() {
1116
- const caminhoFazer = this.resolverDeclaracao();
1122
+ async logicaComumFazer() {
1123
+ const caminhoFazer = await this.resolverDeclaracao();
1117
1124
  this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
1118
- const condicaoEnquanto = this.expressao();
1125
+ const condicaoEnquanto = await this.expressao();
1119
1126
  return {
1120
1127
  caminhoFazer,
1121
1128
  condicaoEnquanto,
1122
1129
  };
1123
1130
  }
1124
- declaracaoFazer(simboloFazer) {
1131
+ async declaracaoFazer(simboloFazer) {
1125
1132
  try {
1126
1133
  this.blocos += 1;
1127
- const { caminhoFazer, condicaoEnquanto } = this.logicaComumFazer();
1134
+ const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
1128
1135
  return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, // TODO: Aqui pode ser um `Bloco`?
1129
1136
  condicaoEnquanto);
1130
1137
  }
@@ -1178,20 +1185,20 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1178
1185
  }
1179
1186
  return importar;
1180
1187
  }
1181
- declaracaoPara() {
1188
+ async declaracaoPara() {
1182
1189
  try {
1183
1190
  const simboloPara = this.simbolos[this.atual - 1];
1184
1191
  this.blocos += 1;
1185
1192
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
1186
- return this.declaracaoParaCada(simboloPara);
1193
+ return await this.declaracaoParaCada(simboloPara);
1187
1194
  }
1188
- return this.declaracaoParaTradicional(simboloPara);
1195
+ return await this.declaracaoParaTradicional(simboloPara);
1189
1196
  }
1190
1197
  finally {
1191
1198
  this.blocos -= 1;
1192
1199
  }
1193
1200
  }
1194
- logicaParaCadaDicionario(simboloPara) {
1201
+ async logicaParaCadaDicionario(simboloPara) {
1195
1202
  this.avancarEDevolverAnterior(); // chave esquerda
1196
1203
  const nomeVariavelChave = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável para chave de iteração, em instrução 'para cada'.");
1197
1204
  this.consumir(delegua_2.default.VIRGULA, "Esperado vírgula após nome de variável para chave de iteração, em instrução 'para cada'.");
@@ -1200,7 +1207,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1200
1207
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1201
1208
  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'.");
1202
1209
  }
1203
- const dicionario = this.expressao();
1210
+ const dicionario = await this.expressao();
1204
1211
  if (!dicionario.hasOwnProperty('tipo')) {
1205
1212
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece ser um dicionário.`);
1206
1213
  }
@@ -1211,7 +1218,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1211
1218
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
1212
1219
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
1213
1220
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1214
- const corpo = this.resolverDeclaracao();
1221
+ const corpo = await this.resolverDeclaracao();
1215
1222
  return {
1216
1223
  nomeVariavelChave,
1217
1224
  nomeVariavelValor,
@@ -1219,17 +1226,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1219
1226
  corpo,
1220
1227
  };
1221
1228
  }
1222
- declaracaoParaCadaDicionario(simboloPara) {
1223
- const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = this.logicaParaCadaDicionario(simboloPara);
1229
+ async declaracaoParaCadaDicionario(simboloPara) {
1230
+ const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = await this.logicaParaCadaDicionario(simboloPara);
1224
1231
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new tuplas_1.Dupla(new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelChave.lexema), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelValor.lexema)), dicionario, corpo);
1225
1232
  }
1226
- logicaComumParaCadaVetor(simboloPara) {
1233
+ async logicaComumParaCadaVetor(simboloPara) {
1227
1234
  const nomeVariavelIteracao = this.avancarEDevolverAnterior();
1228
1235
  const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao);
1229
1236
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1230
1237
  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'.");
1231
1238
  }
1232
- let vetorOuDicionario = this.expressao();
1239
+ let vetorOuDicionario = await this.expressao();
1233
1240
  if (vetorOuDicionario.constructor === construtos_1.AcessoIndiceVariavel) {
1234
1241
  const construtoAcessoIndiceVariavel = vetorOuDicionario;
1235
1242
  if (construtoAcessoIndiceVariavel.entidadeChamada.tipo === 'dicionário') {
@@ -1250,57 +1257,57 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1250
1257
  }
1251
1258
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
1252
1259
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1253
- const corpo = this.resolverDeclaracao();
1260
+ const corpo = await this.resolverDeclaracao();
1254
1261
  return {
1255
1262
  variavelIteracao,
1256
1263
  vetor: vetorOuDicionario,
1257
1264
  corpo,
1258
1265
  };
1259
1266
  }
1260
- declaracaoParaCadaVetor(simboloPara) {
1261
- const { variavelIteracao, vetor, corpo } = this.logicaComumParaCadaVetor(simboloPara);
1267
+ async declaracaoParaCadaVetor(simboloPara) {
1268
+ const { variavelIteracao, vetor, corpo } = await this.logicaComumParaCadaVetor(simboloPara);
1262
1269
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, vetor, corpo);
1263
1270
  }
1264
- declaracaoParaCada(simboloPara) {
1271
+ async declaracaoParaCada(simboloPara) {
1265
1272
  if (this.verificarTipoSimboloAtual(delegua_2.default.IDENTIFICADOR)) {
1266
- return this.declaracaoParaCadaVetor(simboloPara);
1273
+ return await this.declaracaoParaCadaVetor(simboloPara);
1267
1274
  }
1268
1275
  if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
1269
- return this.declaracaoParaCadaDicionario(simboloPara);
1276
+ return await this.declaracaoParaCadaDicionario(simboloPara);
1270
1277
  }
1271
1278
  throw this.erro(simboloPara, 'Identificador de iteração deve ser ou um par chave-valor, ou um nome de variável.');
1272
1279
  }
1273
- logicaComumPara() {
1280
+ async logicaComumPara() {
1274
1281
  const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
1275
1282
  let inicializador;
1276
1283
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA)) {
1277
1284
  inicializador = null;
1278
1285
  }
1279
1286
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VARIAVEL)) {
1280
- inicializador = this.declaracaoDeVariaveis();
1287
+ inicializador = await this.declaracaoDeVariaveis();
1281
1288
  }
1282
1289
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CONSTANTE)) {
1283
- inicializador = this.declaracaoDeConstantes();
1290
+ inicializador = await this.declaracaoDeConstantes();
1284
1291
  }
1285
1292
  else {
1286
- inicializador = this.declaracaoExpressao();
1293
+ inicializador = await this.declaracaoExpressao();
1287
1294
  }
1288
1295
  let condicao = null;
1289
1296
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PONTO_E_VIRGULA)) {
1290
- condicao = this.expressao();
1297
+ condicao = await this.expressao();
1291
1298
  }
1292
1299
  // Ponto-e-vírgula é opcional aqui.
1293
1300
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1294
1301
  let incrementar = null;
1295
1302
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1296
- incrementar = this.expressao();
1303
+ incrementar = await this.expressao();
1297
1304
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR);
1298
1305
  }
1299
1306
  if (comParenteses) {
1300
1307
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
1301
1308
  }
1302
1309
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1303
- const corpo = this.resolverDeclaracao();
1310
+ const corpo = await this.resolverDeclaracao();
1304
1311
  return {
1305
1312
  inicializador,
1306
1313
  condicao,
@@ -1308,11 +1315,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1308
1315
  corpo,
1309
1316
  };
1310
1317
  }
1311
- declaracaoParaTradicional(simboloPara) {
1312
- const { inicializador, condicao, incrementar, corpo } = this.logicaComumPara();
1318
+ async declaracaoParaTradicional(simboloPara) {
1319
+ const { inicializador, condicao, incrementar, corpo } = await this.logicaComumPara();
1313
1320
  return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
1314
1321
  }
1315
- declaracaoRetorna() {
1322
+ async declaracaoRetorna() {
1316
1323
  const simboloChave = this.simbolos[this.atual - 1];
1317
1324
  let valor = null;
1318
1325
  if ([
@@ -1332,18 +1339,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1332
1339
  delegua_2.default.TEXTO,
1333
1340
  delegua_2.default.VERDADEIRO,
1334
1341
  ].includes(this.simbolos[this.atual].tipo)) {
1335
- valor = this.expressao();
1342
+ valor = await this.expressao();
1336
1343
  }
1337
1344
  // Ponto-e-vírgula é opcional aqui.
1338
1345
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1339
1346
  return new declaracoes_1.Retorna(simboloChave, valor);
1340
1347
  }
1341
- declaracaoSe() {
1342
- const condicao = this.expressao();
1343
- const caminhoEntao = this.resolverDeclaracao();
1348
+ async declaracaoSe() {
1349
+ const condicao = await this.expressao();
1350
+ const caminhoEntao = await this.resolverDeclaracao();
1344
1351
  let caminhoSenao = null;
1345
1352
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
1346
- caminhoSenao = this.resolverDeclaracao();
1353
+ caminhoSenao = await this.resolverDeclaracao();
1347
1354
  }
1348
1355
  return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
1349
1356
  }
@@ -1355,69 +1362,68 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1355
1362
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1356
1363
  return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
1357
1364
  }
1358
- declaracaoTente() {
1365
+ async declaracaoTente() {
1359
1366
  const simboloTente = this.simbolos[this.atual - 1];
1360
1367
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
1361
- const blocoTente = this.blocoEscopo();
1368
+ const blocoTente = await this.blocoEscopo();
1362
1369
  let blocoPegue = null;
1363
1370
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PEGUE)) {
1364
1371
  if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_ESQUERDO)) {
1365
1372
  // Caso 1: com parâmetro de erro.
1366
1373
  // `pegue` recebe um `FuncaoConstruto`.
1367
- blocoPegue = this.corpoDaFuncao('bloco `pegue`');
1374
+ blocoPegue = await this.corpoDaFuncao('bloco `pegue`');
1368
1375
  }
1369
1376
  else {
1370
1377
  // Caso 2: sem parâmetro de erro.
1371
1378
  // `pegue` recebe um bloco.
1372
1379
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
1373
- blocoPegue = this.blocoEscopo();
1380
+ blocoPegue = await this.blocoEscopo();
1374
1381
  }
1375
1382
  }
1376
1383
  let blocoSenao = null;
1377
1384
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
1378
1385
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
1379
- blocoSenao = this.blocoEscopo();
1386
+ blocoSenao = await this.blocoEscopo();
1380
1387
  }
1381
1388
  let blocoFinalmente = null;
1382
1389
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.FINALMENTE)) {
1383
1390
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
1384
- blocoFinalmente = this.blocoEscopo();
1391
+ blocoFinalmente = await this.blocoEscopo();
1385
1392
  }
1386
1393
  return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
1387
1394
  }
1388
- resolverDecorador() {
1395
+ async resolverDecoradores() {
1389
1396
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
1390
- let nomeDecorador = '';
1397
+ this.avancarEDevolverAnterior(); // Arroba
1398
+ let nomeDecorador = '@';
1391
1399
  let linha;
1392
1400
  let parametros = [];
1393
- let parenteseEsquerdo = false;
1394
- linha = this.simbolos[this.atual].linha;
1395
- let simbolosLinhaAtual = this.simbolos.filter((l) => l.linha === linha);
1396
- for (let simbolo of simbolosLinhaAtual) {
1397
- parenteseEsquerdo = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
1398
- if (parenteseEsquerdo) {
1399
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1400
- parametros = this.logicaComumParametros();
1401
- }
1402
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1403
- break;
1404
- }
1405
- this.avancarEDevolverAnterior();
1406
- nomeDecorador += simbolo.lexema || '.';
1407
- }
1408
1401
  const atributos = {};
1409
- for (const parametro of parametros) {
1410
- if (parametro.nome.lexema in atributos) {
1411
- throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
1402
+ const primeiraParteNomeDecorador = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de decorador após '@'.");
1403
+ linha = Number(primeiraParteNomeDecorador.linha);
1404
+ nomeDecorador += primeiraParteNomeDecorador.lexema;
1405
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
1406
+ const parteNomeDecorador = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de decorador após '.'.");
1407
+ nomeDecorador += '.' + parteNomeDecorador.lexema;
1408
+ }
1409
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
1410
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1411
+ parametros = await this.logicaComumParametros();
1412
1412
  }
1413
- atributos[parametro.nome.lexema] = parametro.valorPadrao;
1413
+ for (const parametro of parametros) {
1414
+ if (parametro.nome.lexema in atributos) {
1415
+ throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
1416
+ }
1417
+ atributos[parametro.nome.lexema] = parametro.valorPadrao;
1418
+ }
1419
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após nome de decorador.");
1414
1420
  }
1415
1421
  this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
1416
1422
  }
1417
1423
  }
1418
- declaracaoTendoComo() {
1424
+ async declaracaoTendoComo() {
1419
1425
  const simboloTendo = this.simbolos[this.atual - 1];
1420
- const expressaoInicializacao = this.expressao();
1426
+ const expressaoInicializacao = await this.expressao();
1421
1427
  this.consumir(delegua_2.default.COMO, "Esperado palavra reservada 'como' após expressão de inicialização de variável, em declaração 'tendo'.");
1422
1428
  const simboloNomeVariavel = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
1423
1429
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
@@ -1440,17 +1446,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1440
1446
  break;
1441
1447
  }
1442
1448
  this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloNomeVariavel.lexema, tipoInicializacao));
1443
- const blocoCorpo = this.blocoEscopo();
1449
+ const blocoCorpo = await this.blocoEscopo();
1444
1450
  return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
1445
1451
  }
1446
- declaracaoDesestruturacaoVariavel() {
1452
+ async declaracaoDesestruturacaoVariavel() {
1447
1453
  const identificadores = [];
1448
1454
  do {
1449
1455
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1450
1456
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1451
1457
  this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
1452
- this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
1453
- const inicializador = this.expressao();
1458
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1459
+ throw this.erro(this.simbolos[this.atual], 'Esperado igual ou seta esquerda após relação de propriedades da desestruturação.');
1460
+ }
1461
+ const inicializador = await this.expressao();
1454
1462
  const retornos = [];
1455
1463
  for (let identificador of identificadores) {
1456
1464
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
@@ -1559,7 +1567,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1559
1567
  }
1560
1568
  resolverValorConstruto(construto) {
1561
1569
  if (construto instanceof construtos_1.Literal) {
1562
- return construto.valor;
1570
+ return String(construto.valor);
1563
1571
  }
1564
1572
  throw this.erro({ hashArquivo: construto.hashArquivo, linha: construto.linha }, `Construto do tipo ${construto.constructor} não possui um mapeamento de valor.`);
1565
1573
  }
@@ -1587,13 +1595,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1587
1595
  * Caso símbolo atual seja `var`, devolve uma declaração de variável.
1588
1596
  * @returns Um Construto do tipo Var.
1589
1597
  */
1590
- declaracaoDeVariaveis() {
1598
+ async declaracaoDeVariaveis() {
1591
1599
  const simboloVariavel = this.simboloAnterior();
1592
1600
  const identificadores = [];
1593
1601
  const retorno = [];
1594
1602
  let tipo = 'qualquer';
1595
1603
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1596
- return this.declaracaoDesestruturacaoVariavel();
1604
+ return await this.declaracaoDesestruturacaoVariavel();
1597
1605
  }
1598
1606
  do {
1599
1607
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
@@ -1604,7 +1612,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1604
1612
  tipoExplicito = true;
1605
1613
  this.avancarEDevolverAnterior();
1606
1614
  }
1607
- if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1615
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1608
1616
  // Inicialização de variáveis sem valor.
1609
1617
  for (let identificador of identificadores.values()) {
1610
1618
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
@@ -1616,7 +1624,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1616
1624
  }
1617
1625
  const inicializadores = [];
1618
1626
  do {
1619
- inicializadores.push(this.expressao());
1627
+ inicializadores.push(await this.expressao());
1620
1628
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1621
1629
  if (identificadores.length !== inicializadores.length) {
1622
1630
  throw this.erro(simboloVariavel, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
@@ -1636,14 +1644,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1636
1644
  this.pilhaDecoradores = [];
1637
1645
  return retorno;
1638
1646
  }
1639
- declaracaoDesestruturacaoConstante() {
1647
+ async declaracaoDesestruturacaoConstante() {
1640
1648
  const identificadores = [];
1641
1649
  do {
1642
1650
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1643
1651
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1644
1652
  this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
1645
- this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
1646
- const inicializador = this.expressao();
1653
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1654
+ throw this.erro(this.simbolos[this.atual], 'Esperado igual ou seta esquerda após relação de propriedades da desestruturação.');
1655
+ }
1656
+ const inicializador = await this.expressao();
1647
1657
  const retornos = [];
1648
1658
  for (let identificador of identificadores) {
1649
1659
  // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
@@ -1658,12 +1668,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1658
1668
  * Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
1659
1669
  * @returns Um Construto do tipo Const.
1660
1670
  */
1661
- declaracaoDeConstantes() {
1671
+ async declaracaoDeConstantes() {
1662
1672
  const simboloConstante = this.simboloAnterior();
1663
1673
  const identificadores = [];
1664
1674
  let tipo = 'qualquer';
1665
1675
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1666
- return this.declaracaoDesestruturacaoConstante();
1676
+ return await this.declaracaoDesestruturacaoConstante();
1667
1677
  }
1668
1678
  do {
1669
1679
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da constante.'));
@@ -1674,10 +1684,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1674
1684
  tipoExplicito = true;
1675
1685
  this.avancarEDevolverAnterior();
1676
1686
  }
1677
- this.consumir(delegua_2.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
1687
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1688
+ throw this.erro(this.simbolos[this.atual], "Esperado '=' ou '<-' após identificador em instrução 'constante'.");
1689
+ }
1678
1690
  const inicializadores = [];
1679
1691
  do {
1680
- inicializadores.push(this.expressao());
1692
+ inicializadores.push(await this.expressao());
1681
1693
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1682
1694
  if (identificadores.length !== inicializadores.length) {
1683
1695
  throw this.erro(simboloConstante, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
@@ -1699,7 +1711,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1699
1711
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1700
1712
  return retorno;
1701
1713
  }
1702
- funcao(tipo) {
1714
+ async funcao(tipo) {
1703
1715
  let simbolo;
1704
1716
  switch (this.simbolos[this.atual].tipo) {
1705
1717
  case delegua_2.default.CONSTRUTOR:
@@ -1714,14 +1726,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1714
1726
  // Se houver chamadas recursivas à função, precisamos definir um tipo
1715
1727
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1716
1728
  this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, 'qualquer'));
1717
- const corpoDaFuncao = this.corpoDaFuncao(tipo);
1729
+ const corpoDaFuncao = await this.corpoDaFuncao(tipo);
1718
1730
  const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
1719
1731
  this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, tipoDaFuncao));
1720
1732
  const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao, decoradores);
1721
1733
  this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
1722
1734
  return funcaoDeclaracao;
1723
1735
  }
1724
- logicaComumParametros() {
1736
+ async logicaComumParametros() {
1725
1737
  const parametros = [];
1726
1738
  do {
1727
1739
  const parametro = {};
@@ -1733,13 +1745,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1733
1745
  parametro.abrangencia = 'padrao';
1734
1746
  }
1735
1747
  parametro.nome = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
1748
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1749
+ try {
1750
+ const valorPadrao = await this.primario();
1751
+ parametro.valorPadrao = valorPadrao;
1752
+ }
1753
+ catch (erro) {
1754
+ throw this.erro(this.simbolos[this.atual], `Valor padrão do parâmetro '${parametro.nome.lexema}' é inválido.`);
1755
+ }
1756
+ }
1736
1757
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1737
1758
  let tipoDadoParametro = this.verificarDefinicaoTipoAtual();
1738
1759
  parametro.tipoDado = tipoDadoParametro;
1739
1760
  this.avancarEDevolverAnterior();
1740
1761
  }
1741
1762
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1742
- const valorPadrao = this.primario();
1763
+ const valorPadrao = await this.primario();
1743
1764
  parametro.valorPadrao = valorPadrao;
1744
1765
  }
1745
1766
  this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
@@ -1749,13 +1770,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1749
1770
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1750
1771
  return parametros;
1751
1772
  }
1752
- corpoDaFuncao(tipo) {
1773
+ async corpoDaFuncao(tipo) {
1753
1774
  // O parêntese esquerdo é considerado o símbolo inicial para
1754
1775
  // fins de localização.
1755
1776
  const parenteseEsquerdo = this.consumir(delegua_2.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
1756
1777
  let parametros = [];
1757
1778
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1758
- parametros = this.logicaComumParametros();
1779
+ parametros = await this.logicaComumParametros();
1759
1780
  }
1760
1781
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1761
1782
  let tipoRetorno = 'qualquer';
@@ -1766,7 +1787,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1766
1787
  definicaoExplicitaDeTipo = true;
1767
1788
  }
1768
1789
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1769
- const corpo = this.blocoEscopo();
1790
+ const corpo = await this.blocoEscopo();
1770
1791
  let expressoesRetorna = [];
1771
1792
  for (const declaracao of corpo) {
1772
1793
  expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
@@ -1801,7 +1822,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1801
1822
  }
1802
1823
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno, definicaoExplicitaDeTipo);
1803
1824
  }
1804
- declaracaoDeClasse() {
1825
+ async declaracaoDeClasse() {
1805
1826
  const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
1806
1827
  const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
1807
1828
  let superClasse = null;
@@ -1821,7 +1842,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1821
1842
  // Se o símbolo atual é arroba, é um decorador.
1822
1843
  // Caso contrário, verificamos o próximo símbolo.
1823
1844
  if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
1824
- this.resolverDecorador();
1845
+ await this.resolverDecoradores();
1825
1846
  continue;
1826
1847
  }
1827
1848
  // Se o próximo símbolo ao atual for um parênteses, é um método.
@@ -1829,7 +1850,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1829
1850
  const proximoSimbolo = this.simbolos[this.atual + 1];
1830
1851
  switch (proximoSimbolo.tipo) {
1831
1852
  case delegua_2.default.PARENTESE_ESQUERDO:
1832
- metodos.push(this.funcao('método'));
1853
+ metodos.push(await this.funcao('método'));
1833
1854
  break;
1834
1855
  case delegua_2.default.DOIS_PONTOS:
1835
1856
  const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
@@ -1859,23 +1880,23 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1859
1880
  * @returns Uma função ou classe se o símbolo atual resolver aqui.
1860
1881
  * O retorno de `resolverDeclaracao()` em caso contrário.
1861
1882
  * @see resolverDeclaracao
1862
- * @see resolverDecorador
1883
+ * @see resolverDecoradores
1863
1884
  */
1864
- resolverDeclaracaoForaDeBloco() {
1885
+ async resolverDeclaracaoForaDeBloco() {
1865
1886
  try {
1866
1887
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
1867
- this.resolverDecorador();
1888
+ await this.resolverDecoradores();
1868
1889
  }
1869
1890
  if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1870
1891
  this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1871
1892
  this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
1872
1893
  this.avancarEDevolverAnterior();
1873
- return this.funcao('funcao');
1894
+ return await this.funcao('funcao');
1874
1895
  }
1875
1896
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CLASSE)) {
1876
- return this.declaracaoDeClasse();
1897
+ return await this.declaracaoDeClasse();
1877
1898
  }
1878
- return this.resolverDeclaracao();
1899
+ return await this.resolverDeclaracao();
1879
1900
  }
1880
1901
  catch (erro) {
1881
1902
  this.sincronizar();
@@ -1915,36 +1936,36 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1915
1936
  * @see resolverDeclaracaoForaDeBloco para as declarações que não podem
1916
1937
  * ocorrer em blocos de escopo elementares.
1917
1938
  */
1918
- resolverDeclaracao() {
1939
+ async resolverDeclaracao() {
1919
1940
  switch (this.simbolos[this.atual].tipo) {
1920
1941
  case delegua_2.default.AJUDA:
1921
- return this.declaracaoAjuda();
1942
+ return await this.declaracaoAjuda();
1922
1943
  case delegua_2.default.CHAVE_ESQUERDA:
1923
1944
  const simboloInicioBloco = this.avancarEDevolverAnterior();
1924
- return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
1945
+ return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
1925
1946
  case delegua_2.default.COMENTARIO:
1926
1947
  return this.declaracaoComentarioUmaLinha();
1927
1948
  case delegua_2.default.CONSTANTE:
1928
1949
  this.avancarEDevolverAnterior();
1929
- return this.declaracaoDeConstantes();
1950
+ return await this.declaracaoDeConstantes();
1930
1951
  case delegua_2.default.CONTINUA:
1931
1952
  this.avancarEDevolverAnterior();
1932
1953
  return this.declaracaoContinua();
1933
1954
  case delegua_2.default.ENQUANTO:
1934
1955
  this.avancarEDevolverAnterior();
1935
- return this.declaracaoEnquanto();
1956
+ return await this.declaracaoEnquanto();
1936
1957
  case delegua_2.default.ESCOLHA:
1937
1958
  this.avancarEDevolverAnterior();
1938
- return this.declaracaoEscolha();
1959
+ return await this.declaracaoEscolha();
1939
1960
  case delegua_2.default.ESCREVA:
1940
1961
  this.avancarEDevolverAnterior();
1941
- return this.declaracaoEscreva();
1962
+ return await this.declaracaoEscreva();
1942
1963
  case delegua_2.default.FALHAR:
1943
1964
  this.avancarEDevolverAnterior();
1944
- return this.declaracaoFalhar();
1965
+ return await this.declaracaoFalhar();
1945
1966
  case delegua_2.default.FAZER:
1946
1967
  const simboloFazer = this.avancarEDevolverAnterior();
1947
- return this.declaracaoFazer(simboloFazer);
1968
+ return await this.declaracaoFazer(simboloFazer);
1948
1969
  case delegua_2.default.IMPORTAR:
1949
1970
  this.avancarEDevolverAnterior();
1950
1971
  return this.declaracaoImportar();
@@ -1952,25 +1973,25 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1952
1973
  return this.declaracaoComentarioMultilinha();
1953
1974
  case delegua_2.default.PARA:
1954
1975
  this.avancarEDevolverAnterior();
1955
- return this.declaracaoPara();
1976
+ return await this.declaracaoPara();
1956
1977
  case delegua_2.default.SUSTAR:
1957
1978
  this.avancarEDevolverAnterior();
1958
1979
  return this.declaracaoSustar();
1959
1980
  case delegua_2.default.SE:
1960
1981
  this.avancarEDevolverAnterior();
1961
- return this.declaracaoSe();
1982
+ return await this.declaracaoSe();
1962
1983
  case delegua_2.default.RETORNA:
1963
1984
  this.avancarEDevolverAnterior();
1964
- return this.declaracaoRetorna();
1985
+ return await this.declaracaoRetorna();
1965
1986
  case delegua_2.default.TENDO:
1966
1987
  this.avancarEDevolverAnterior();
1967
- return this.declaracaoTendoComo();
1988
+ return await this.declaracaoTendoComo();
1968
1989
  case delegua_2.default.TENTE:
1969
1990
  this.avancarEDevolverAnterior();
1970
- return this.declaracaoTente();
1991
+ return await this.declaracaoTente();
1971
1992
  case delegua_2.default.VARIAVEL:
1972
1993
  this.avancarEDevolverAnterior();
1973
- return this.declaracaoDeVariaveis();
1994
+ return await this.declaracaoDeVariaveis();
1974
1995
  }
1975
1996
  const simboloAtual = this.simbolos[this.atual];
1976
1997
  if (simboloAtual.tipo === delegua_2.default.IDENTIFICADOR) {
@@ -1984,9 +2005,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1984
2005
  throw this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
1985
2006
  }
1986
2007
  }
1987
- return this.declaracaoExpressao();
2008
+ return await this.declaracaoExpressao();
1988
2009
  }
1989
- declaracaoAjuda() {
2010
+ async declaracaoAjuda() {
1990
2011
  const simboloAjuda = this.avancarEDevolverAnterior();
1991
2012
  if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
1992
2013
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
@@ -1996,7 +2017,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1996
2017
  this.avancarEDevolverAnterior();
1997
2018
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, true);
1998
2019
  }
1999
- const expressaoAjuda = this.expressao();
2020
+ const expressaoAjuda = await this.expressao();
2000
2021
  this.consumir(delegua_2.default.PARENTESE_DIREITO, `Esperado parêntese direito após expressão usada como argumento em ajuda(). Atual: ${this.simbolos[this.atual].lexema}.`);
2001
2022
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, expressaoAjuda);
2002
2023
  }
@@ -2102,7 +2123,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2102
2123
  }
2103
2124
  }
2104
2125
  }
2105
- analisar(retornoLexador, hashArquivo) {
2126
+ async analisar(retornoLexador, hashArquivo) {
2106
2127
  const inicioAnalise = (0, browser_process_hrtime_1.default)();
2107
2128
  this.erros = [];
2108
2129
  this.atual = 0;
@@ -2115,8 +2136,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2115
2136
  this.inicializarPilhaEscopos();
2116
2137
  let declaracoes = [];
2117
2138
  while (!this.estaNoFinal()) {
2118
- this.resolverDecorador();
2119
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
2139
+ await this.resolverDecoradores();
2140
+ const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
2120
2141
  if (Array.isArray(retornoDeclaracao)) {
2121
2142
  declaracoes = declaracoes.concat(retornoDeclaracao);
2122
2143
  }