@designliquido/delegua 0.36.2 → 0.37.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 (104) hide show
  1. package/analisador-semantico/analisador-semantico.js.map +1 -1
  2. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +71 -50
  3. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico-base.js +52 -43
  5. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico.d.ts +24 -32
  7. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.js +49 -101
  9. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +7 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +8 -1
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  14. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts +4 -16
  15. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
  16. package/avaliador-sintatico/micro-avaliador-sintatico.js +1 -84
  17. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  18. package/bibliotecas/biblioteca-global.d.ts +1 -1
  19. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  20. package/bibliotecas/biblioteca-global.js +5 -15
  21. package/bibliotecas/biblioteca-global.js.map +1 -1
  22. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  23. package/bibliotecas/primitivas-vetor.js +1 -3
  24. package/bibliotecas/primitivas-vetor.js.map +1 -1
  25. package/bin/package.json +9 -9
  26. package/construtos/binario.d.ts.map +1 -1
  27. package/construtos/binario.js.map +1 -1
  28. package/construtos/chamada.d.ts +2 -2
  29. package/construtos/chamada.d.ts.map +1 -1
  30. package/construtos/chamada.js.map +1 -1
  31. package/construtos/comentario.d.ts +2 -2
  32. package/construtos/constante.d.ts.map +1 -1
  33. package/construtos/constante.js.map +1 -1
  34. package/construtos/decorador.d.ts +6 -2
  35. package/construtos/decorador.d.ts.map +1 -1
  36. package/construtos/decorador.js +2 -2
  37. package/construtos/decorador.js.map +1 -1
  38. package/construtos/expressao-regular.d.ts.map +1 -1
  39. package/construtos/expressao-regular.js.map +1 -1
  40. package/construtos/qual-tipo.d.ts.map +1 -1
  41. package/construtos/qual-tipo.js.map +1 -1
  42. package/construtos/tipo-de.d.ts.map +1 -1
  43. package/construtos/tipo-de.js.map +1 -1
  44. package/construtos/variavel.d.ts.map +1 -1
  45. package/construtos/variavel.js.map +1 -1
  46. package/declaracoes/const.d.ts +2 -2
  47. package/declaracoes/const.d.ts.map +1 -1
  48. package/declaracoes/const.js +2 -2
  49. package/declaracoes/const.js.map +1 -1
  50. package/declaracoes/declaracao.d.ts +3 -1
  51. package/declaracoes/declaracao.d.ts.map +1 -1
  52. package/declaracoes/declaracao.js +3 -2
  53. package/declaracoes/declaracao.js.map +1 -1
  54. package/declaracoes/expressao.d.ts +2 -2
  55. package/declaracoes/expressao.d.ts.map +1 -1
  56. package/declaracoes/expressao.js +2 -2
  57. package/declaracoes/expressao.js.map +1 -1
  58. package/declaracoes/tendo-como.d.ts.map +1 -1
  59. package/declaracoes/tendo-como.js.map +1 -1
  60. package/declaracoes/var.d.ts +2 -2
  61. package/declaracoes/var.d.ts.map +1 -1
  62. package/declaracoes/var.js +2 -2
  63. package/declaracoes/var.js.map +1 -1
  64. package/estruturas/chamavel.d.ts.map +1 -1
  65. package/estruturas/chamavel.js.map +1 -1
  66. package/estruturas/classe-padrao.d.ts.map +1 -1
  67. package/estruturas/delegua-funcao.d.ts.map +1 -1
  68. package/estruturas/delegua-funcao.js +1 -2
  69. package/estruturas/delegua-funcao.js.map +1 -1
  70. package/formatadores/formatador-delegua.d.ts.map +1 -1
  71. package/formatadores/formatador-delegua.js +2 -2
  72. package/formatadores/formatador-delegua.js.map +1 -1
  73. package/interfaces/avaliador-sintatico-interface.d.ts +0 -45
  74. package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
  75. package/interfaces/formatador-comum-interface.d.ts +2 -2
  76. package/interfaces/retornos/retorno-execucao-interface.d.ts +1 -1
  77. package/interfaces/variavel-interface.d.ts +1 -1
  78. package/interfaces/variavel-interface.d.ts.map +1 -1
  79. package/interpretador/comum.d.ts +1 -1
  80. package/interpretador/comum.d.ts.map +1 -1
  81. package/interpretador/comum.js.map +1 -1
  82. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  83. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  84. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  85. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  86. package/interpretador/inferenciador.d.ts +1 -1
  87. package/interpretador/inferenciador.d.ts.map +1 -1
  88. package/interpretador/inferenciador.js +1 -1
  89. package/interpretador/inferenciador.js.map +1 -1
  90. package/interpretador/interpretador-base.d.ts.map +1 -1
  91. package/interpretador/interpretador-base.js +3 -6
  92. package/interpretador/interpretador-base.js.map +1 -1
  93. package/interpretador/interpretador-com-depuracao.d.ts.map +1 -1
  94. package/interpretador/interpretador-com-depuracao.js +4 -2
  95. package/interpretador/interpretador-com-depuracao.js.map +1 -1
  96. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  97. package/interpretador/pilha-escopos-execucao.js +5 -5
  98. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  99. package/package.json +9 -9
  100. package/tradutores/tradutor-assembly-x64.js +13 -13
  101. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  102. package/tradutores/tradutor-javascript.js.map +1 -1
  103. package/tradutores/tradutor-python.js.map +1 -1
  104. package/umd/delegua.js +137 -276
package/umd/delegua.js CHANGED
@@ -15,9 +15,6 @@ const comum_1 = __importDefault(require("../tipos-de-simbolos/comum"));
15
15
  * de tipos de símbolos comuns entre todos os dialetos.
16
16
  */
17
17
  class AvaliadorSintaticoBase {
18
- declaracaoDeVariaveis() {
19
- throw new Error('Método não implementado.');
20
- }
21
18
  consumir(tipo, mensagemDeErro) {
22
19
  if (this.verificarTipoSimboloAtual(tipo))
23
20
  return this.avancarEDevolverAnterior();
@@ -47,6 +44,8 @@ class AvaliadorSintaticoBase {
47
44
  this.atual += 1;
48
45
  return this.simbolos[this.atual - 1];
49
46
  }
47
+ // TODO: Verificar possibilidade de remoção.
48
+ // Regressão de símbolo é uma roubada por N razões.
50
49
  regredirEDevolverAtual() {
51
50
  if (this.atual > 0)
52
51
  this.atual -= 1;
@@ -62,13 +61,11 @@ class AvaliadorSintaticoBase {
62
61
  }
63
62
  return false;
64
63
  }
65
- declaracaoLeia() {
66
- throw new Error('Método não implementado.');
67
- }
68
64
  finalizarChamada(entidadeChamada) {
69
65
  const argumentos = [];
70
66
  if (!this.verificarTipoSimboloAtual(comum_1.default.PARENTESE_DIREITO)) {
71
67
  do {
68
+ // `apply()` em JavaScript aceita até 255 parâmetros.
72
69
  if (argumentos.length >= 255) {
73
70
  throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
74
71
  }
@@ -113,13 +110,11 @@ class AvaliadorSintaticoBase {
113
110
  }
114
111
  return expressao;
115
112
  }
116
- bitShift() {
117
- throw new Error('Método não implementado.');
118
- }
119
- bitE() {
120
- throw new Error('Método não implementado.');
121
- }
122
- bitOu() {
113
+ /**
114
+ * Este método é usado por alguns dialetos de Portugol que possuem declarações
115
+ * de múltiplas variáveis na mesma linha.
116
+ */
117
+ declaracaoDeVariaveis() {
123
118
  throw new Error('Método não implementado.');
124
119
  }
125
120
  comparar() {
@@ -140,9 +135,6 @@ class AvaliadorSintaticoBase {
140
135
  }
141
136
  return expressao;
142
137
  }
143
- em() {
144
- throw new Error('Método não implementado.');
145
- }
146
138
  e() {
147
139
  let expressao = this.comparacaoIgualdade();
148
140
  while (this.verificarSeSimboloAtualEIgualA(comum_1.default.E)) {
@@ -164,38 +156,11 @@ class AvaliadorSintaticoBase {
164
156
  expressao() {
165
157
  return this.atribuir();
166
158
  }
167
- declaracaoExpressao(simboloAnterior) {
168
- throw new Error('Método não implementado.');
169
- }
170
- declaracaoSustar() {
171
- throw new Error('Método não implementado.');
172
- }
173
- declaracaoContinua() {
174
- throw new Error('Método não implementado.');
175
- }
176
- declaracaoRetorna() {
177
- throw new Error('Método não implementado.');
178
- }
179
- declaracaoImportar() {
180
- throw new Error('Método não implementado.');
181
- }
182
- declaracaoTente() {
183
- throw new Error('Método não implementado.');
184
- }
185
- resolverDeclaracao() {
186
- throw new Error('Método não implementado.');
187
- }
188
- declaracaoDeVariavel() {
189
- throw new Error('Método não implementado.');
190
- }
191
159
  funcao(tipo) {
192
160
  const simboloFuncao = this.avancarEDevolverAnterior();
193
161
  const nomeFuncao = this.consumir(comum_1.default.IDENTIFICADOR, `Esperado nome ${tipo}.`);
194
162
  return new declaracoes_1.FuncaoDeclaracao(nomeFuncao, this.corpoDaFuncao(tipo));
195
163
  }
196
- declaracaoDeClasse() {
197
- throw new Error('Método não implementado.');
198
- }
199
164
  logicaComumParametros() {
200
165
  const parametros = [];
201
166
  do {
@@ -220,6 +185,50 @@ class AvaliadorSintaticoBase {
220
185
  } while (this.verificarSeSimboloAtualEIgualA(comum_1.default.VIRGULA));
221
186
  return parametros;
222
187
  }
188
+ /**
189
+ * Os métodos a seguir só devem ser implementados se o dialeto
190
+ * em questão realmente possui a funcionalidade, e devem levantar
191
+ * erro em caso contrário.
192
+ */
193
+ bitShift() {
194
+ throw new Error('Método não implementado.');
195
+ }
196
+ bitE() {
197
+ throw new Error('Método não implementado.');
198
+ }
199
+ bitOu() {
200
+ throw new Error('Método não implementado.');
201
+ }
202
+ declaracaoContinua() {
203
+ throw new Error('Método não implementado.');
204
+ }
205
+ declaracaoDeClasse() {
206
+ throw new Error('Método não implementado.');
207
+ }
208
+ declaracaoDeVariavel() {
209
+ throw new Error('Método não implementado.');
210
+ }
211
+ declaracaoExpressao(simboloAnterior) {
212
+ throw new Error('Método não implementado.');
213
+ }
214
+ declaracaoImportar() {
215
+ throw new Error('Método não implementado.');
216
+ }
217
+ declaracaoRetorna() {
218
+ throw new Error('Método não implementado.');
219
+ }
220
+ declaracaoSustar() {
221
+ throw new Error('Método não implementado.');
222
+ }
223
+ declaracaoTente() {
224
+ throw new Error('Método não implementado.');
225
+ }
226
+ em() {
227
+ throw new Error('Método não implementado.');
228
+ }
229
+ resolverDeclaracao() {
230
+ throw new Error('Método não implementado.');
231
+ }
223
232
  }
224
233
  exports.AvaliadorSintaticoBase = AvaliadorSintaticoBase;
225
234
 
@@ -238,43 +247,24 @@ const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
238
247
  const tuplas_1 = require("../construtos/tuplas");
239
248
  const declaracoes_1 = require("../declaracoes");
240
249
  const lexador_1 = require("../lexador");
250
+ const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
241
251
  /**
242
252
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
243
253
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
244
254
  * Há dois grupos de estruturas de alto nível: Construtos e Declarações.
245
255
  */
246
- class AvaliadorSintatico {
256
+ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
247
257
  constructor(performance = false) {
258
+ super();
248
259
  this.hashArquivo = 0;
249
260
  this.atual = 0;
250
261
  this.blocos = 0;
251
262
  this.erros = [];
252
263
  this.performance = performance;
253
264
  }
254
- declaracaoDeVariavel() {
255
- throw new Error('Método não implementado.');
256
- }
257
- erro(simbolo, mensagemDeErro) {
258
- const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
259
- this.erros.push(excecao);
260
- return excecao;
261
- }
262
- consumir(tipo, mensagemDeErro) {
263
- if (this.verificarTipoSimboloAtual(tipo))
264
- return this.avancarEDevolverAnterior();
265
- throw this.erro(this.simbolos[this.atual], mensagemDeErro);
266
- }
267
- verificarTipoSimboloAtual(tipo) {
268
- if (this.estaNoFinal())
269
- return false;
270
- return this.simbolos[this.atual].tipo === tipo;
271
- }
272
- verificarTipoProximoSimbolo(tipo) {
273
- return this.simbolos[this.atual + 1].tipo === tipo;
274
- }
275
265
  verificarDefinicaoTipoAtual() {
276
266
  const tipos = [...Object.values(delegua_1.default)];
277
- const lexema = this.simboloAtual().lexema.toLowerCase();
267
+ const lexema = this.simbolos[this.atual].lexema.toLowerCase();
278
268
  const contemTipo = tipos.find((tipo) => tipo === lexema);
279
269
  if (contemTipo && this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
280
270
  const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
@@ -288,30 +278,6 @@ class AvaliadorSintatico {
288
278
  }
289
279
  return contemTipo;
290
280
  }
291
- simboloAtual() {
292
- return this.simbolos[this.atual];
293
- }
294
- simboloAnterior() {
295
- return this.simbolos[this.atual - 1];
296
- }
297
- estaNoFinal() {
298
- return this.atual === this.simbolos.length;
299
- }
300
- avancarEDevolverAnterior() {
301
- if (!this.estaNoFinal())
302
- this.atual += 1;
303
- return this.simbolos[this.atual - 1];
304
- }
305
- verificarSeSimboloAtualEIgualA(...argumentos) {
306
- for (let i = 0; i < argumentos.length; i++) {
307
- const tipoAtual = argumentos[i];
308
- if (this.verificarTipoSimboloAtual(tipoAtual)) {
309
- this.avancarEDevolverAnterior();
310
- return true;
311
- }
312
- }
313
- return false;
314
- }
315
281
  primario() {
316
282
  const simboloAtual = this.simbolos[this.atual];
317
283
  let valores = [];
@@ -434,7 +400,7 @@ class AvaliadorSintatico {
434
400
  if (eParExpressaoRegular) {
435
401
  this.avancarEDevolverAnterior();
436
402
  while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
437
- valor += this.simboloAtual().lexema || '';
403
+ valor += this.simbolos[this.atual].lexema || '';
438
404
  this.avancarEDevolverAnterior();
439
405
  }
440
406
  this.avancarEDevolverAnterior();
@@ -443,19 +409,6 @@ class AvaliadorSintatico {
443
409
  }
444
410
  throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
445
411
  }
446
- finalizarChamada(entidadeChamada) {
447
- const argumentos = [];
448
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
449
- do {
450
- if (argumentos.length >= 255) {
451
- throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
452
- }
453
- argumentos.push(this.expressao());
454
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
455
- }
456
- const parenteseDireito = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
457
- return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
458
- }
459
412
  chamar() {
460
413
  let expressao = this.primario();
461
414
  while (true) {
@@ -485,15 +438,6 @@ class AvaliadorSintatico {
485
438
  }
486
439
  return this.chamar();
487
440
  }
488
- exponenciacao() {
489
- let expressao = this.unario();
490
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
491
- const operador = this.simbolos[this.atual - 1];
492
- const direito = this.unario();
493
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
494
- }
495
- return expressao;
496
- }
497
441
  multiplicar() {
498
442
  let expressao = this.exponenciacao();
499
443
  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)) {
@@ -548,7 +492,7 @@ class AvaliadorSintatico {
548
492
  let expressao = this.bitOu();
549
493
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
550
494
  const operador = this.simbolos[this.atual - 1];
551
- const direito = this.bitOu();
495
+ const direito = this.bitOu(); // Única diferença entre esta implementação e base.
552
496
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
553
497
  }
554
498
  return expressao;
@@ -580,15 +524,6 @@ class AvaliadorSintatico {
580
524
  }
581
525
  return expressao;
582
526
  }
583
- ou() {
584
- let expressao = this.e();
585
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.OU)) {
586
- const operador = this.simbolos[this.atual - 1];
587
- const direito = this.e();
588
- expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
589
- }
590
- return expressao;
591
- }
592
527
  /**
593
528
  * Método que resolve atribuições.
594
529
  * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
@@ -678,7 +613,8 @@ class AvaliadorSintatico {
678
613
  const expressao = this.expressao();
679
614
  // Ponto-e-vírgula é opcional aqui.
680
615
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
681
- return new declaracoes_1.Expressao(expressao);
616
+ const decoradores = Array.from(this.pilhaDecoradores);
617
+ return new declaracoes_1.Expressao(expressao, decoradores);
682
618
  }
683
619
  declaracaoComentarioMultilinha() {
684
620
  let simboloComentario;
@@ -922,7 +858,6 @@ class AvaliadorSintatico {
922
858
  return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
923
859
  }
924
860
  resolverDecorador() {
925
- this.pilhaDecoradores = [];
926
861
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
927
862
  let nomeDecorador = '';
928
863
  let linha;
@@ -942,7 +877,14 @@ class AvaliadorSintatico {
942
877
  this.avancarEDevolverAnterior();
943
878
  nomeDecorador += simbolo.lexema || '.';
944
879
  }
945
- this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, parametros));
880
+ const atributos = {};
881
+ for (const parametro of parametros) {
882
+ if (parametro.nome.lexema in atributos) {
883
+ throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
884
+ }
885
+ atributos[parametro.nome.lexema] = parametro.valorPadrao;
886
+ }
887
+ this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
946
888
  }
947
889
  }
948
890
  /**
@@ -1041,8 +983,11 @@ class AvaliadorSintatico {
1041
983
  // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
1042
984
  const retornos = [];
1043
985
  for (let identificador of identificadores) {
1044
- retornos.push(new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
986
+ const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
987
+ declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
988
+ retornos.push(declaracaoVar);
1045
989
  }
990
+ this.pilhaDecoradores = [];
1046
991
  return retornos;
1047
992
  }
1048
993
  /**
@@ -1051,7 +996,7 @@ class AvaliadorSintatico {
1051
996
  */
1052
997
  declaracaoDeVariaveis() {
1053
998
  const identificadores = [];
1054
- let retorno = [];
999
+ const retorno = [];
1055
1000
  let tipo = null;
1056
1001
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1057
1002
  return this.declaracaoDesestruturacaoVariavel();
@@ -1065,10 +1010,11 @@ class AvaliadorSintatico {
1065
1010
  }
1066
1011
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1067
1012
  // Inicialização de variáveis sem valor.
1068
- for (let [indice, identificador] of identificadores.entries()) {
1069
- retorno.push(new declaracoes_1.Var(identificador, null, tipo));
1013
+ for (let identificador of identificadores.values()) {
1014
+ retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
1070
1015
  }
1071
1016
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1017
+ this.pilhaDecoradores = [];
1072
1018
  return retorno;
1073
1019
  }
1074
1020
  const inicializadores = [];
@@ -1076,13 +1022,14 @@ class AvaliadorSintatico {
1076
1022
  inicializadores.push(this.expressao());
1077
1023
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1078
1024
  if (identificadores.length !== inicializadores.length) {
1079
- throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1025
+ throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1080
1026
  }
1081
1027
  for (let [indice, identificador] of identificadores.entries()) {
1082
1028
  tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
1083
- retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
1029
+ retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1084
1030
  }
1085
1031
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1032
+ this.pilhaDecoradores = [];
1086
1033
  return retorno;
1087
1034
  }
1088
1035
  declaracaoDesestruturacaoConstante() {
@@ -1097,7 +1044,9 @@ class AvaliadorSintatico {
1097
1044
  // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
1098
1045
  const retornos = [];
1099
1046
  for (let identificador of identificadores) {
1100
- retornos.push(new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
1047
+ const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1048
+ declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
1049
+ retornos.push(declaracaoConst);
1101
1050
  }
1102
1051
  return retornos;
1103
1052
  }
@@ -1124,12 +1073,13 @@ class AvaliadorSintatico {
1124
1073
  inicializadores.push(this.expressao());
1125
1074
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1126
1075
  if (identificadores.length !== inicializadores.length) {
1127
- throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1076
+ throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1128
1077
  }
1129
1078
  let retorno = [];
1130
1079
  for (let [indice, identificador] of identificadores.entries()) {
1131
- retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
1080
+ retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1132
1081
  }
1082
+ this.pilhaDecoradores = [];
1133
1083
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1134
1084
  return retorno;
1135
1085
  }
@@ -1138,13 +1088,14 @@ class AvaliadorSintatico {
1138
1088
  switch (this.simbolos[this.atual].tipo) {
1139
1089
  case delegua_2.default.CONSTRUTOR:
1140
1090
  simbolo = this.avancarEDevolverAnterior();
1141
- this.pilhaDecoradores = [];
1142
1091
  break;
1143
1092
  default:
1144
1093
  simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
1145
1094
  break;
1146
1095
  }
1147
- return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, this.pilhaDecoradores);
1096
+ const decoradores = Array.from(this.pilhaDecoradores);
1097
+ this.pilhaDecoradores = [];
1098
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, decoradores);
1148
1099
  }
1149
1100
  logicaComumParametros() {
1150
1101
  const parametros = [];
@@ -1166,7 +1117,7 @@ class AvaliadorSintatico {
1166
1117
  parametro.tipoDado = {
1167
1118
  nome: this.simbolos[this.atual - 2].lexema,
1168
1119
  tipo: tipoDadoParametro,
1169
- tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null,
1120
+ tipoInvalido: !tipoDadoParametro ? this.simbolos[this.atual].lexema : null,
1170
1121
  };
1171
1122
  this.avancarEDevolverAnterior();
1172
1123
  }
@@ -1196,7 +1147,7 @@ class AvaliadorSintatico {
1196
1147
  }
1197
1148
  declaracaoDeClasse() {
1198
1149
  const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
1199
- const pilhaDecoradoresClasse = this.pilhaDecoradores;
1150
+ const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
1200
1151
  let superClasse = null;
1201
1152
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
1202
1153
  this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
@@ -1219,14 +1170,13 @@ class AvaliadorSintatico {
1219
1170
  switch (proximoSimbolo.tipo) {
1220
1171
  case delegua_2.default.PARENTESE_ESQUERDO:
1221
1172
  metodos.push(this.funcao('método'));
1222
- this.pilhaDecoradores = [];
1223
1173
  break;
1224
1174
  case delegua_2.default.DOIS_PONTOS:
1225
1175
  const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
1226
1176
  this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
1227
1177
  const tipoPropriedade = this.avancarEDevolverAnterior();
1228
1178
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1229
- propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
1179
+ propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, Array.from(this.pilhaDecoradores)));
1230
1180
  this.pilhaDecoradores = [];
1231
1181
  break;
1232
1182
  default:
@@ -1237,15 +1187,22 @@ class AvaliadorSintatico {
1237
1187
  return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
1238
1188
  }
1239
1189
  /**
1240
- * Declarações fora de bloco precisam ser verificadas primeiro porque
1241
- * não é possível declarar uma classe/função dentro de um bloco `enquanto`,
1242
- * `fazer ... enquanto`, `para`, `escolha`, etc.
1190
+ * Declarações fora de bloco precisam ser verificadas primeiro por
1191
+ * uma série de motivos, como, por exemplo:
1192
+ *
1193
+ * - Não é possível declarar uma classe/função dentro de um bloco `enquanto`,
1194
+ * `fazer ... enquanto`, `para`, `escolha`, etc;
1195
+ * - Qualquer declaração pode ter um decorador.
1243
1196
  * @returns Uma função ou classe se o símbolo atual resolver aqui.
1244
1197
  * O retorno de `resolverDeclaracao()` em caso contrário.
1245
1198
  * @see resolverDeclaracao
1199
+ * @see resolverDecorador
1246
1200
  */
1247
1201
  resolverDeclaracaoForaDeBloco() {
1248
1202
  try {
1203
+ while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
1204
+ this.resolverDecorador();
1205
+ }
1249
1206
  if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1250
1207
  this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1251
1208
  this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
@@ -1318,7 +1275,7 @@ class AvaliadorSintatico {
1318
1275
  }
1319
1276
  exports.AvaliadorSintatico = AvaliadorSintatico;
1320
1277
 
1321
- },{"../construtos":39,"../construtos/tuplas":48,"../declaracoes":77,"../lexador":146,"../tipos-de-dados/delegua":154,"../tipos-de-simbolos/delegua":157,"./erro-avaliador-sintatico":7,"browser-process-hrtime":332}],3:[function(require,module,exports){
1278
+ },{"../construtos":39,"../construtos/tuplas":48,"../declaracoes":77,"../lexador":146,"../tipos-de-dados/delegua":154,"../tipos-de-simbolos/delegua":157,"./avaliador-sintatico-base":1,"./erro-avaliador-sintatico":7,"browser-process-hrtime":332}],3:[function(require,module,exports){
1322
1279
  "use strict";
1323
1280
  var __importDefault = (this && this.__importDefault) || function (mod) {
1324
1281
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -3094,47 +3051,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3094
3051
  Object.defineProperty(exports, "__esModule", { value: true });
3095
3052
  exports.MicroAvaliadorSintatico = void 0;
3096
3053
  const construtos_1 = require("../construtos");
3097
- const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
3098
- const delegua_1 = __importDefault(require("../tipos-de-simbolos/microgramaticas/delegua"));
3099
3054
  const micro_avaliador_sintatico_base_1 = require("./micro-avaliador-sintatico-base");
3055
+ const delegua_1 = __importDefault(require("../tipos-de-simbolos/microgramaticas/delegua"));
3100
3056
  /**
3101
3057
  * O MicroAvaliadorSintatico funciona apenas dentro de interpolações de texto.
3102
3058
  */
3103
3059
  class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAvaliadorSintaticoBase {
3104
- // simbolos: SimboloInterface[];
3105
- // erros: ErroAvaliadorSintatico[];
3106
- // atual: number;
3107
- // linha: number;
3108
- avancarEDevolverAnterior() {
3109
- if (this.atual < this.simbolos.length)
3110
- this.atual += 1;
3111
- return this.simbolos[this.atual - 1];
3112
- }
3113
- verificarTipoSimboloAtual(tipo) {
3114
- if (this.atual === this.simbolos.length)
3115
- return false;
3116
- return this.simbolos[this.atual].tipo === tipo;
3117
- }
3118
- verificarSeSimboloAtualEIgualA(...argumentos) {
3119
- for (let i = 0; i < argumentos.length; i++) {
3120
- const tipoAtual = argumentos[i];
3121
- if (this.verificarTipoSimboloAtual(tipoAtual)) {
3122
- this.avancarEDevolverAnterior();
3123
- return true;
3124
- }
3125
- }
3126
- return false;
3127
- }
3128
- erro(simbolo, mensagemDeErro) {
3129
- const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
3130
- this.erros.push(excecao);
3131
- return excecao;
3132
- }
3133
- consumir(tipo, mensagemDeErro) {
3134
- if (this.verificarTipoSimboloAtual(tipo))
3135
- return this.avancarEDevolverAnterior();
3136
- throw this.erro(this.simbolos[this.atual], mensagemDeErro);
3137
- }
3138
3060
  primario() {
3139
3061
  const simboloAtual = this.simbolos[this.atual];
3140
3062
  let valores = [];
@@ -3256,33 +3178,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3256
3178
  }
3257
3179
  return this.chamar();
3258
3180
  }
3259
- exponenciacao() {
3260
- let expressao = this.unario();
3261
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EXPONENCIACAO)) {
3262
- const operador = this.simbolos[this.atual - 1];
3263
- const direito = this.unario();
3264
- expressao = new construtos_1.Binario(-1, expressao, operador, direito);
3265
- }
3266
- return expressao;
3267
- }
3268
- multiplicar() {
3269
- let expressao = this.exponenciacao();
3270
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIVISAO, delegua_1.default.DIVISAO_INTEIRA, delegua_1.default.MODULO, delegua_1.default.MULTIPLICACAO)) {
3271
- const operador = this.simbolos[this.atual - 1];
3272
- const direito = this.exponenciacao();
3273
- expressao = new construtos_1.Binario(-1, expressao, operador, direito);
3274
- }
3275
- return expressao;
3276
- }
3277
- adicaoOuSubtracao() {
3278
- let expressao = this.multiplicar();
3279
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SUBTRACAO, delegua_1.default.ADICAO)) {
3280
- const operador = this.simbolos[this.atual - 1];
3281
- const direito = this.multiplicar();
3282
- expressao = new construtos_1.Binario(-1, expressao, operador, direito);
3283
- }
3284
- return expressao;
3285
- }
3286
3181
  bitShift() {
3287
3182
  let expressao = this.adicaoOuSubtracao();
3288
3183
  while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MENOR_MENOR, delegua_1.default.MAIOR_MAIOR)) {
@@ -3319,15 +3214,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3319
3214
  }
3320
3215
  return expressao;
3321
3216
  }
3322
- comparacaoIgualdade() {
3323
- let expressao = this.comparar();
3324
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIFERENTE, delegua_1.default.IGUAL_IGUAL)) {
3325
- const operador = this.simbolos[this.atual - 1];
3326
- const direito = this.comparar();
3327
- expressao = new construtos_1.Binario(-1, expressao, operador, direito);
3328
- }
3329
- return expressao;
3330
- }
3331
3217
  em() {
3332
3218
  let expressao = this.comparacaoIgualdade();
3333
3219
  while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EM)) {
@@ -3346,18 +3232,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3346
3232
  }
3347
3233
  return expressao;
3348
3234
  }
3349
- ou() {
3350
- let expressao = this.e();
3351
- while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.OU)) {
3352
- const operador = this.simbolos[this.atual - 1];
3353
- const direito = this.e();
3354
- expressao = new construtos_1.Logico(-1, expressao, operador, direito);
3355
- }
3356
- return expressao;
3357
- }
3358
- declaracao() {
3359
- return this.ou();
3360
- }
3361
3235
  analisar(retornoLexador, linha) {
3362
3236
  this.erros = [];
3363
3237
  this.atual = 0;
@@ -3375,7 +3249,7 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3375
3249
  }
3376
3250
  exports.MicroAvaliadorSintatico = MicroAvaliadorSintatico;
3377
3251
 
3378
- },{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./erro-avaliador-sintatico":7,"./micro-avaliador-sintatico-base":9}],11:[function(require,module,exports){
3252
+ },{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./micro-avaliador-sintatico-base":9}],11:[function(require,module,exports){
3379
3253
  "use strict";
3380
3254
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3381
3255
  if (k2 === undefined) k2 = k;
@@ -3601,9 +3475,7 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
3601
3475
  if (vetor === null || vetor === undefined)
3602
3476
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() não pode ser nulo.'));
3603
3477
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3604
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
3605
- ? funcaoFiltragem.valor
3606
- : funcaoFiltragem;
3478
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
3607
3479
  if (!Array.isArray(valorVetor)) {
3608
3480
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() deve ser um vetor.'));
3609
3481
  }
@@ -3668,9 +3540,7 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
3668
3540
  if (vetor === null || vetor === undefined)
3669
3541
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
3670
3542
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3671
- const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
3672
- ? funcaoMapeamento.valor
3673
- : funcaoMapeamento;
3543
+ const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor') ? funcaoMapeamento.valor : funcaoMapeamento;
3674
3544
  if (!Array.isArray(valorVetor)) {
3675
3545
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
3676
3546
  }
@@ -3719,9 +3589,7 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
3719
3589
  if (vetor === null || vetor === undefined)
3720
3590
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() não pode ser nulo.'));
3721
3591
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3722
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
3723
- ? funcaoFiltragem.valor
3724
- : funcaoFiltragem;
3592
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
3725
3593
  if (!Array.isArray(valorVetor)) {
3726
3594
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() deve ser um vetor.'));
3727
3595
  }
@@ -3743,9 +3611,7 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
3743
3611
  if (vetor === null || vetor === undefined)
3744
3612
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() não pode ser nulo.'));
3745
3613
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3746
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
3747
- ? funcaoFiltragem.valor
3748
- : funcaoFiltragem;
3614
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
3749
3615
  if (!Array.isArray(valorVetor)) {
3750
3616
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() deve ser um vetor.'));
3751
3617
  }
@@ -3876,9 +3742,7 @@ async function todosEmCondicao(interpretador, vetor, funcaoCondicional) {
3876
3742
  * @returns
3877
3743
  */
3878
3744
  async function tupla(interpretador, vetor) {
3879
- const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ?
3880
- vetor.valor :
3881
- vetor;
3745
+ const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3882
3746
  if (!Array.isArray(valorVetor)) {
3883
3747
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
3884
3748
  }
@@ -3978,9 +3842,7 @@ exports.default = {
3978
3842
  : vetor.splice(inicio, excluirQuantidade, ...items);
3979
3843
  }
3980
3844
  else {
3981
- elementos = !items.length
3982
- ? vetor.splice(inicio)
3983
- : vetor.splice(inicio, ...items);
3845
+ elementos = !items.length ? vetor.splice(inicio) : vetor.splice(inicio, ...items);
3984
3846
  }
3985
3847
  return Promise.resolve(elementos);
3986
3848
  },
@@ -4310,11 +4172,11 @@ exports.Decorador = void 0;
4310
4172
  * na avaliação sintática, é colocado juntamente com a próxima declaração.
4311
4173
  */
4312
4174
  class Decorador {
4313
- constructor(hashArquivo, linha, nome, parametros) {
4175
+ constructor(hashArquivo, linha, nome, atributos) {
4314
4176
  this.linha = linha;
4315
4177
  this.hashArquivo = hashArquivo;
4316
4178
  this.nome = nome;
4317
- this.parametros = parametros;
4179
+ this.atributos = atributos;
4318
4180
  }
4319
4181
  async aceitar(visitante) {
4320
4182
  return Promise.reject(new Error('Este método não deveria ser chamado.'));
@@ -5019,8 +4881,8 @@ const declaracao_1 = require("./declaracao");
5019
4881
  * Uma declaração de constante.
5020
4882
  */
5021
4883
  class Const extends declaracao_1.Declaracao {
5022
- constructor(simbolo, inicializador, tipo = undefined) {
5023
- super(Number(simbolo.linha), simbolo.hashArquivo);
4884
+ constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
4885
+ super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5024
4886
  this.simbolo = simbolo;
5025
4887
  this.inicializador = inicializador;
5026
4888
  this.tipo = tipo;
@@ -5051,13 +4913,14 @@ exports.Continua = Continua;
5051
4913
  Object.defineProperty(exports, "__esModule", { value: true });
5052
4914
  exports.Declaracao = void 0;
5053
4915
  class Declaracao {
5054
- constructor(linha, hashArquivo) {
4916
+ constructor(linha, hashArquivo, decoradores = [], assinaturaMetodo = '<principal>') {
5055
4917
  this.linha = linha;
5056
4918
  this.hashArquivo = hashArquivo;
4919
+ this.decoradores = decoradores;
5057
4920
  // TODO: Por ora, todos os testes são feitos num script só.
5058
4921
  // Quando iniciarem os testes em múltiplos arquivos e módulos,
5059
4922
  // pensar numa forma melhor de preencher isso.
5060
- this.assinaturaMetodo = '<principal>';
4923
+ this.assinaturaMetodo = assinaturaMetodo;
5061
4924
  }
5062
4925
  async aceitar(visitante) {
5063
4926
  return Promise.reject(new Error('Este método não deveria ser chamado.'));
@@ -5141,8 +5004,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
5141
5004
  exports.Expressao = void 0;
5142
5005
  const declaracao_1 = require("./declaracao");
5143
5006
  class Expressao extends declaracao_1.Declaracao {
5144
- constructor(expressao) {
5145
- super(expressao.linha, expressao.hashArquivo);
5007
+ constructor(expressao, decoradores = []) {
5008
+ super(expressao.linha, expressao.hashArquivo, decoradores);
5146
5009
  this.expressao = expressao;
5147
5010
  }
5148
5011
  async aceitar(visitante) {
@@ -5521,8 +5384,8 @@ const declaracao_1 = require("./declaracao");
5521
5384
  * Uma declaração de variável.
5522
5385
  */
5523
5386
  class Var extends declaracao_1.Declaracao {
5524
- constructor(simbolo, inicializador, tipo = undefined) {
5525
- super(Number(simbolo.linha), simbolo.hashArquivo);
5387
+ constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5388
+ super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5526
5389
  this.simbolo = simbolo;
5527
5390
  this.inicializador = inicializador;
5528
5391
  this.tipo = tipo;
@@ -5761,8 +5624,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
5761
5624
  };
5762
5625
  // TODO: Apenass Potigol usa isso até então.
5763
5626
  // Estudar mover isso para o dialeto.
5764
- if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
5765
- this.nome !== 'construtor') {
5627
+ if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis && this.nome !== 'construtor') {
5766
5628
  for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
5767
5629
  ambiente.valores[nomeCampo] = {
5768
5630
  valor: valorCampo,
@@ -6168,13 +6030,13 @@ class FormatadorDelegua {
6168
6030
  if (declaracao.multilinha) {
6169
6031
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}/* `;
6170
6032
  for (let linhaConteudo of declaracao.conteudo) {
6171
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g, " ")}${this.quebraLinha}`;
6033
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g, ' ')}${this.quebraLinha}`;
6172
6034
  }
6173
6035
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} */${this.quebraLinha}`;
6174
6036
  }
6175
6037
  else {
6176
6038
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}// `;
6177
- this.codigoFormatado += declaracao.conteudo.replace(/\s+/g, " ");
6039
+ this.codigoFormatado += declaracao.conteudo.replace(/\s+/g, ' ');
6178
6040
  this.codigoFormatado += `${this.quebraLinha}`;
6179
6041
  }
6180
6042
  }
@@ -7171,7 +7033,7 @@ function inferirTipoVariavel(variavel) {
7171
7033
  if (variavel.constructor.name === 'Classe')
7172
7034
  return 'objeto';
7173
7035
  if (variavel.constructor.name === 'Simbolo') {
7174
- if (typeof variavel === "object") {
7036
+ if (typeof variavel === 'object') {
7175
7037
  const simbolo = variavel;
7176
7038
  if (simbolo.tipo === delegua_2.default.ESCREVA)
7177
7039
  return TIPO_NATIVO.ESCREVA;
@@ -7252,7 +7114,7 @@ class InterpretadorBase {
7252
7114
  delegua_2.default.INTEIRO,
7253
7115
  delegua_2.default.NUMERO,
7254
7116
  delegua_2.default.NÚMERO,
7255
- delegua_2.default.REAL
7117
+ delegua_2.default.REAL,
7256
7118
  ];
7257
7119
  this.diretorioBase = diretorioBase;
7258
7120
  this.performance = performance;
@@ -7606,8 +7468,7 @@ class InterpretadorBase {
7606
7468
  return Number(valorEsquerdo) - Number(valorDireito);
7607
7469
  case delegua_1.default.ADICAO:
7608
7470
  case delegua_1.default.MAIS_IGUAL:
7609
- if (this.tiposNumericos.includes(tipoEsquerdo) &&
7610
- this.tiposNumericos.includes(tipoDireito)) {
7471
+ if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
7611
7472
  return Number(valorEsquerdo) + Number(valorDireito);
7612
7473
  }
7613
7474
  return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
@@ -7698,9 +7559,7 @@ class InterpretadorBase {
7698
7559
  return entidadeChamada.declaracao.parametros;
7699
7560
  }
7700
7561
  if (entidadeChamada instanceof estruturas_1.DescritorTipoClasse) {
7701
- return entidadeChamada.metodos.construtor
7702
- ? entidadeChamada.metodos.construtor.declaracao.parametros
7703
- : [];
7562
+ return entidadeChamada.metodos.construtor ? entidadeChamada.metodos.construtor.declaracao.parametros : [];
7704
7563
  }
7705
7564
  return [];
7706
7565
  }
@@ -8795,7 +8654,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
8795
8654
  const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
8796
8655
  switch (this.comando) {
8797
8656
  case 'proximo':
8798
- if (cloneDeclaracao.condicao !== null && this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8657
+ if (cloneDeclaracao.condicao !== null &&
8658
+ this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8799
8659
  escopoAtual.emLacoRepeticao = true;
8800
8660
  const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes);
8801
8661
  return resultadoBloco;
@@ -8805,7 +8665,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
8805
8665
  default:
8806
8666
  let retornoExecucao;
8807
8667
  while (!(retornoExecucao instanceof quebras_1.Quebra) && !this.pontoDeParadaAtivo) {
8808
- if (cloneDeclaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8668
+ if (cloneDeclaracao.condicao !== null &&
8669
+ !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8809
8670
  break;
8810
8671
  }
8811
8672
  try {
@@ -9252,8 +9113,8 @@ class PilhaEscoposExecucao {
9252
9113
  let subtipo = '';
9253
9114
  if (valor instanceof Array) {
9254
9115
  // TODO: verificar tipo lógico e outros possíveis subtipos
9255
- let numeros = valor.some(v => typeof v === 'number');
9256
- let textos = valor.some(v => typeof v === 'string');
9116
+ let numeros = valor.some((v) => typeof v === 'number');
9117
+ let textos = valor.some((v) => typeof v === 'string');
9257
9118
  if (numeros && textos)
9258
9119
  subtipo = delegua_1.default.QUALQUER;
9259
9120
  else if (numeros)
@@ -9287,8 +9148,8 @@ class PilhaEscoposExecucao {
9287
9148
  let subtipo = '';
9288
9149
  if (valor instanceof Array) {
9289
9150
  // TODO: verificar tipo lógico e outros possíveis subtipos
9290
- let numeros = valor.some(v => typeof v === 'number');
9291
- let textos = valor.some(v => typeof v === 'string');
9151
+ let numeros = valor.some((v) => typeof v === 'number');
9152
+ let textos = valor.some((v) => typeof v === 'string');
9292
9153
  if (numeros && textos)
9293
9154
  subtipo = delegua_1.default.QUALQUER;
9294
9155
  else if (numeros)
@@ -9326,7 +9187,7 @@ class PilhaEscoposExecucao {
9326
9187
  variavel.valor[indice] = valorResolvido;
9327
9188
  }
9328
9189
  else {
9329
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, "Variável não é um vetor.");
9190
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, 'Variável não é um vetor.');
9330
9191
  }
9331
9192
  }
9332
9193
  else {