@designliquido/delegua 0.73.0 → 1.1.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 (159) 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 +39 -34
  6. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  7. package/avaliador-sintatico/avaliador-sintatico-base.js +55 -34
  8. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts +88 -74
  10. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  11. package/avaliador-sintatico/avaliador-sintatico.js +302 -249
  12. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  13. package/avaliador-sintatico/comum.d.ts.map +1 -1
  14. package/avaliador-sintatico/comum.js.map +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts +14 -14
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts.map +1 -1
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js +29 -28
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +2 -2
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +5 -5
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +13 -13
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
  25. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +17 -17
  26. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  27. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +41 -40
  28. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  29. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +208 -140
  30. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  31. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +13 -13
  32. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  33. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +25 -25
  34. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  35. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts +37 -38
  36. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
  37. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +105 -110
  38. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  39. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts +35 -35
  40. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  41. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +98 -101
  42. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  43. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts +1 -48
  44. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
  45. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js +3 -138
  46. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
  47. package/bibliotecas/biblioteca-global.d.ts +3 -2
  48. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  49. package/bibliotecas/biblioteca-global.js +92 -151
  50. package/bibliotecas/biblioteca-global.js.map +1 -1
  51. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +3 -2
  52. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  53. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +20 -25
  54. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  55. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.d.ts.map +1 -1
  56. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js +5 -5
  57. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
  58. package/bibliotecas/dialetos/pitugues/primitivas-numero.d.ts.map +1 -1
  59. package/bibliotecas/dialetos/pitugues/primitivas-numero.js +4 -4
  60. package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
  61. package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts.map +1 -1
  62. package/bibliotecas/dialetos/pitugues/primitivas-texto.js +18 -18
  63. package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
  64. package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts +6 -0
  65. package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts.map +1 -0
  66. package/bibliotecas/dialetos/pitugues/primitivas-tupla.js +23 -0
  67. package/bibliotecas/dialetos/pitugues/primitivas-tupla.js.map +1 -0
  68. package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
  69. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +33 -37
  70. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
  71. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  72. package/bibliotecas/primitivas-dicionario.js +5 -5
  73. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  74. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  75. package/bibliotecas/primitivas-numero.js +4 -4
  76. package/bibliotecas/primitivas-numero.js.map +1 -1
  77. package/bibliotecas/primitivas-texto.d.ts +1 -1
  78. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  79. package/bibliotecas/primitivas-texto.js +21 -21
  80. package/bibliotecas/primitivas-texto.js.map +1 -1
  81. package/bibliotecas/primitivas-tupla.d.ts +6 -0
  82. package/bibliotecas/primitivas-tupla.d.ts.map +1 -0
  83. package/bibliotecas/primitivas-tupla.js +45 -0
  84. package/bibliotecas/primitivas-tupla.js.map +1 -0
  85. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  86. package/bibliotecas/primitivas-vetor.js +56 -38
  87. package/bibliotecas/primitivas-vetor.js.map +1 -1
  88. package/bin/package.json +1 -1
  89. package/construtos/dicionario.d.ts +2 -1
  90. package/construtos/dicionario.d.ts.map +1 -1
  91. package/construtos/dicionario.js +2 -1
  92. package/construtos/dicionario.js.map +1 -1
  93. package/construtos/literal.d.ts +1 -1
  94. package/construtos/literal.d.ts.map +1 -1
  95. package/construtos/literal.js +4 -0
  96. package/construtos/literal.js.map +1 -1
  97. package/formatadores/formatador-delegua.d.ts.map +1 -1
  98. package/formatadores/formatador-delegua.js +10 -3
  99. package/formatadores/formatador-delegua.js.map +1 -1
  100. package/interfaces/avaliador-sintatico-interface.d.ts +1 -1
  101. package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
  102. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -1
  103. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +1 -1
  104. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  105. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  106. package/interpretador/dialetos/pitugues/comum.js +19 -0
  107. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  108. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -1
  109. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  110. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +3 -4
  111. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  112. package/interpretador/estruturas/metodo-primitiva.d.ts +2 -2
  113. package/interpretador/estruturas/metodo-primitiva.js +4 -4
  114. package/interpretador/estruturas/metodo-primitiva.js.map +1 -1
  115. package/interpretador/interpretador-base.d.ts +15 -0
  116. package/interpretador/interpretador-base.d.ts.map +1 -1
  117. package/interpretador/interpretador-base.js +249 -21
  118. package/interpretador/interpretador-base.js.map +1 -1
  119. package/interpretador/interpretador.d.ts +2 -1
  120. package/interpretador/interpretador.d.ts.map +1 -1
  121. package/interpretador/interpretador.js +77 -33
  122. package/interpretador/interpretador.js.map +1 -1
  123. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  124. package/lexador/dialetos/lexador-pitugues.js +44 -1
  125. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  126. package/lexador/lexador.d.ts.map +1 -1
  127. package/lexador/lexador.js +4 -0
  128. package/lexador/lexador.js.map +1 -1
  129. package/package.json +1 -1
  130. package/tipos-de-simbolos/delegua.d.ts +1 -0
  131. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  132. package/tipos-de-simbolos/delegua.js +1 -0
  133. package/tipos-de-simbolos/delegua.js.map +1 -1
  134. package/tipos-de-simbolos/pitugues.d.ts +2 -0
  135. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  136. package/tipos-de-simbolos/pitugues.js +2 -0
  137. package/tipos-de-simbolos/pitugues.js.map +1 -1
  138. package/tradutores/tradutor-assembly-x64.js +122 -122
  139. package/tradutores/tradutor-assemblyscript.js +1 -1
  140. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  141. package/tradutores/tradutor-calango.d.ts +4 -3
  142. package/tradutores/tradutor-calango.d.ts.map +1 -1
  143. package/tradutores/tradutor-calango.js +7 -14
  144. package/tradutores/tradutor-calango.js.map +1 -1
  145. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  146. package/tradutores/tradutor-javascript.js +12 -5
  147. package/tradutores/tradutor-javascript.js.map +1 -1
  148. package/tradutores/tradutor-mermaidjs.js +1 -1
  149. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  150. package/tradutores/tradutor-portugol-ipt.d.ts +1 -1
  151. package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
  152. package/tradutores/tradutor-portugol-ipt.js +3 -3
  153. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  154. package/tradutores/tradutor-python.d.ts.map +1 -1
  155. package/tradutores/tradutor-python.js +12 -5
  156. package/tradutores/tradutor-python.js.map +1 -1
  157. package/tradutores/tradutor-reverso-tenda.js +1 -1
  158. package/tradutores/tradutor-reverso-tenda.js.map +1 -1
  159. package/umd/delegua.js +1582 -1350
@@ -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 = [];
@@ -273,13 +277,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
273
277
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
274
278
  return this.construtoTupla();
275
279
  }
276
- // Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
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,18 +346,18 @@ 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:
353
357
  const simboloIdentificador = this.avancarEDevolverAnterior();
354
358
  let tipoOperando;
355
359
  if (this.intuirTipoQualquerParaIdentificadores) {
356
- // Esta indicação é utilizada para compreensões de lista, onde o
360
+ // Esta indicação é utilizada para compreensões de lista, onde o
357
361
  // tipo do identificador de iteração é 'qualquer' por definição.
358
362
  tipoOperando = 'qualquer';
359
363
  this.pilhaEscopos.definirInformacoesVariavel(simboloIdentificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloIdentificador.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
@@ -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,17 @@ 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
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_DIREITO)) {
410
+ return new construtos_1.TuplaN(this.hashArquivo, Number(simboloAtual.linha), []);
411
+ }
412
+ const expressao = await this.tupla();
413
+ if (expressao instanceof construtos_1.TuplaN) {
414
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após itens da tupla.");
415
+ return expressao;
416
+ }
406
417
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
407
418
  return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
408
419
  case delegua_2.default.SUPER:
@@ -422,7 +433,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
422
433
  construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
423
434
  }
424
435
  else {
425
- construto = this.expressao();
436
+ construto = await this.expressao();
426
437
  }
427
438
  if (construto.constructor === construtos_1.AcessoMetodoOuPropriedade) {
428
439
  const construtoTipado = construto;
@@ -479,6 +490,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
479
490
  }
480
491
  return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
481
492
  }
493
+ // TODO: O correto seria emitir algum aviso aqui que este avaliador sintático não consegue
494
+ // lidar com tópicos de ajuda neste ponto.
482
495
  if (this.emAjuda) {
483
496
  console.log(this.simbolos[this.atual]);
484
497
  }
@@ -515,15 +528,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
515
528
  }
516
529
  return tipoAcesso;
517
530
  }
518
- resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
531
+ async resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
519
532
  if (!this.simbolos[this.atual]) {
520
533
  return expressaoAnterior;
521
534
  }
522
535
  switch (this.simbolos[this.atual].tipo) {
523
536
  case delegua_2.default.PARENTESE_ESQUERDO:
524
537
  this.avancarEDevolverAnterior();
525
- const chamada = this.finalizarChamada(expressaoAnterior, tipoAnterior);
526
- return this.resolverCadeiaChamadas(chamada);
538
+ const chamada = await this.finalizarChamada(expressaoAnterior, tipoAnterior);
539
+ return await this.resolverCadeiaChamadas(chamada);
527
540
  case delegua_2.default.PONTO:
528
541
  this.avancarEDevolverAnterior();
529
542
  this.verificarSeSimboloAtualEIgualA();
@@ -541,21 +554,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
541
554
  }
542
555
  }
543
556
  const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
544
- return this.resolverCadeiaChamadas(acesso, tipoInferido);
557
+ return await this.resolverCadeiaChamadas(acesso, tipoInferido);
545
558
  case delegua_2.default.COLCHETE_ESQUERDO:
546
559
  const tipoAcesso = this.resolverTipoAcessoIndiceVariavel(expressaoAnterior);
547
560
  this.avancarEDevolverAnterior();
548
- const indice = this.expressao();
561
+ const indice = await this.expressao();
549
562
  const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
550
563
  const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento, tipoAcesso);
551
- return this.resolverCadeiaChamadas(acessoVariavel);
564
+ return await this.resolverCadeiaChamadas(acessoVariavel);
552
565
  default:
553
566
  return expressaoAnterior;
554
567
  }
555
568
  }
556
- chamar() {
557
- let expressao = this.primario();
558
- return this.resolverCadeiaChamadas(expressao);
569
+ async chamar() {
570
+ let expressao = await this.primario();
571
+ return await this.resolverCadeiaChamadas(expressao);
559
572
  }
560
573
  /**
561
574
  * `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
@@ -699,7 +712,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
699
712
  }
700
713
  return entidadeChamada;
701
714
  }
702
- finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
715
+ async finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
703
716
  const argumentos = [];
704
717
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
705
718
  do {
@@ -707,7 +720,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
707
720
  if (argumentos.length >= 255) {
708
721
  throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
709
722
  }
710
- argumentos.push(this.expressao());
723
+ argumentos.push(await this.expressao());
711
724
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
712
725
  }
713
726
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
@@ -720,24 +733,24 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
720
733
  construtoChamada.tipo = 'qualquer';
721
734
  return construtoChamada;
722
735
  }
723
- unario() {
736
+ async unario() {
724
737
  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
738
  const operador = this.simbolos[this.atual - 1];
726
- const direito = this.unario();
739
+ const direito = await this.unario();
727
740
  return new construtos_1.Unario(this.hashArquivo, operador, direito, 'ANTES');
728
741
  }
729
- return this.chamar();
742
+ return await this.chamar();
730
743
  }
731
744
  /**
732
745
  * A exponenciacão é uma exceção na ordem de avaliação (resolve primeiro à direita).
733
746
  * Por isso `direito` chama `exponenciacao()`, e não `unario()`.
734
747
  * @returns {Binario} A expressão binária na forma do construto `Binario`.
735
748
  */
736
- exponenciacao() {
737
- let expressao = this.unario();
749
+ async exponenciacao() {
750
+ let expressao = await this.unario();
738
751
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
739
752
  const operador = this.simbolos[this.atual - 1];
740
- const direito = this.exponenciacao();
753
+ const direito = await this.exponenciacao();
741
754
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
742
755
  }
743
756
  return expressao;
@@ -789,11 +802,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
789
802
  }
790
803
  }
791
804
  }
792
- multiplicar() {
793
- let expressao = this.exponenciacao();
805
+ async multiplicar() {
806
+ let expressao = await this.exponenciacao();
794
807
  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
808
  const operador = this.simbolos[this.atual - 1];
796
- const direito = this.exponenciacao();
809
+ const direito = await this.exponenciacao();
797
810
  this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
798
811
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
799
812
  }
@@ -804,68 +817,68 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
804
817
  * ser avaliado pelo Interpretador.
805
818
  * @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
806
819
  */
807
- adicaoOuSubtracao() {
808
- let expressao = this.multiplicar();
820
+ async adicaoOuSubtracao() {
821
+ let expressao = await this.multiplicar();
809
822
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MENOS_IGUAL)) {
810
823
  const operador = this.simbolos[this.atual - 1];
811
- const direito = this.multiplicar();
824
+ const direito = await this.multiplicar();
812
825
  this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
813
826
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
814
827
  }
815
828
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIS_IGUAL)) {
816
829
  const operador = this.simbolos[this.atual - 1];
817
- const direito = this.atribuir();
830
+ const direito = await this.ou();
818
831
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
819
832
  }
820
833
  return expressao;
821
834
  }
822
- bitShift() {
823
- let expressao = this.adicaoOuSubtracao();
835
+ async bitShift() {
836
+ let expressao = await this.adicaoOuSubtracao();
824
837
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MENOR_MENOR, delegua_2.default.MAIOR_MAIOR)) {
825
838
  const operador = this.simbolos[this.atual - 1];
826
- const direito = this.adicaoOuSubtracao();
839
+ const direito = await this.adicaoOuSubtracao();
827
840
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
828
841
  }
829
842
  return expressao;
830
843
  }
831
- bitE() {
832
- let expressao = this.bitShift();
844
+ async bitE() {
845
+ let expressao = await this.bitShift();
833
846
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_AND)) {
834
847
  const operador = this.simbolos[this.atual - 1];
835
- const direito = this.bitShift();
848
+ const direito = await this.bitShift();
836
849
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
837
850
  }
838
851
  return expressao;
839
852
  }
840
- bitOu() {
841
- let expressao = this.bitE();
853
+ async bitOu() {
854
+ let expressao = await this.bitE();
842
855
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_OR, delegua_2.default.BIT_XOR)) {
843
856
  const operador = this.simbolos[this.atual - 1];
844
- const direito = this.bitE();
857
+ const direito = await this.bitE();
845
858
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
846
859
  }
847
860
  return expressao;
848
861
  }
849
- comparar() {
850
- let expressao = this.bitOu();
862
+ async comparar() {
863
+ let expressao = await this.bitOu();
851
864
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
852
865
  const operador = this.simbolos[this.atual - 1];
853
- const direito = this.bitOu();
866
+ const direito = await this.bitOu();
854
867
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
855
868
  }
856
869
  return expressao;
857
870
  }
858
- comparacaoIgualdade() {
859
- let expressao = this.comparar();
871
+ async comparacaoIgualdade() {
872
+ let expressao = await this.comparar();
860
873
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIFERENTE, delegua_2.default.IGUAL_IGUAL)) {
861
874
  const operador = this.simbolos[this.atual - 1];
862
- const direito = this.comparar();
875
+ const direito = await this.comparar();
863
876
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
864
877
  }
865
878
  return expressao;
866
879
  }
867
- em() {
868
- let expressao = this.comparacaoIgualdade();
880
+ async em() {
881
+ let expressao = await this.comparacaoIgualdade();
869
882
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EM, delegua_2.default.CONTEM, delegua_2.default.NAO)) {
870
883
  let operador = this.simbolos[this.atual - 1];
871
884
  let negado = false;
@@ -873,36 +886,36 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
873
886
  operador = this.consumir(delegua_2.default.CONTEM, `Esperado palavra reservada 'contém' ou 'contem' após palavra reservada ${operador.lexema}.`);
874
887
  negado = true;
875
888
  }
876
- const direito = this.comparacaoIgualdade();
889
+ const direito = await this.comparacaoIgualdade();
877
890
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
878
891
  expressao.negado = negado;
879
892
  }
880
893
  return expressao;
881
894
  }
882
- e() {
883
- let expressao = this.em();
895
+ async e() {
896
+ let expressao = await this.em();
884
897
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.E)) {
885
898
  const operador = this.simbolos[this.atual - 1];
886
- const direito = this.em();
899
+ const direito = await this.em();
887
900
  expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
888
901
  }
889
902
  return expressao;
890
903
  }
891
- elvis() {
892
- let expressao = this.ou();
904
+ async elvis() {
905
+ let expressao = await this.ou();
893
906
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ELVIS)) {
894
- const direito = this.ou();
907
+ const direito = await this.ou();
895
908
  return new construtos_1.Elvis(this.hashArquivo, expressao, direito);
896
909
  }
897
910
  return expressao;
898
911
  }
899
- seTernario() {
900
- let expressaoOuCondicao = this.elvis();
912
+ async seTernario() {
913
+ let expressaoOuCondicao = await this.elvis();
901
914
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.INTERROGACAO)) {
902
915
  const operador = this.simbolos[this.atual - 1];
903
- const expressaoEntao = this.seTernario();
916
+ const expressaoEntao = await this.seTernario();
904
917
  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();
918
+ const expressaoSenao = await this.seTernario();
906
919
  expressaoOuCondicao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
907
920
  }
908
921
  return expressaoOuCondicao;
@@ -911,8 +924,33 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
911
924
  * Método que resolve atribuições.
912
925
  * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
913
926
  */
914
- atribuir() {
915
- const expressao = this.seTernario();
927
+ /**
928
+ * Processa tuplas, que são expressões separadas por vírgula entre parênteses.
929
+ * Se não houver vírgula, retorna apenas a expressão simples.
930
+ * Sobrescreve o método da base para usar seTernario() em vez de ou().
931
+ */
932
+ async tupla() {
933
+ let expressao = await this.seTernario();
934
+ // Se não há vírgula, retorna a expressão simples
935
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA)) {
936
+ return expressao;
937
+ }
938
+ // Se há vírgula, então é uma tupla
939
+ const elementos = [expressao];
940
+ do {
941
+ if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
942
+ break;
943
+ }
944
+ elementos.push(await this.seTernario());
945
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
946
+ return new construtos_1.TuplaN(this.hashArquivo, expressao.linha, elementos);
947
+ }
948
+ /**
949
+ * Método que resolve atribuições.
950
+ * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
951
+ */
952
+ async atribuir() {
953
+ const expressao = await this.seTernario();
916
954
  if (expressao instanceof construtos_1.Binario &&
917
955
  [
918
956
  delegua_2.default.MAIS_IGUAL,
@@ -928,9 +966,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
928
966
  }
929
967
  return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda, expressao, undefined, expressao.operador);
930
968
  }
931
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
969
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
932
970
  const igual = this.simbolos[this.atual - 1];
933
- const valor = this.seTernario();
971
+ const valor = await this.seTernario();
934
972
  switch (expressao.constructor) {
935
973
  case construtos_1.Variavel:
936
974
  return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
@@ -949,7 +987,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
949
987
  * Declaração para comando `leia`, para ler dados de entrada do usuário.
950
988
  * @returns Um objeto da classe `Leia`.
951
989
  */
952
- expressaoLeia() {
990
+ async expressaoLeia() {
953
991
  const simboloLeia = this.avancarEDevolverAnterior();
954
992
  if (this.emAjuda && this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
955
993
  return new construtos_1.Leia(simboloLeia, []);
@@ -958,22 +996,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
958
996
  const argumentos = [];
959
997
  if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
960
998
  do {
961
- argumentos.push(this.expressao());
999
+ argumentos.push(await this.expressao());
962
1000
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
963
1001
  }
964
1002
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
965
1003
  return new construtos_1.Leia(simboloLeia, argumentos);
966
1004
  }
967
1005
  // TODO: Depreciar.
968
- expressao() {
969
- return this.atribuir();
1006
+ async expressao() {
1007
+ return await this.atribuir();
970
1008
  }
971
- blocoEscopo() {
1009
+ async blocoEscopo() {
972
1010
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
973
1011
  let declaracoes = [];
974
1012
  while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
975
1013
  !this.estaNoFinal()) {
976
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
1014
+ const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
977
1015
  if (Array.isArray(retornoDeclaracao)) {
978
1016
  declaracoes = declaracoes.concat(retornoDeclaracao);
979
1017
  }
@@ -1007,45 +1045,45 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1007
1045
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1008
1046
  return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
1009
1047
  }
1010
- logicaComumEnquanto() {
1011
- const condicao = this.expressao();
1048
+ async logicaComumEnquanto() {
1049
+ const condicao = await this.expressao();
1012
1050
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1013
- const corpo = this.resolverDeclaracao();
1051
+ const corpo = await this.resolverDeclaracao();
1014
1052
  return {
1015
1053
  condicao,
1016
1054
  corpo,
1017
1055
  };
1018
1056
  }
1019
- declaracaoEnquanto() {
1057
+ async declaracaoEnquanto() {
1020
1058
  try {
1021
1059
  this.blocos += 1;
1022
- const { condicao, corpo } = this.logicaComumEnquanto();
1060
+ const { condicao, corpo } = await this.logicaComumEnquanto();
1023
1061
  return new declaracoes_1.Enquanto(condicao, corpo);
1024
1062
  }
1025
1063
  finally {
1026
1064
  this.blocos -= 1;
1027
1065
  }
1028
1066
  }
1029
- declaracaoEscolha() {
1067
+ async declaracaoEscolha() {
1030
1068
  try {
1031
1069
  this.blocos += 1;
1032
- const condicao = this.expressao();
1070
+ const condicao = await this.expressao();
1033
1071
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
1034
1072
  const caminhos = [];
1035
1073
  let caminhoPadrao = null;
1036
1074
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
1037
1075
  !this.estaNoFinal()) {
1038
1076
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
1039
- const caminhoCondicoes = [this.expressao()];
1077
+ const caminhoCondicoes = [await this.expressao()];
1040
1078
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
1041
1079
  while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
1042
1080
  this.consumir(delegua_2.default.CASO, null);
1043
- caminhoCondicoes.push(this.expressao());
1081
+ caminhoCondicoes.push(await this.expressao());
1044
1082
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
1045
1083
  }
1046
1084
  let declaracoes = [];
1047
1085
  do {
1048
- const retornoDeclaracao = this.resolverDeclaracao();
1086
+ const retornoDeclaracao = await this.resolverDeclaracao();
1049
1087
  if (Array.isArray(retornoDeclaracao)) {
1050
1088
  declaracoes = declaracoes.concat(retornoDeclaracao);
1051
1089
  }
@@ -1069,7 +1107,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1069
1107
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
1070
1108
  const declaracoes = [];
1071
1109
  do {
1072
- declaracoes.push(this.resolverDeclaracao());
1110
+ declaracoes.push(await this.resolverDeclaracao());
1073
1111
  } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
1074
1112
  !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
1075
1113
  !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
@@ -1084,13 +1122,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1084
1122
  this.blocos -= 1;
1085
1123
  }
1086
1124
  }
1087
- declaracaoEscreva() {
1125
+ async declaracaoEscreva() {
1088
1126
  const simboloAtual = this.simbolos[this.atual];
1089
1127
  this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
1090
1128
  const argumentos = [];
1091
1129
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1092
1130
  do {
1093
- argumentos.push(this.expressao());
1131
+ argumentos.push(await this.expressao());
1094
1132
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1095
1133
  }
1096
1134
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
@@ -1098,33 +1136,34 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1098
1136
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1099
1137
  return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
1100
1138
  }
1101
- declaracaoExpressao() {
1139
+ async declaracaoExpressao() {
1102
1140
  // Se há decoradores a serem adicionados aqui, obtemo-los agora,
1103
1141
  // para evitar que outros passos recursivos peguem-los antes.
1104
1142
  const decoradores = Array.from(this.pilhaDecoradores);
1105
1143
  this.pilhaDecoradores = [];
1106
- const expressao = this.expressao();
1144
+ const expressao = await this.expressao();
1107
1145
  // Ponto-e-vírgula é opcional aqui.
1108
1146
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1109
1147
  return new declaracoes_1.Expressao(expressao, decoradores);
1110
1148
  }
1111
- declaracaoFalhar() {
1149
+ async declaracaoFalhar() {
1112
1150
  const simboloFalha = this.simbolos[this.atual - 1];
1113
- return new declaracoes_1.Falhar(simboloFalha, this.declaracaoExpressao().expressao);
1151
+ const expressaoFalha = await this.expressao();
1152
+ return new declaracoes_1.Falhar(simboloFalha, expressaoFalha);
1114
1153
  }
1115
- logicaComumFazer() {
1116
- const caminhoFazer = this.resolverDeclaracao();
1154
+ async logicaComumFazer() {
1155
+ const caminhoFazer = await this.resolverDeclaracao();
1117
1156
  this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
1118
- const condicaoEnquanto = this.expressao();
1157
+ const condicaoEnquanto = await this.expressao();
1119
1158
  return {
1120
1159
  caminhoFazer,
1121
1160
  condicaoEnquanto,
1122
1161
  };
1123
1162
  }
1124
- declaracaoFazer(simboloFazer) {
1163
+ async declaracaoFazer(simboloFazer) {
1125
1164
  try {
1126
1165
  this.blocos += 1;
1127
- const { caminhoFazer, condicaoEnquanto } = this.logicaComumFazer();
1166
+ const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
1128
1167
  return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, // TODO: Aqui pode ser um `Bloco`?
1129
1168
  condicaoEnquanto);
1130
1169
  }
@@ -1176,22 +1215,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1176
1215
  else {
1177
1216
  importar.elementosImportacao = elementosImportacao;
1178
1217
  }
1179
- return importar;
1218
+ return Promise.resolve(importar);
1180
1219
  }
1181
- declaracaoPara() {
1220
+ async declaracaoPara() {
1182
1221
  try {
1183
1222
  const simboloPara = this.simbolos[this.atual - 1];
1184
1223
  this.blocos += 1;
1185
1224
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
1186
- return this.declaracaoParaCada(simboloPara);
1225
+ return await this.declaracaoParaCada(simboloPara);
1187
1226
  }
1188
- return this.declaracaoParaTradicional(simboloPara);
1227
+ return await this.declaracaoParaTradicional(simboloPara);
1189
1228
  }
1190
1229
  finally {
1191
1230
  this.blocos -= 1;
1192
1231
  }
1193
1232
  }
1194
- logicaParaCadaDicionario(simboloPara) {
1233
+ async logicaParaCadaDicionario(simboloPara) {
1195
1234
  this.avancarEDevolverAnterior(); // chave esquerda
1196
1235
  const nomeVariavelChave = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável para chave de iteração, em instrução 'para cada'.");
1197
1236
  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 +1239,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1200
1239
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1201
1240
  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
1241
  }
1203
- const dicionario = this.expressao();
1242
+ const dicionario = await this.expressao();
1204
1243
  if (!dicionario.hasOwnProperty('tipo')) {
1205
1244
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece ser um dicionário.`);
1206
1245
  }
@@ -1211,7 +1250,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1211
1250
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
1212
1251
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
1213
1252
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1214
- const corpo = this.resolverDeclaracao();
1253
+ const corpo = await this.resolverDeclaracao();
1215
1254
  return {
1216
1255
  nomeVariavelChave,
1217
1256
  nomeVariavelValor,
@@ -1219,17 +1258,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1219
1258
  corpo,
1220
1259
  };
1221
1260
  }
1222
- declaracaoParaCadaDicionario(simboloPara) {
1223
- const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = this.logicaParaCadaDicionario(simboloPara);
1261
+ async declaracaoParaCadaDicionario(simboloPara) {
1262
+ const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = await this.logicaParaCadaDicionario(simboloPara);
1224
1263
  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
1264
  }
1226
- logicaComumParaCadaVetor(simboloPara) {
1265
+ async logicaComumParaCadaVetor(simboloPara) {
1227
1266
  const nomeVariavelIteracao = this.avancarEDevolverAnterior();
1228
1267
  const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao);
1229
1268
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1230
1269
  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
1270
  }
1232
- let vetorOuDicionario = this.expressao();
1271
+ let vetorOuDicionario = await this.expressao();
1233
1272
  if (vetorOuDicionario.constructor === construtos_1.AcessoIndiceVariavel) {
1234
1273
  const construtoAcessoIndiceVariavel = vetorOuDicionario;
1235
1274
  if (construtoAcessoIndiceVariavel.entidadeChamada.tipo === 'dicionário') {
@@ -1250,57 +1289,57 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1250
1289
  }
1251
1290
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
1252
1291
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1253
- const corpo = this.resolverDeclaracao();
1292
+ const corpo = await this.resolverDeclaracao();
1254
1293
  return {
1255
1294
  variavelIteracao,
1256
1295
  vetor: vetorOuDicionario,
1257
1296
  corpo,
1258
1297
  };
1259
1298
  }
1260
- declaracaoParaCadaVetor(simboloPara) {
1261
- const { variavelIteracao, vetor, corpo } = this.logicaComumParaCadaVetor(simboloPara);
1299
+ async declaracaoParaCadaVetor(simboloPara) {
1300
+ const { variavelIteracao, vetor, corpo } = await this.logicaComumParaCadaVetor(simboloPara);
1262
1301
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, vetor, corpo);
1263
1302
  }
1264
- declaracaoParaCada(simboloPara) {
1303
+ async declaracaoParaCada(simboloPara) {
1265
1304
  if (this.verificarTipoSimboloAtual(delegua_2.default.IDENTIFICADOR)) {
1266
- return this.declaracaoParaCadaVetor(simboloPara);
1305
+ return await this.declaracaoParaCadaVetor(simboloPara);
1267
1306
  }
1268
1307
  if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
1269
- return this.declaracaoParaCadaDicionario(simboloPara);
1308
+ return await this.declaracaoParaCadaDicionario(simboloPara);
1270
1309
  }
1271
1310
  throw this.erro(simboloPara, 'Identificador de iteração deve ser ou um par chave-valor, ou um nome de variável.');
1272
1311
  }
1273
- logicaComumPara() {
1312
+ async logicaComumPara() {
1274
1313
  const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
1275
1314
  let inicializador;
1276
1315
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA)) {
1277
1316
  inicializador = null;
1278
1317
  }
1279
1318
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VARIAVEL)) {
1280
- inicializador = this.declaracaoDeVariaveis();
1319
+ inicializador = await this.declaracaoDeVariaveis();
1281
1320
  }
1282
1321
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CONSTANTE)) {
1283
- inicializador = this.declaracaoDeConstantes();
1322
+ inicializador = await this.declaracaoDeConstantes();
1284
1323
  }
1285
1324
  else {
1286
- inicializador = this.declaracaoExpressao();
1325
+ inicializador = await this.declaracaoExpressao();
1287
1326
  }
1288
1327
  let condicao = null;
1289
1328
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PONTO_E_VIRGULA)) {
1290
- condicao = this.expressao();
1329
+ condicao = await this.expressao();
1291
1330
  }
1292
1331
  // Ponto-e-vírgula é opcional aqui.
1293
1332
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1294
1333
  let incrementar = null;
1295
1334
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1296
- incrementar = this.expressao();
1335
+ incrementar = await this.expressao();
1297
1336
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR);
1298
1337
  }
1299
1338
  if (comParenteses) {
1300
1339
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
1301
1340
  }
1302
1341
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1303
- const corpo = this.resolverDeclaracao();
1342
+ const corpo = await this.resolverDeclaracao();
1304
1343
  return {
1305
1344
  inicializador,
1306
1345
  condicao,
@@ -1308,11 +1347,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1308
1347
  corpo,
1309
1348
  };
1310
1349
  }
1311
- declaracaoParaTradicional(simboloPara) {
1312
- const { inicializador, condicao, incrementar, corpo } = this.logicaComumPara();
1350
+ async declaracaoParaTradicional(simboloPara) {
1351
+ const { inicializador, condicao, incrementar, corpo } = await this.logicaComumPara();
1313
1352
  return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
1314
1353
  }
1315
- declaracaoRetorna() {
1354
+ async declaracaoRetorna() {
1316
1355
  const simboloChave = this.simbolos[this.atual - 1];
1317
1356
  let valor = null;
1318
1357
  if ([
@@ -1332,18 +1371,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1332
1371
  delegua_2.default.TEXTO,
1333
1372
  delegua_2.default.VERDADEIRO,
1334
1373
  ].includes(this.simbolos[this.atual].tipo)) {
1335
- valor = this.expressao();
1374
+ valor = await this.expressao();
1336
1375
  }
1337
1376
  // Ponto-e-vírgula é opcional aqui.
1338
1377
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1339
1378
  return new declaracoes_1.Retorna(simboloChave, valor);
1340
1379
  }
1341
- declaracaoSe() {
1342
- const condicao = this.expressao();
1343
- const caminhoEntao = this.resolverDeclaracao();
1380
+ async declaracaoSe() {
1381
+ const condicao = await this.expressao();
1382
+ const caminhoEntao = await this.resolverDeclaracao();
1344
1383
  let caminhoSenao = null;
1345
1384
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
1346
- caminhoSenao = this.resolverDeclaracao();
1385
+ caminhoSenao = await this.resolverDeclaracao();
1347
1386
  }
1348
1387
  return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
1349
1388
  }
@@ -1355,69 +1394,68 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1355
1394
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1356
1395
  return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
1357
1396
  }
1358
- declaracaoTente() {
1397
+ async declaracaoTente() {
1359
1398
  const simboloTente = this.simbolos[this.atual - 1];
1360
1399
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
1361
- const blocoTente = this.blocoEscopo();
1400
+ const blocoTente = await this.blocoEscopo();
1362
1401
  let blocoPegue = null;
1363
1402
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PEGUE)) {
1364
1403
  if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_ESQUERDO)) {
1365
1404
  // Caso 1: com parâmetro de erro.
1366
1405
  // `pegue` recebe um `FuncaoConstruto`.
1367
- blocoPegue = this.corpoDaFuncao('bloco `pegue`');
1406
+ blocoPegue = await this.corpoDaFuncao('bloco `pegue`');
1368
1407
  }
1369
1408
  else {
1370
1409
  // Caso 2: sem parâmetro de erro.
1371
1410
  // `pegue` recebe um bloco.
1372
1411
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
1373
- blocoPegue = this.blocoEscopo();
1412
+ blocoPegue = await this.blocoEscopo();
1374
1413
  }
1375
1414
  }
1376
1415
  let blocoSenao = null;
1377
1416
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
1378
1417
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
1379
- blocoSenao = this.blocoEscopo();
1418
+ blocoSenao = await this.blocoEscopo();
1380
1419
  }
1381
1420
  let blocoFinalmente = null;
1382
1421
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.FINALMENTE)) {
1383
1422
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
1384
- blocoFinalmente = this.blocoEscopo();
1423
+ blocoFinalmente = await this.blocoEscopo();
1385
1424
  }
1386
1425
  return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
1387
1426
  }
1388
- resolverDecorador() {
1427
+ async resolverDecoradores() {
1389
1428
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
1390
- let nomeDecorador = '';
1429
+ this.avancarEDevolverAnterior(); // Arroba
1430
+ let nomeDecorador = '@';
1391
1431
  let linha;
1392
1432
  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
1433
  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}`);
1434
+ const primeiraParteNomeDecorador = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de decorador após '@'.");
1435
+ linha = Number(primeiraParteNomeDecorador.linha);
1436
+ nomeDecorador += primeiraParteNomeDecorador.lexema;
1437
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
1438
+ const parteNomeDecorador = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de decorador após '.'.");
1439
+ nomeDecorador += '.' + parteNomeDecorador.lexema;
1440
+ }
1441
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
1442
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1443
+ parametros = await this.logicaComumParametros();
1444
+ }
1445
+ for (const parametro of parametros) {
1446
+ if (parametro.nome.lexema in atributos) {
1447
+ throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
1448
+ }
1449
+ atributos[parametro.nome.lexema] = parametro.valorPadrao;
1412
1450
  }
1413
- atributos[parametro.nome.lexema] = parametro.valorPadrao;
1451
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após nome de decorador.");
1414
1452
  }
1415
1453
  this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
1416
1454
  }
1417
1455
  }
1418
- declaracaoTendoComo() {
1456
+ async declaracaoTendoComo() {
1419
1457
  const simboloTendo = this.simbolos[this.atual - 1];
1420
- const expressaoInicializacao = this.expressao();
1458
+ const expressaoInicializacao = await this.expressao();
1421
1459
  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
1460
  const simboloNomeVariavel = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
1423
1461
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
@@ -1440,17 +1478,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1440
1478
  break;
1441
1479
  }
1442
1480
  this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloNomeVariavel.lexema, tipoInicializacao));
1443
- const blocoCorpo = this.blocoEscopo();
1481
+ const blocoCorpo = await this.blocoEscopo();
1444
1482
  return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
1445
1483
  }
1446
- declaracaoDesestruturacaoVariavel() {
1484
+ async declaracaoDesestruturacaoVariavel() {
1447
1485
  const identificadores = [];
1448
1486
  do {
1449
1487
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1450
1488
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1451
1489
  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();
1490
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1491
+ throw this.erro(this.simbolos[this.atual], 'Esperado igual ou seta esquerda após relação de propriedades da desestruturação.');
1492
+ }
1493
+ const inicializador = await this.expressao();
1454
1494
  const retornos = [];
1455
1495
  for (let identificador of identificadores) {
1456
1496
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
@@ -1559,7 +1599,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1559
1599
  }
1560
1600
  resolverValorConstruto(construto) {
1561
1601
  if (construto instanceof construtos_1.Literal) {
1562
- return construto.valor;
1602
+ return String(construto.valor);
1563
1603
  }
1564
1604
  throw this.erro({ hashArquivo: construto.hashArquivo, linha: construto.linha }, `Construto do tipo ${construto.constructor} não possui um mapeamento de valor.`);
1565
1605
  }
@@ -1587,13 +1627,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1587
1627
  * Caso símbolo atual seja `var`, devolve uma declaração de variável.
1588
1628
  * @returns Um Construto do tipo Var.
1589
1629
  */
1590
- declaracaoDeVariaveis() {
1630
+ async declaracaoDeVariaveis() {
1591
1631
  const simboloVariavel = this.simboloAnterior();
1592
1632
  const identificadores = [];
1593
1633
  const retorno = [];
1594
1634
  let tipo = 'qualquer';
1595
1635
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1596
- return this.declaracaoDesestruturacaoVariavel();
1636
+ return await this.declaracaoDesestruturacaoVariavel();
1597
1637
  }
1598
1638
  do {
1599
1639
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
@@ -1604,7 +1644,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1604
1644
  tipoExplicito = true;
1605
1645
  this.avancarEDevolverAnterior();
1606
1646
  }
1607
- if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1647
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1608
1648
  // Inicialização de variáveis sem valor.
1609
1649
  for (let identificador of identificadores.values()) {
1610
1650
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
@@ -1616,7 +1656,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1616
1656
  }
1617
1657
  const inicializadores = [];
1618
1658
  do {
1619
- inicializadores.push(this.expressao());
1659
+ inicializadores.push(await this.expressao());
1620
1660
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1621
1661
  if (identificadores.length !== inicializadores.length) {
1622
1662
  throw this.erro(simboloVariavel, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
@@ -1636,14 +1676,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1636
1676
  this.pilhaDecoradores = [];
1637
1677
  return retorno;
1638
1678
  }
1639
- declaracaoDesestruturacaoConstante() {
1679
+ async declaracaoDesestruturacaoConstante() {
1640
1680
  const identificadores = [];
1641
1681
  do {
1642
1682
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
1643
1683
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1644
1684
  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();
1685
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1686
+ throw this.erro(this.simbolos[this.atual], 'Esperado igual ou seta esquerda após relação de propriedades da desestruturação.');
1687
+ }
1688
+ const inicializador = await this.expressao();
1647
1689
  const retornos = [];
1648
1690
  for (let identificador of identificadores) {
1649
1691
  // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
@@ -1658,12 +1700,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1658
1700
  * Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
1659
1701
  * @returns Um Construto do tipo Const.
1660
1702
  */
1661
- declaracaoDeConstantes() {
1703
+ async declaracaoDeConstantes() {
1662
1704
  const simboloConstante = this.simboloAnterior();
1663
1705
  const identificadores = [];
1664
1706
  let tipo = 'qualquer';
1665
1707
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1666
- return this.declaracaoDesestruturacaoConstante();
1708
+ return await this.declaracaoDesestruturacaoConstante();
1667
1709
  }
1668
1710
  do {
1669
1711
  identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da constante.'));
@@ -1674,10 +1716,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1674
1716
  tipoExplicito = true;
1675
1717
  this.avancarEDevolverAnterior();
1676
1718
  }
1677
- this.consumir(delegua_2.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
1719
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
1720
+ throw this.erro(this.simbolos[this.atual], "Esperado '=' ou '<-' após identificador em instrução 'constante'.");
1721
+ }
1678
1722
  const inicializadores = [];
1679
1723
  do {
1680
- inicializadores.push(this.expressao());
1724
+ inicializadores.push(await this.expressao());
1681
1725
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1682
1726
  if (identificadores.length !== inicializadores.length) {
1683
1727
  throw this.erro(simboloConstante, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
@@ -1699,7 +1743,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1699
1743
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1700
1744
  return retorno;
1701
1745
  }
1702
- funcao(tipo) {
1746
+ async funcao(tipo) {
1703
1747
  let simbolo;
1704
1748
  switch (this.simbolos[this.atual].tipo) {
1705
1749
  case delegua_2.default.CONSTRUTOR:
@@ -1714,14 +1758,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1714
1758
  // Se houver chamadas recursivas à função, precisamos definir um tipo
1715
1759
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1716
1760
  this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, 'qualquer'));
1717
- const corpoDaFuncao = this.corpoDaFuncao(tipo);
1761
+ const corpoDaFuncao = await this.corpoDaFuncao(tipo);
1718
1762
  const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
1719
1763
  this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, tipoDaFuncao));
1720
1764
  const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao, decoradores);
1721
1765
  this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
1722
1766
  return funcaoDeclaracao;
1723
1767
  }
1724
- logicaComumParametros() {
1768
+ async logicaComumParametros() {
1725
1769
  const parametros = [];
1726
1770
  do {
1727
1771
  const parametro = {};
@@ -1733,13 +1777,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1733
1777
  parametro.abrangencia = 'padrao';
1734
1778
  }
1735
1779
  parametro.nome = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
1780
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1781
+ try {
1782
+ const valorPadrao = await this.primario();
1783
+ parametro.valorPadrao = valorPadrao;
1784
+ }
1785
+ catch (erro) {
1786
+ throw this.erro(this.simbolos[this.atual], `Valor padrão do parâmetro '${parametro.nome.lexema}' é inválido.`);
1787
+ }
1788
+ }
1736
1789
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1737
1790
  let tipoDadoParametro = this.verificarDefinicaoTipoAtual();
1738
1791
  parametro.tipoDado = tipoDadoParametro;
1739
1792
  this.avancarEDevolverAnterior();
1740
1793
  }
1741
1794
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1742
- const valorPadrao = this.primario();
1795
+ const valorPadrao = await this.primario();
1743
1796
  parametro.valorPadrao = valorPadrao;
1744
1797
  }
1745
1798
  this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
@@ -1749,13 +1802,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1749
1802
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1750
1803
  return parametros;
1751
1804
  }
1752
- corpoDaFuncao(tipo) {
1805
+ async corpoDaFuncao(tipo) {
1753
1806
  // O parêntese esquerdo é considerado o símbolo inicial para
1754
1807
  // fins de localização.
1755
1808
  const parenteseEsquerdo = this.consumir(delegua_2.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
1756
1809
  let parametros = [];
1757
1810
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
1758
- parametros = this.logicaComumParametros();
1811
+ parametros = await this.logicaComumParametros();
1759
1812
  }
1760
1813
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1761
1814
  let tipoRetorno = 'qualquer';
@@ -1766,7 +1819,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1766
1819
  definicaoExplicitaDeTipo = true;
1767
1820
  }
1768
1821
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1769
- const corpo = this.blocoEscopo();
1822
+ const corpo = await this.blocoEscopo();
1770
1823
  let expressoesRetorna = [];
1771
1824
  for (const declaracao of corpo) {
1772
1825
  expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
@@ -1801,7 +1854,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1801
1854
  }
1802
1855
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno, definicaoExplicitaDeTipo);
1803
1856
  }
1804
- declaracaoDeClasse() {
1857
+ async declaracaoDeClasse() {
1805
1858
  const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
1806
1859
  const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
1807
1860
  let superClasse = null;
@@ -1821,7 +1874,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1821
1874
  // Se o símbolo atual é arroba, é um decorador.
1822
1875
  // Caso contrário, verificamos o próximo símbolo.
1823
1876
  if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
1824
- this.resolverDecorador();
1877
+ await this.resolverDecoradores();
1825
1878
  continue;
1826
1879
  }
1827
1880
  // Se o próximo símbolo ao atual for um parênteses, é um método.
@@ -1829,7 +1882,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1829
1882
  const proximoSimbolo = this.simbolos[this.atual + 1];
1830
1883
  switch (proximoSimbolo.tipo) {
1831
1884
  case delegua_2.default.PARENTESE_ESQUERDO:
1832
- metodos.push(this.funcao('método'));
1885
+ metodos.push(await this.funcao('método'));
1833
1886
  break;
1834
1887
  case delegua_2.default.DOIS_PONTOS:
1835
1888
  const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
@@ -1859,23 +1912,23 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1859
1912
  * @returns Uma função ou classe se o símbolo atual resolver aqui.
1860
1913
  * O retorno de `resolverDeclaracao()` em caso contrário.
1861
1914
  * @see resolverDeclaracao
1862
- * @see resolverDecorador
1915
+ * @see resolverDecoradores
1863
1916
  */
1864
- resolverDeclaracaoForaDeBloco() {
1917
+ async resolverDeclaracaoForaDeBloco() {
1865
1918
  try {
1866
1919
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
1867
- this.resolverDecorador();
1920
+ await this.resolverDecoradores();
1868
1921
  }
1869
1922
  if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1870
1923
  this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1871
1924
  this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
1872
1925
  this.avancarEDevolverAnterior();
1873
- return this.funcao('funcao');
1926
+ return await this.funcao('funcao');
1874
1927
  }
1875
1928
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CLASSE)) {
1876
- return this.declaracaoDeClasse();
1929
+ return await this.declaracaoDeClasse();
1877
1930
  }
1878
- return this.resolverDeclaracao();
1931
+ return await this.resolverDeclaracao();
1879
1932
  }
1880
1933
  catch (erro) {
1881
1934
  this.sincronizar();
@@ -1915,62 +1968,62 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1915
1968
  * @see resolverDeclaracaoForaDeBloco para as declarações que não podem
1916
1969
  * ocorrer em blocos de escopo elementares.
1917
1970
  */
1918
- resolverDeclaracao() {
1971
+ async resolverDeclaracao() {
1919
1972
  switch (this.simbolos[this.atual].tipo) {
1920
1973
  case delegua_2.default.AJUDA:
1921
- return this.declaracaoAjuda();
1974
+ return await this.declaracaoAjuda();
1922
1975
  case delegua_2.default.CHAVE_ESQUERDA:
1923
1976
  const simboloInicioBloco = this.avancarEDevolverAnterior();
1924
- return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
1977
+ return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
1925
1978
  case delegua_2.default.COMENTARIO:
1926
1979
  return this.declaracaoComentarioUmaLinha();
1927
1980
  case delegua_2.default.CONSTANTE:
1928
1981
  this.avancarEDevolverAnterior();
1929
- return this.declaracaoDeConstantes();
1982
+ return await this.declaracaoDeConstantes();
1930
1983
  case delegua_2.default.CONTINUA:
1931
1984
  this.avancarEDevolverAnterior();
1932
1985
  return this.declaracaoContinua();
1933
1986
  case delegua_2.default.ENQUANTO:
1934
1987
  this.avancarEDevolverAnterior();
1935
- return this.declaracaoEnquanto();
1988
+ return await this.declaracaoEnquanto();
1936
1989
  case delegua_2.default.ESCOLHA:
1937
1990
  this.avancarEDevolverAnterior();
1938
- return this.declaracaoEscolha();
1991
+ return await this.declaracaoEscolha();
1939
1992
  case delegua_2.default.ESCREVA:
1940
1993
  this.avancarEDevolverAnterior();
1941
- return this.declaracaoEscreva();
1994
+ return await this.declaracaoEscreva();
1942
1995
  case delegua_2.default.FALHAR:
1943
1996
  this.avancarEDevolverAnterior();
1944
- return this.declaracaoFalhar();
1997
+ return await this.declaracaoFalhar();
1945
1998
  case delegua_2.default.FAZER:
1946
1999
  const simboloFazer = this.avancarEDevolverAnterior();
1947
- return this.declaracaoFazer(simboloFazer);
2000
+ return await this.declaracaoFazer(simboloFazer);
1948
2001
  case delegua_2.default.IMPORTAR:
1949
2002
  this.avancarEDevolverAnterior();
1950
- return this.declaracaoImportar();
2003
+ return await this.declaracaoImportar();
1951
2004
  case delegua_2.default.LINHA_COMENTARIO:
1952
2005
  return this.declaracaoComentarioMultilinha();
1953
2006
  case delegua_2.default.PARA:
1954
2007
  this.avancarEDevolverAnterior();
1955
- return this.declaracaoPara();
2008
+ return await this.declaracaoPara();
1956
2009
  case delegua_2.default.SUSTAR:
1957
2010
  this.avancarEDevolverAnterior();
1958
2011
  return this.declaracaoSustar();
1959
2012
  case delegua_2.default.SE:
1960
2013
  this.avancarEDevolverAnterior();
1961
- return this.declaracaoSe();
2014
+ return await this.declaracaoSe();
1962
2015
  case delegua_2.default.RETORNA:
1963
2016
  this.avancarEDevolverAnterior();
1964
- return this.declaracaoRetorna();
2017
+ return await this.declaracaoRetorna();
1965
2018
  case delegua_2.default.TENDO:
1966
2019
  this.avancarEDevolverAnterior();
1967
- return this.declaracaoTendoComo();
2020
+ return await this.declaracaoTendoComo();
1968
2021
  case delegua_2.default.TENTE:
1969
2022
  this.avancarEDevolverAnterior();
1970
- return this.declaracaoTente();
2023
+ return await this.declaracaoTente();
1971
2024
  case delegua_2.default.VARIAVEL:
1972
2025
  this.avancarEDevolverAnterior();
1973
- return this.declaracaoDeVariaveis();
2026
+ return await this.declaracaoDeVariaveis();
1974
2027
  }
1975
2028
  const simboloAtual = this.simbolos[this.atual];
1976
2029
  if (simboloAtual.tipo === delegua_2.default.IDENTIFICADOR) {
@@ -1984,9 +2037,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1984
2037
  throw this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
1985
2038
  }
1986
2039
  }
1987
- return this.declaracaoExpressao();
2040
+ return await this.declaracaoExpressao();
1988
2041
  }
1989
- declaracaoAjuda() {
2042
+ async declaracaoAjuda() {
1990
2043
  const simboloAjuda = this.avancarEDevolverAnterior();
1991
2044
  if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
1992
2045
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
@@ -1996,7 +2049,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1996
2049
  this.avancarEDevolverAnterior();
1997
2050
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, true);
1998
2051
  }
1999
- const expressaoAjuda = this.expressao();
2052
+ const expressaoAjuda = await this.expressao();
2000
2053
  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
2054
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, expressaoAjuda);
2002
2055
  }
@@ -2102,7 +2155,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2102
2155
  }
2103
2156
  }
2104
2157
  }
2105
- analisar(retornoLexador, hashArquivo) {
2158
+ async analisar(retornoLexador, hashArquivo) {
2106
2159
  const inicioAnalise = (0, browser_process_hrtime_1.default)();
2107
2160
  this.erros = [];
2108
2161
  this.atual = 0;
@@ -2115,8 +2168,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2115
2168
  this.inicializarPilhaEscopos();
2116
2169
  let declaracoes = [];
2117
2170
  while (!this.estaNoFinal()) {
2118
- this.resolverDecorador();
2119
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
2171
+ await this.resolverDecoradores();
2172
+ const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
2120
2173
  if (Array.isArray(retornoDeclaracao)) {
2121
2174
  declaracoes = declaracoes.concat(retornoDeclaracao);
2122
2175
  }