@designliquido/delegua 0.36.2 → 0.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) 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 +55 -106
  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/acesso-indice-variavel.d.ts +2 -2
  27. package/construtos/acesso-indice-variavel.d.ts.map +1 -1
  28. package/construtos/acesso-indice-variavel.js.map +1 -1
  29. package/construtos/atribuicao-por-indice.d.ts +4 -4
  30. package/construtos/atribuicao-por-indice.d.ts.map +1 -1
  31. package/construtos/atribuicao-por-indice.js.map +1 -1
  32. package/construtos/atribuir.d.ts +2 -3
  33. package/construtos/atribuir.d.ts.map +1 -1
  34. package/construtos/atribuir.js +1 -1
  35. package/construtos/atribuir.js.map +1 -1
  36. package/construtos/binario.d.ts.map +1 -1
  37. package/construtos/binario.js.map +1 -1
  38. package/construtos/chamada.d.ts +2 -2
  39. package/construtos/chamada.d.ts.map +1 -1
  40. package/construtos/chamada.js.map +1 -1
  41. package/construtos/comentario.d.ts +2 -2
  42. package/construtos/constante.d.ts.map +1 -1
  43. package/construtos/constante.js.map +1 -1
  44. package/construtos/decorador.d.ts +6 -2
  45. package/construtos/decorador.d.ts.map +1 -1
  46. package/construtos/decorador.js +2 -2
  47. package/construtos/decorador.js.map +1 -1
  48. package/construtos/expressao-regular.d.ts.map +1 -1
  49. package/construtos/expressao-regular.js.map +1 -1
  50. package/construtos/qual-tipo.d.ts.map +1 -1
  51. package/construtos/qual-tipo.js.map +1 -1
  52. package/construtos/tipo-de.d.ts.map +1 -1
  53. package/construtos/tipo-de.js.map +1 -1
  54. package/construtos/variavel.d.ts.map +1 -1
  55. package/construtos/variavel.js.map +1 -1
  56. package/declaracoes/const.d.ts +2 -2
  57. package/declaracoes/const.d.ts.map +1 -1
  58. package/declaracoes/const.js +2 -2
  59. package/declaracoes/const.js.map +1 -1
  60. package/declaracoes/declaracao.d.ts +3 -1
  61. package/declaracoes/declaracao.d.ts.map +1 -1
  62. package/declaracoes/declaracao.js +3 -2
  63. package/declaracoes/declaracao.js.map +1 -1
  64. package/declaracoes/expressao.d.ts +2 -2
  65. package/declaracoes/expressao.d.ts.map +1 -1
  66. package/declaracoes/expressao.js +2 -2
  67. package/declaracoes/expressao.js.map +1 -1
  68. package/declaracoes/tendo-como.d.ts.map +1 -1
  69. package/declaracoes/tendo-como.js.map +1 -1
  70. package/declaracoes/var.d.ts +2 -2
  71. package/declaracoes/var.d.ts.map +1 -1
  72. package/declaracoes/var.js +2 -2
  73. package/declaracoes/var.js.map +1 -1
  74. package/estruturas/chamavel.d.ts.map +1 -1
  75. package/estruturas/chamavel.js.map +1 -1
  76. package/estruturas/classe-padrao.d.ts.map +1 -1
  77. package/estruturas/delegua-funcao.d.ts.map +1 -1
  78. package/estruturas/delegua-funcao.js +1 -2
  79. package/estruturas/delegua-funcao.js.map +1 -1
  80. package/formatadores/formatador-delegua.d.ts.map +1 -1
  81. package/formatadores/formatador-delegua.js +2 -2
  82. package/formatadores/formatador-delegua.js.map +1 -1
  83. package/interfaces/avaliador-sintatico-interface.d.ts +0 -45
  84. package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
  85. package/interfaces/formatador-comum-interface.d.ts +2 -2
  86. package/interfaces/retornos/retorno-execucao-interface.d.ts +1 -1
  87. package/interfaces/variavel-interface.d.ts +1 -1
  88. package/interfaces/variavel-interface.d.ts.map +1 -1
  89. package/interpretador/comum.d.ts +1 -1
  90. package/interpretador/comum.d.ts.map +1 -1
  91. package/interpretador/comum.js.map +1 -1
  92. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  93. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  94. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  95. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  96. package/interpretador/inferenciador.d.ts +1 -1
  97. package/interpretador/inferenciador.d.ts.map +1 -1
  98. package/interpretador/inferenciador.js +1 -1
  99. package/interpretador/inferenciador.js.map +1 -1
  100. package/interpretador/interpretador-base.d.ts.map +1 -1
  101. package/interpretador/interpretador-base.js +3 -6
  102. package/interpretador/interpretador-base.js.map +1 -1
  103. package/interpretador/interpretador-com-depuracao.d.ts.map +1 -1
  104. package/interpretador/interpretador-com-depuracao.js +4 -2
  105. package/interpretador/interpretador-com-depuracao.js.map +1 -1
  106. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  107. package/interpretador/pilha-escopos-execucao.js +5 -5
  108. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  109. package/package.json +9 -9
  110. package/tradutores/tradutor-assembly-x64.js +13 -13
  111. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  112. package/tradutores/tradutor-assemblyscript.js +3 -2
  113. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  114. package/tradutores/tradutor-javascript.d.ts +4 -4
  115. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  116. package/tradutores/tradutor-javascript.js +27 -24
  117. package/tradutores/tradutor-javascript.js.map +1 -1
  118. package/tradutores/tradutor-python.d.ts +20 -5
  119. package/tradutores/tradutor-python.d.ts.map +1 -1
  120. package/tradutores/tradutor-python.js +109 -55
  121. package/tradutores/tradutor-python.js.map +1 -1
  122. package/umd/delegua.js +283 -363
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`.
@@ -604,11 +539,12 @@ class AvaliadorSintatico {
604
539
  delegua_2.default.DIVISAO_INTEIRA_IGUAL,
605
540
  delegua_2.default.MODULO_IGUAL,
606
541
  ].includes(expressao.operador.tipo)) {
607
- let simbolo = expressao.esquerda.simbolo;
608
542
  if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
609
- simbolo = expressao.esquerda.entidadeChamada.simbolo;
610
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, expressao.esquerda.indice);
543
+ const entidade = expressao.esquerda;
544
+ const simbolo = entidade.entidadeChamada.simbolo;
545
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, entidade.indice);
611
546
  }
547
+ const simbolo = expressao.esquerda.simbolo;
612
548
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
613
549
  }
614
550
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
@@ -618,11 +554,11 @@ class AvaliadorSintatico {
618
554
  const simbolo = expressao.simbolo;
619
555
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
620
556
  }
621
- else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
557
+ if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
622
558
  const get = expressao;
623
559
  return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
624
560
  }
625
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
561
+ if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
626
562
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
627
563
  }
628
564
  this.erro(igual, 'Tarefa de atribuição inválida');
@@ -678,7 +614,8 @@ class AvaliadorSintatico {
678
614
  const expressao = this.expressao();
679
615
  // Ponto-e-vírgula é opcional aqui.
680
616
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
681
- return new declaracoes_1.Expressao(expressao);
617
+ const decoradores = Array.from(this.pilhaDecoradores);
618
+ return new declaracoes_1.Expressao(expressao, decoradores);
682
619
  }
683
620
  declaracaoComentarioMultilinha() {
684
621
  let simboloComentario;
@@ -922,7 +859,6 @@ class AvaliadorSintatico {
922
859
  return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
923
860
  }
924
861
  resolverDecorador() {
925
- this.pilhaDecoradores = [];
926
862
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
927
863
  let nomeDecorador = '';
928
864
  let linha;
@@ -942,7 +878,14 @@ class AvaliadorSintatico {
942
878
  this.avancarEDevolverAnterior();
943
879
  nomeDecorador += simbolo.lexema || '.';
944
880
  }
945
- this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, parametros));
881
+ const atributos = {};
882
+ for (const parametro of parametros) {
883
+ if (parametro.nome.lexema in atributos) {
884
+ throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
885
+ }
886
+ atributos[parametro.nome.lexema] = parametro.valorPadrao;
887
+ }
888
+ this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
946
889
  }
947
890
  }
948
891
  /**
@@ -1041,8 +984,11 @@ class AvaliadorSintatico {
1041
984
  // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
1042
985
  const retornos = [];
1043
986
  for (let identificador of identificadores) {
1044
- retornos.push(new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
987
+ const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
988
+ declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
989
+ retornos.push(declaracaoVar);
1045
990
  }
991
+ this.pilhaDecoradores = [];
1046
992
  return retornos;
1047
993
  }
1048
994
  /**
@@ -1051,7 +997,7 @@ class AvaliadorSintatico {
1051
997
  */
1052
998
  declaracaoDeVariaveis() {
1053
999
  const identificadores = [];
1054
- let retorno = [];
1000
+ const retorno = [];
1055
1001
  let tipo = null;
1056
1002
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1057
1003
  return this.declaracaoDesestruturacaoVariavel();
@@ -1065,10 +1011,11 @@ class AvaliadorSintatico {
1065
1011
  }
1066
1012
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1067
1013
  // 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));
1014
+ for (let identificador of identificadores.values()) {
1015
+ retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
1070
1016
  }
1071
1017
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1018
+ this.pilhaDecoradores = [];
1072
1019
  return retorno;
1073
1020
  }
1074
1021
  const inicializadores = [];
@@ -1076,13 +1023,14 @@ class AvaliadorSintatico {
1076
1023
  inicializadores.push(this.expressao());
1077
1024
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1078
1025
  if (identificadores.length !== inicializadores.length) {
1079
- throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1026
+ throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1080
1027
  }
1081
1028
  for (let [indice, identificador] of identificadores.entries()) {
1082
1029
  tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
1083
- retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
1030
+ retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1084
1031
  }
1085
1032
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1033
+ this.pilhaDecoradores = [];
1086
1034
  return retorno;
1087
1035
  }
1088
1036
  declaracaoDesestruturacaoConstante() {
@@ -1097,7 +1045,9 @@ class AvaliadorSintatico {
1097
1045
  // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
1098
1046
  const retornos = [];
1099
1047
  for (let identificador of identificadores) {
1100
- retornos.push(new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
1048
+ const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1049
+ declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
1050
+ retornos.push(declaracaoConst);
1101
1051
  }
1102
1052
  return retornos;
1103
1053
  }
@@ -1124,12 +1074,13 @@ class AvaliadorSintatico {
1124
1074
  inicializadores.push(this.expressao());
1125
1075
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1126
1076
  if (identificadores.length !== inicializadores.length) {
1127
- throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1077
+ throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1128
1078
  }
1129
1079
  let retorno = [];
1130
1080
  for (let [indice, identificador] of identificadores.entries()) {
1131
- retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
1081
+ retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1132
1082
  }
1083
+ this.pilhaDecoradores = [];
1133
1084
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1134
1085
  return retorno;
1135
1086
  }
@@ -1138,13 +1089,14 @@ class AvaliadorSintatico {
1138
1089
  switch (this.simbolos[this.atual].tipo) {
1139
1090
  case delegua_2.default.CONSTRUTOR:
1140
1091
  simbolo = this.avancarEDevolverAnterior();
1141
- this.pilhaDecoradores = [];
1142
1092
  break;
1143
1093
  default:
1144
1094
  simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
1145
1095
  break;
1146
1096
  }
1147
- return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, this.pilhaDecoradores);
1097
+ const decoradores = Array.from(this.pilhaDecoradores);
1098
+ this.pilhaDecoradores = [];
1099
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, decoradores);
1148
1100
  }
1149
1101
  logicaComumParametros() {
1150
1102
  const parametros = [];
@@ -1166,7 +1118,7 @@ class AvaliadorSintatico {
1166
1118
  parametro.tipoDado = {
1167
1119
  nome: this.simbolos[this.atual - 2].lexema,
1168
1120
  tipo: tipoDadoParametro,
1169
- tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null,
1121
+ tipoInvalido: !tipoDadoParametro ? this.simbolos[this.atual].lexema : null,
1170
1122
  };
1171
1123
  this.avancarEDevolverAnterior();
1172
1124
  }
@@ -1196,7 +1148,7 @@ class AvaliadorSintatico {
1196
1148
  }
1197
1149
  declaracaoDeClasse() {
1198
1150
  const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
1199
- const pilhaDecoradoresClasse = this.pilhaDecoradores;
1151
+ const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
1200
1152
  let superClasse = null;
1201
1153
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
1202
1154
  this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
@@ -1219,14 +1171,13 @@ class AvaliadorSintatico {
1219
1171
  switch (proximoSimbolo.tipo) {
1220
1172
  case delegua_2.default.PARENTESE_ESQUERDO:
1221
1173
  metodos.push(this.funcao('método'));
1222
- this.pilhaDecoradores = [];
1223
1174
  break;
1224
1175
  case delegua_2.default.DOIS_PONTOS:
1225
1176
  const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
1226
1177
  this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
1227
1178
  const tipoPropriedade = this.avancarEDevolverAnterior();
1228
1179
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1229
- propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
1180
+ propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, Array.from(this.pilhaDecoradores)));
1230
1181
  this.pilhaDecoradores = [];
1231
1182
  break;
1232
1183
  default:
@@ -1237,15 +1188,22 @@ class AvaliadorSintatico {
1237
1188
  return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
1238
1189
  }
1239
1190
  /**
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.
1191
+ * Declarações fora de bloco precisam ser verificadas primeiro por
1192
+ * uma série de motivos, como, por exemplo:
1193
+ *
1194
+ * - Não é possível declarar uma classe/função dentro de um bloco `enquanto`,
1195
+ * `fazer ... enquanto`, `para`, `escolha`, etc;
1196
+ * - Qualquer declaração pode ter um decorador.
1243
1197
  * @returns Uma função ou classe se o símbolo atual resolver aqui.
1244
1198
  * O retorno de `resolverDeclaracao()` em caso contrário.
1245
1199
  * @see resolverDeclaracao
1200
+ * @see resolverDecorador
1246
1201
  */
1247
1202
  resolverDeclaracaoForaDeBloco() {
1248
1203
  try {
1204
+ while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
1205
+ this.resolverDecorador();
1206
+ }
1249
1207
  if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1250
1208
  this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1251
1209
  this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
@@ -1318,7 +1276,7 @@ class AvaliadorSintatico {
1318
1276
  }
1319
1277
  exports.AvaliadorSintatico = AvaliadorSintatico;
1320
1278
 
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){
1279
+ },{"../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
1280
  "use strict";
1323
1281
  var __importDefault = (this && this.__importDefault) || function (mod) {
1324
1282
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -3094,47 +3052,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3094
3052
  Object.defineProperty(exports, "__esModule", { value: true });
3095
3053
  exports.MicroAvaliadorSintatico = void 0;
3096
3054
  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
3055
  const micro_avaliador_sintatico_base_1 = require("./micro-avaliador-sintatico-base");
3056
+ const delegua_1 = __importDefault(require("../tipos-de-simbolos/microgramaticas/delegua"));
3100
3057
  /**
3101
3058
  * O MicroAvaliadorSintatico funciona apenas dentro de interpolações de texto.
3102
3059
  */
3103
3060
  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
3061
  primario() {
3139
3062
  const simboloAtual = this.simbolos[this.atual];
3140
3063
  let valores = [];
@@ -3256,33 +3179,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3256
3179
  }
3257
3180
  return this.chamar();
3258
3181
  }
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
3182
  bitShift() {
3287
3183
  let expressao = this.adicaoOuSubtracao();
3288
3184
  while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MENOR_MENOR, delegua_1.default.MAIOR_MAIOR)) {
@@ -3319,15 +3215,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3319
3215
  }
3320
3216
  return expressao;
3321
3217
  }
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
3218
  em() {
3332
3219
  let expressao = this.comparacaoIgualdade();
3333
3220
  while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EM)) {
@@ -3346,18 +3233,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3346
3233
  }
3347
3234
  return expressao;
3348
3235
  }
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
3236
  analisar(retornoLexador, linha) {
3362
3237
  this.erros = [];
3363
3238
  this.atual = 0;
@@ -3375,7 +3250,7 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
3375
3250
  }
3376
3251
  exports.MicroAvaliadorSintatico = MicroAvaliadorSintatico;
3377
3252
 
3378
- },{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./erro-avaliador-sintatico":7,"./micro-avaliador-sintatico-base":9}],11:[function(require,module,exports){
3253
+ },{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./micro-avaliador-sintatico-base":9}],11:[function(require,module,exports){
3379
3254
  "use strict";
3380
3255
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3381
3256
  if (k2 === undefined) k2 = k;
@@ -3601,9 +3476,7 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
3601
3476
  if (vetor === null || vetor === undefined)
3602
3477
  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
3478
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3604
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
3605
- ? funcaoFiltragem.valor
3606
- : funcaoFiltragem;
3479
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
3607
3480
  if (!Array.isArray(valorVetor)) {
3608
3481
  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
3482
  }
@@ -3668,9 +3541,7 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
3668
3541
  if (vetor === null || vetor === undefined)
3669
3542
  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
3543
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3671
- const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
3672
- ? funcaoMapeamento.valor
3673
- : funcaoMapeamento;
3544
+ const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor') ? funcaoMapeamento.valor : funcaoMapeamento;
3674
3545
  if (!Array.isArray(valorVetor)) {
3675
3546
  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
3547
  }
@@ -3719,9 +3590,7 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
3719
3590
  if (vetor === null || vetor === undefined)
3720
3591
  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
3592
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3722
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
3723
- ? funcaoFiltragem.valor
3724
- : funcaoFiltragem;
3593
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
3725
3594
  if (!Array.isArray(valorVetor)) {
3726
3595
  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
3596
  }
@@ -3743,9 +3612,7 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
3743
3612
  if (vetor === null || vetor === undefined)
3744
3613
  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
3614
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3746
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
3747
- ? funcaoFiltragem.valor
3748
- : funcaoFiltragem;
3615
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
3749
3616
  if (!Array.isArray(valorVetor)) {
3750
3617
  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
3618
  }
@@ -3876,9 +3743,7 @@ async function todosEmCondicao(interpretador, vetor, funcaoCondicional) {
3876
3743
  * @returns
3877
3744
  */
3878
3745
  async function tupla(interpretador, vetor) {
3879
- const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ?
3880
- vetor.valor :
3881
- vetor;
3746
+ const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
3882
3747
  if (!Array.isArray(valorVetor)) {
3883
3748
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
3884
3749
  }
@@ -3978,9 +3843,7 @@ exports.default = {
3978
3843
  : vetor.splice(inicio, excluirQuantidade, ...items);
3979
3844
  }
3980
3845
  else {
3981
- elementos = !items.length
3982
- ? vetor.splice(inicio)
3983
- : vetor.splice(inicio, ...items);
3846
+ elementos = !items.length ? vetor.splice(inicio) : vetor.splice(inicio, ...items);
3984
3847
  }
3985
3848
  return Promise.resolve(elementos);
3986
3849
  },
@@ -4177,7 +4040,7 @@ exports.Atribuir = void 0;
4177
4040
  class Atribuir {
4178
4041
  constructor(hashArquivo, simbolo, valor,
4179
4042
  // indice so é usado para variaveis de vetores
4180
- // TODO: criar alguma validaçao para garantir que indice so seja passado para variaveis de vetores
4043
+ // TODO: criar alguma validaçao para garantir que `indice` seja passado para variáveis de vetores
4181
4044
  indice) {
4182
4045
  this.linha = Number(simbolo.linha);
4183
4046
  this.hashArquivo = hashArquivo;
@@ -4310,11 +4173,11 @@ exports.Decorador = void 0;
4310
4173
  * na avaliação sintática, é colocado juntamente com a próxima declaração.
4311
4174
  */
4312
4175
  class Decorador {
4313
- constructor(hashArquivo, linha, nome, parametros) {
4176
+ constructor(hashArquivo, linha, nome, atributos) {
4314
4177
  this.linha = linha;
4315
4178
  this.hashArquivo = hashArquivo;
4316
4179
  this.nome = nome;
4317
- this.parametros = parametros;
4180
+ this.atributos = atributos;
4318
4181
  }
4319
4182
  async aceitar(visitante) {
4320
4183
  return Promise.reject(new Error('Este método não deveria ser chamado.'));
@@ -5019,8 +4882,8 @@ const declaracao_1 = require("./declaracao");
5019
4882
  * Uma declaração de constante.
5020
4883
  */
5021
4884
  class Const extends declaracao_1.Declaracao {
5022
- constructor(simbolo, inicializador, tipo = undefined) {
5023
- super(Number(simbolo.linha), simbolo.hashArquivo);
4885
+ constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
4886
+ super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5024
4887
  this.simbolo = simbolo;
5025
4888
  this.inicializador = inicializador;
5026
4889
  this.tipo = tipo;
@@ -5051,13 +4914,14 @@ exports.Continua = Continua;
5051
4914
  Object.defineProperty(exports, "__esModule", { value: true });
5052
4915
  exports.Declaracao = void 0;
5053
4916
  class Declaracao {
5054
- constructor(linha, hashArquivo) {
4917
+ constructor(linha, hashArquivo, decoradores = [], assinaturaMetodo = '<principal>') {
5055
4918
  this.linha = linha;
5056
4919
  this.hashArquivo = hashArquivo;
4920
+ this.decoradores = decoradores;
5057
4921
  // TODO: Por ora, todos os testes são feitos num script só.
5058
4922
  // Quando iniciarem os testes em múltiplos arquivos e módulos,
5059
4923
  // pensar numa forma melhor de preencher isso.
5060
- this.assinaturaMetodo = '<principal>';
4924
+ this.assinaturaMetodo = assinaturaMetodo;
5061
4925
  }
5062
4926
  async aceitar(visitante) {
5063
4927
  return Promise.reject(new Error('Este método não deveria ser chamado.'));
@@ -5141,8 +5005,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
5141
5005
  exports.Expressao = void 0;
5142
5006
  const declaracao_1 = require("./declaracao");
5143
5007
  class Expressao extends declaracao_1.Declaracao {
5144
- constructor(expressao) {
5145
- super(expressao.linha, expressao.hashArquivo);
5008
+ constructor(expressao, decoradores = []) {
5009
+ super(expressao.linha, expressao.hashArquivo, decoradores);
5146
5010
  this.expressao = expressao;
5147
5011
  }
5148
5012
  async aceitar(visitante) {
@@ -5521,8 +5385,8 @@ const declaracao_1 = require("./declaracao");
5521
5385
  * Uma declaração de variável.
5522
5386
  */
5523
5387
  class Var extends declaracao_1.Declaracao {
5524
- constructor(simbolo, inicializador, tipo = undefined) {
5525
- super(Number(simbolo.linha), simbolo.hashArquivo);
5388
+ constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5389
+ super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5526
5390
  this.simbolo = simbolo;
5527
5391
  this.inicializador = inicializador;
5528
5392
  this.tipo = tipo;
@@ -5761,8 +5625,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
5761
5625
  };
5762
5626
  // TODO: Apenass Potigol usa isso até então.
5763
5627
  // Estudar mover isso para o dialeto.
5764
- if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
5765
- this.nome !== 'construtor') {
5628
+ if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis && this.nome !== 'construtor') {
5766
5629
  for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
5767
5630
  ambiente.valores[nomeCampo] = {
5768
5631
  valor: valorCampo,
@@ -6168,13 +6031,13 @@ class FormatadorDelegua {
6168
6031
  if (declaracao.multilinha) {
6169
6032
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}/* `;
6170
6033
  for (let linhaConteudo of declaracao.conteudo) {
6171
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g, " ")}${this.quebraLinha}`;
6034
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g, ' ')}${this.quebraLinha}`;
6172
6035
  }
6173
6036
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} */${this.quebraLinha}`;
6174
6037
  }
6175
6038
  else {
6176
6039
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}// `;
6177
- this.codigoFormatado += declaracao.conteudo.replace(/\s+/g, " ");
6040
+ this.codigoFormatado += declaracao.conteudo.replace(/\s+/g, ' ');
6178
6041
  this.codigoFormatado += `${this.quebraLinha}`;
6179
6042
  }
6180
6043
  }
@@ -7171,7 +7034,7 @@ function inferirTipoVariavel(variavel) {
7171
7034
  if (variavel.constructor.name === 'Classe')
7172
7035
  return 'objeto';
7173
7036
  if (variavel.constructor.name === 'Simbolo') {
7174
- if (typeof variavel === "object") {
7037
+ if (typeof variavel === 'object') {
7175
7038
  const simbolo = variavel;
7176
7039
  if (simbolo.tipo === delegua_2.default.ESCREVA)
7177
7040
  return TIPO_NATIVO.ESCREVA;
@@ -7252,7 +7115,7 @@ class InterpretadorBase {
7252
7115
  delegua_2.default.INTEIRO,
7253
7116
  delegua_2.default.NUMERO,
7254
7117
  delegua_2.default.NÚMERO,
7255
- delegua_2.default.REAL
7118
+ delegua_2.default.REAL,
7256
7119
  ];
7257
7120
  this.diretorioBase = diretorioBase;
7258
7121
  this.performance = performance;
@@ -7606,8 +7469,7 @@ class InterpretadorBase {
7606
7469
  return Number(valorEsquerdo) - Number(valorDireito);
7607
7470
  case delegua_1.default.ADICAO:
7608
7471
  case delegua_1.default.MAIS_IGUAL:
7609
- if (this.tiposNumericos.includes(tipoEsquerdo) &&
7610
- this.tiposNumericos.includes(tipoDireito)) {
7472
+ if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
7611
7473
  return Number(valorEsquerdo) + Number(valorDireito);
7612
7474
  }
7613
7475
  return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
@@ -7698,9 +7560,7 @@ class InterpretadorBase {
7698
7560
  return entidadeChamada.declaracao.parametros;
7699
7561
  }
7700
7562
  if (entidadeChamada instanceof estruturas_1.DescritorTipoClasse) {
7701
- return entidadeChamada.metodos.construtor
7702
- ? entidadeChamada.metodos.construtor.declaracao.parametros
7703
- : [];
7563
+ return entidadeChamada.metodos.construtor ? entidadeChamada.metodos.construtor.declaracao.parametros : [];
7704
7564
  }
7705
7565
  return [];
7706
7566
  }
@@ -8795,7 +8655,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
8795
8655
  const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
8796
8656
  switch (this.comando) {
8797
8657
  case 'proximo':
8798
- if (cloneDeclaracao.condicao !== null && this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8658
+ if (cloneDeclaracao.condicao !== null &&
8659
+ this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8799
8660
  escopoAtual.emLacoRepeticao = true;
8800
8661
  const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes);
8801
8662
  return resultadoBloco;
@@ -8805,7 +8666,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
8805
8666
  default:
8806
8667
  let retornoExecucao;
8807
8668
  while (!(retornoExecucao instanceof quebras_1.Quebra) && !this.pontoDeParadaAtivo) {
8808
- if (cloneDeclaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8669
+ if (cloneDeclaracao.condicao !== null &&
8670
+ !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
8809
8671
  break;
8810
8672
  }
8811
8673
  try {
@@ -9252,8 +9114,8 @@ class PilhaEscoposExecucao {
9252
9114
  let subtipo = '';
9253
9115
  if (valor instanceof Array) {
9254
9116
  // 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');
9117
+ let numeros = valor.some((v) => typeof v === 'number');
9118
+ let textos = valor.some((v) => typeof v === 'string');
9257
9119
  if (numeros && textos)
9258
9120
  subtipo = delegua_1.default.QUALQUER;
9259
9121
  else if (numeros)
@@ -9287,8 +9149,8 @@ class PilhaEscoposExecucao {
9287
9149
  let subtipo = '';
9288
9150
  if (valor instanceof Array) {
9289
9151
  // 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');
9152
+ let numeros = valor.some((v) => typeof v === 'number');
9153
+ let textos = valor.some((v) => typeof v === 'string');
9292
9154
  if (numeros && textos)
9293
9155
  subtipo = delegua_1.default.QUALQUER;
9294
9156
  else if (numeros)
@@ -9326,7 +9188,7 @@ class PilhaEscoposExecucao {
9326
9188
  variavel.valor[indice] = valorResolvido;
9327
9189
  }
9328
9190
  else {
9329
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, "Variável não é um vetor.");
9191
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, 'Variável não é um vetor.');
9330
9192
  }
9331
9193
  }
9332
9194
  else {
@@ -24985,14 +24847,15 @@ class TradutorAssemblyScript {
24985
24847
  resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
24986
24848
  return resultado;
24987
24849
  }
24850
+ // TODO: Eliminar o soft cast para `any`.
24988
24851
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
24989
- var _a, _b;
24852
+ var _a;
24990
24853
  let resultado = '';
24991
24854
  resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
24992
24855
  resultado +=
24993
24856
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
24994
24857
  resultado += ' = ';
24995
- if ((_b = (_a = AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor) === null || _a === void 0 ? void 0 : _a.simbolo) === null || _b === void 0 ? void 0 : _b.lexema) {
24858
+ if ((_a = (AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor).simbolo) === null || _a === void 0 ? void 0 : _a.lexema) {
24996
24859
  resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
24997
24860
  }
24998
24861
  else {
@@ -25130,7 +24993,6 @@ class TradutorJavaScript {
25130
24993
  return '-';
25131
24994
  }
25132
24995
  }
25133
- //TODO: @Samuel
25134
24996
  traduzirFuncoesNativas(metodo) {
25135
24997
  switch (metodo.toLowerCase()) {
25136
24998
  case 'adicionar':
@@ -25160,6 +25022,8 @@ class TradutorJavaScript {
25160
25022
  return 'toLowerCase';
25161
25023
  case 'substituir':
25162
25024
  return 'replace';
25025
+ case 'texto':
25026
+ return 'String';
25163
25027
  default:
25164
25028
  return metodo;
25165
25029
  }
@@ -25186,22 +25050,6 @@ class TradutorJavaScript {
25186
25050
  resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
25187
25051
  return resultado;
25188
25052
  }
25189
- traduzirConstrutoDefinirValor(definirValor) {
25190
- let resultado = '';
25191
- if (definirValor.objeto instanceof construtos_1.Isto) {
25192
- resultado = 'this.' + definirValor.nome.lexema + ' = ';
25193
- }
25194
- resultado += definirValor.valor.simbolo.lexema;
25195
- return resultado;
25196
- }
25197
- traduzirConstrutoLiteral(literal) {
25198
- if (typeof literal.valor === 'string')
25199
- return `'${literal.valor}'`;
25200
- return literal.valor;
25201
- }
25202
- traduzirConstrutoVariavel(variavel) {
25203
- return variavel.simbolo.lexema;
25204
- }
25205
25053
  traduzirConstrutoChamada(chamada) {
25206
25054
  let resultado = '';
25207
25055
  const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada)}`;
@@ -25242,6 +25090,22 @@ class TradutorJavaScript {
25242
25090
  }
25243
25091
  return resultado;
25244
25092
  }
25093
+ traduzirConstrutoDefinirValor(definirValor) {
25094
+ let resultado = '';
25095
+ if (definirValor.objeto instanceof construtos_1.Isto) {
25096
+ resultado = 'this.' + definirValor.nome.lexema + ' = ';
25097
+ }
25098
+ resultado += definirValor.valor.simbolo.lexema;
25099
+ return resultado;
25100
+ }
25101
+ traduzirConstrutoLiteral(literal) {
25102
+ if (typeof literal.valor === 'string')
25103
+ return `'${literal.valor}'`;
25104
+ return literal.valor;
25105
+ }
25106
+ traduzirConstrutoVariavel(variavel) {
25107
+ return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
25108
+ }
25245
25109
  logicaComumBlocoEscopo(declaracoes) {
25246
25110
  let resultado = '{\n';
25247
25111
  this.indentacao += 4;
@@ -25393,13 +25257,12 @@ class TradutorJavaScript {
25393
25257
  let resultado = 'for (';
25394
25258
  if (declaracaoPara.inicializador.constructor.name === 'Array') {
25395
25259
  resultado +=
25396
- this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0]) + ' ';
25260
+ this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0], false) + '; ';
25397
25261
  }
25398
25262
  else {
25399
25263
  resultado +=
25400
- this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + ' ';
25264
+ this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador, false) + '; ';
25401
25265
  }
25402
- resultado += !resultado.includes(';') ? ';' : '';
25403
25266
  resultado +=
25404
25267
  this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao) + '; ';
25405
25268
  resultado +=
@@ -25490,10 +25353,10 @@ class TradutorJavaScript {
25490
25353
  }
25491
25354
  return resultado;
25492
25355
  }
25493
- traduzirDeclaracaoVar(declaracaoVar) {
25356
+ traduzirDeclaracaoVar(declaracaoVar, adicionarPontoEVirgula = true) {
25494
25357
  let resultado = 'let ';
25495
25358
  resultado += declaracaoVar.simbolo.lexema;
25496
- if (!(declaracaoVar === null || declaracaoVar === void 0 ? void 0 : declaracaoVar.inicializador))
25359
+ if (!(declaracaoVar === null || declaracaoVar === void 0 ? void 0 : declaracaoVar.inicializador) && adicionarPontoEVirgula)
25497
25360
  resultado += ';';
25498
25361
  else {
25499
25362
  resultado += ' = ';
@@ -25503,7 +25366,8 @@ class TradutorJavaScript {
25503
25366
  else {
25504
25367
  resultado += this.dicionarioDeclaracoes[declaracaoVar.inicializador.constructor.name](declaracaoVar.inicializador);
25505
25368
  }
25506
- resultado += ';';
25369
+ if (adicionarPontoEVirgula)
25370
+ resultado += ';';
25507
25371
  }
25508
25372
  return resultado;
25509
25373
  }
@@ -25532,6 +25396,7 @@ class TradutorJavaScript {
25532
25396
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
25533
25397
  return `${direita} ${operador} ${esquerda}`;
25534
25398
  }
25399
+ // TODO: Eliminar o soft cast para `any`.
25535
25400
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
25536
25401
  var _a, _b;
25537
25402
  let resultado = '';
@@ -25580,7 +25445,8 @@ class TradutorJavaScript {
25580
25445
  return resultado;
25581
25446
  }
25582
25447
  traduzirDeclaracaoFalhar(falhar) {
25583
- return `throw '${falhar.explicacao.valor}'`;
25448
+ const explicacao = this.dicionarioConstrutos[falhar.explicacao.constructor.name](falhar.explicacao);
25449
+ return `throw ${explicacao}`;
25584
25450
  }
25585
25451
  traduzirConstrutoUnario(unario) {
25586
25452
  var _a, _b;
@@ -25682,8 +25548,10 @@ class TradutorPython {
25682
25548
  constructor() {
25683
25549
  this.indentacao = 0;
25684
25550
  this.dicionarioConstrutos = {
25685
- AcessoMetodoOuPropriedade: this.trazudirConstrutoAcessoMetodo.bind(this),
25551
+ AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodoOuPropriedade.bind(this),
25552
+ AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
25686
25553
  Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
25554
+ AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
25687
25555
  Atribuir: this.traduzirConstrutoAtribuir.bind(this),
25688
25556
  Binario: this.traduzirConstrutoBinario.bind(this),
25689
25557
  Chamada: this.traduzirConstrutoChamada.bind(this),
@@ -25691,6 +25559,7 @@ class TradutorPython {
25691
25559
  DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
25692
25560
  Literal: this.traduzirConstrutoLiteral.bind(this),
25693
25561
  Logico: this.traduzirConstrutoLogico.bind(this),
25562
+ Unario: this.traduzirConstrutoUnario.bind(this),
25694
25563
  Variavel: this.traduzirConstrutoVariavel.bind(this),
25695
25564
  Vetor: this.traduzirConstrutoVetor.bind(this),
25696
25565
  };
@@ -25700,10 +25569,12 @@ class TradutorPython {
25700
25569
  Comentario: this.traduzirConstrutoComentario.bind(this),
25701
25570
  Const: this.traduzirDeclaracaoConst.bind(this),
25702
25571
  Continua: () => 'continue',
25572
+ Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
25703
25573
  Escreva: this.traduzirDeclaracaoEscreva.bind(this),
25704
25574
  Expressao: this.traduzirDeclaracaoExpressao.bind(this),
25705
25575
  FuncaoDeclaracao: this.traduzirDeclaracaoFuncao.bind(this),
25706
25576
  Leia: this.traduzirDeclaracaoLeia.bind(this),
25577
+ Para: this.traduzirDeclaracaoPara.bind(this),
25707
25578
  ParaCada: this.traduzirDeclaracaoParaCada.bind(this),
25708
25579
  Retorna: this.traduzirDeclaracaoRetorna.bind(this),
25709
25580
  Se: this.traduzirDeclaracaoSe.bind(this),
@@ -25712,9 +25583,6 @@ class TradutorPython {
25712
25583
  Var: this.traduzirDeclaracaoVar.bind(this),
25713
25584
  };
25714
25585
  }
25715
- traduzirNomeVariavel(variavel) {
25716
- return variavel.replace(/\.?([A-Z]+)/g, (x, y) => '_' + y.toLowerCase()).replace(/^_/, '');
25717
- }
25718
25586
  traduzirSimboloOperador(operador) {
25719
25587
  switch (operador.tipo) {
25720
25588
  case delegua_1.default.ADICAO:
@@ -25784,6 +25652,8 @@ class TradutorPython {
25784
25652
  return 'lower';
25785
25653
  case 'substituir':
25786
25654
  return 'replace';
25655
+ case 'texto':
25656
+ return 'str';
25787
25657
  default:
25788
25658
  return metodo;
25789
25659
  }
@@ -25808,7 +25678,12 @@ class TradutorPython {
25808
25678
  resultado += ' '.repeat(this.indentacao) + '\n';
25809
25679
  return resultado;
25810
25680
  }
25811
- trazudirConstrutoAcessoMetodo(acessoMetodo) {
25681
+ traduzirConstrutoAcessoIndiceVariavel(acessoIndiceVariavel) {
25682
+ const entidade = this.dicionarioConstrutos[acessoIndiceVariavel.entidadeChamada.constructor.name](acessoIndiceVariavel.entidadeChamada);
25683
+ const indice = this.dicionarioConstrutos[acessoIndiceVariavel.indice.constructor.name](acessoIndiceVariavel.indice);
25684
+ return `${entidade}[${indice}]`;
25685
+ }
25686
+ traduzirConstrutoAcessoMetodoOuPropriedade(acessoMetodo) {
25812
25687
  if (acessoMetodo.objeto instanceof construtos_1.Variavel) {
25813
25688
  let objetoVariavel = acessoMetodo.objeto;
25814
25689
  let funcaoTraduzida = this.traduzirFuncoesNativas(acessoMetodo.simbolo.lexema);
@@ -25825,6 +25700,12 @@ class TradutorPython {
25825
25700
  traduzirConstrutoAgrupamento(agrupamento) {
25826
25701
  return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
25827
25702
  }
25703
+ traduzirConstrutoAtribuicaoPorIndice(atribuicaoPorIndice) {
25704
+ const objeto = this.dicionarioConstrutos[atribuicaoPorIndice.objeto.constructor.name](atribuicaoPorIndice.objeto);
25705
+ const indice = this.dicionarioConstrutos[atribuicaoPorIndice.indice.constructor.name](atribuicaoPorIndice.indice);
25706
+ const valor = this.dicionarioConstrutos[atribuicaoPorIndice.valor.constructor.name](atribuicaoPorIndice.valor);
25707
+ return `${objeto}[${indice}] = ${valor}`;
25708
+ }
25828
25709
  traduzirConstrutoAtribuir(atribuir) {
25829
25710
  let resultado = atribuir.simbolo.lexema;
25830
25711
  resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
@@ -25898,18 +25779,31 @@ class TradutorPython {
25898
25779
  if (typeof literal.valor === 'boolean') {
25899
25780
  return literal.valor ? 'True' : 'False';
25900
25781
  }
25782
+ if (typeof literal.valor === 'number') {
25783
+ return String(literal.valor);
25784
+ }
25901
25785
  if (!literal.valor)
25902
25786
  return 'None';
25903
25787
  return literal.valor;
25904
25788
  }
25905
25789
  traduzirConstrutoLogico(logico) {
25906
- let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
25907
- let operador = this.traduzirSimboloOperador(logico.operador);
25908
- let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
25790
+ const direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
25791
+ const operador = this.traduzirSimboloOperador(logico.operador);
25792
+ const esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
25909
25793
  return `${esquerda} ${operador} ${direita}`;
25910
25794
  }
25795
+ traduzirConstrutoUnario(unario) {
25796
+ const operador = this.traduzirSimboloOperador(unario.operador);
25797
+ const operando = this.dicionarioConstrutos[unario.operando.constructor.name](unario.operando);
25798
+ switch (unario.incidenciaOperador) {
25799
+ case 'ANTES':
25800
+ return `${operador}${operando}`;
25801
+ case 'DEPOIS':
25802
+ return `${operando}${operador}`;
25803
+ }
25804
+ }
25911
25805
  traduzirConstrutoVariavel(variavel) {
25912
- return variavel.simbolo.lexema;
25806
+ return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
25913
25807
  }
25914
25808
  traduzirConstrutoVetor(vetor) {
25915
25809
  if (!vetor.valores.length) {
@@ -25925,45 +25819,6 @@ class TradutorPython {
25925
25819
  resultado += ']';
25926
25820
  return resultado;
25927
25821
  }
25928
- traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
25929
- let resultado = '';
25930
- if (iniciarComIf) {
25931
- resultado += 'if ';
25932
- }
25933
- else {
25934
- resultado += 'elif ';
25935
- }
25936
- const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
25937
- resultado += condicao;
25938
- resultado += ':\n';
25939
- resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
25940
- if (declaracaoSe.caminhoSenao !== null) {
25941
- resultado += ' '.repeat(this.indentacao);
25942
- const se = declaracaoSe === null || declaracaoSe === void 0 ? void 0 : declaracaoSe.caminhoSenao;
25943
- if (se === null || se === void 0 ? void 0 : se.caminhoEntao) {
25944
- resultado += 'elif ';
25945
- resultado += this.dicionarioConstrutos[se.condicao.constructor.name](se.condicao, false);
25946
- resultado += ':\n';
25947
- resultado += this.dicionarioDeclaracoes[se.caminhoEntao.constructor.name](se.caminhoEntao);
25948
- resultado += ' '.repeat(this.indentacao);
25949
- if (se === null || se === void 0 ? void 0 : se.caminhoSenao) {
25950
- if (se.caminhoSenao instanceof declaracoes_1.Bloco) {
25951
- resultado += 'else:\n';
25952
- resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao, false);
25953
- return resultado;
25954
- }
25955
- else {
25956
- resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao, false);
25957
- return resultado;
25958
- }
25959
- }
25960
- }
25961
- resultado += 'else:\n';
25962
- resultado += ' '.repeat(this.indentacao);
25963
- resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
25964
- }
25965
- return resultado;
25966
- }
25967
25822
  logicaTraducaoMetodoClasse(metodoClasse) {
25968
25823
  this.indentacao += 4;
25969
25824
  let resultado = ' '.repeat(this.indentacao);
@@ -26006,9 +25861,7 @@ class TradutorPython {
26006
25861
  return resultado;
26007
25862
  }
26008
25863
  traduzirDeclaracaoConst(declaracaoConst) {
26009
- let resultado = '';
26010
- resultado += this.traduzirNomeVariavel(declaracaoConst.simbolo.lexema);
26011
- resultado += ' = ';
25864
+ let resultado = declaracaoConst.simbolo.lexema + ' = ';
26012
25865
  const inicializador = declaracaoConst.inicializador;
26013
25866
  if (inicializador) {
26014
25867
  if (this.dicionarioConstrutos[inicializador.constructor.name]) {
@@ -26023,6 +25876,13 @@ class TradutorPython {
26023
25876
  }
26024
25877
  return resultado;
26025
25878
  }
25879
+ traduzirDeclaracaoEnquanto(declaracaoEnquanto) {
25880
+ let resultado = ' '.repeat(this.indentacao) + 'while ';
25881
+ const condicao = this.dicionarioConstrutos[declaracaoEnquanto.condicao.constructor.name](declaracaoEnquanto.condicao);
25882
+ resultado += condicao + ':\n';
25883
+ resultado += this.dicionarioDeclaracoes[declaracaoEnquanto.corpo.constructor.name](declaracaoEnquanto.corpo);
25884
+ return resultado;
25885
+ }
26026
25886
  traduzirDeclaracaoEscreva(declaracaoEscreva) {
26027
25887
  let resultado = 'print(';
26028
25888
  for (const argumento of declaracaoEscreva.argumentos) {
@@ -26045,7 +25905,7 @@ class TradutorPython {
26045
25905
  if (declaracaoFuncao.funcao.parametros.length > 0) {
26046
25906
  resultado = resultado.slice(0, -2);
26047
25907
  }
26048
- resultado += '):';
25908
+ resultado += '):\n';
26049
25909
  resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
26050
25910
  return resultado;
26051
25911
  }
@@ -26059,6 +25919,32 @@ class TradutorPython {
26059
25919
  resultado += ')';
26060
25920
  return resultado;
26061
25921
  }
25922
+ /**
25923
+ * Como não existe declaração `para` com variáveis de controle em Python, o
25924
+ * que tentamos aqui é criar a mesma coisa usando `while()`.
25925
+ * @param declaracaoPara A declaração `Para`.
25926
+ * @returns Um bloco equivalente ao que seria um bloco `for` com variáveis de controle em Python.
25927
+ */
25928
+ traduzirDeclaracaoPara(declaracaoPara) {
25929
+ let resultado = '';
25930
+ // Em uma declaração `Para` em Delégua, são obrigatórios a condição e o incremento.
25931
+ if (declaracaoPara.inicializador) {
25932
+ if (Array.isArray(declaracaoPara.inicializador)) {
25933
+ for (const declaracaoInicializador of declaracaoPara.inicializador) {
25934
+ resultado += this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
25935
+ }
25936
+ }
25937
+ else {
25938
+ resultado += this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + `\n`;
25939
+ }
25940
+ }
25941
+ const condicao = this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao);
25942
+ resultado += ' '.repeat(this.indentacao) + `while ${condicao}:\n`;
25943
+ // O incremento passa a ser a última instrução do bloco.
25944
+ declaracaoPara.corpo.declaracoes.push(new declaracoes_1.Expressao(declaracaoPara.incrementar));
25945
+ resultado += this.dicionarioDeclaracoes[declaracaoPara.corpo.constructor.name](declaracaoPara.corpo);
25946
+ return resultado;
25947
+ }
26062
25948
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
26063
25949
  let resultado = `for ${declaracaoParaCada.nomeVariavelIteracao} in `;
26064
25950
  resultado +=
@@ -26071,6 +25957,42 @@ class TradutorPython {
26071
25957
  const nomeConstrutor = declaracaoRetorna.valor.constructor.name;
26072
25958
  return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
26073
25959
  }
25960
+ traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
25961
+ let resultado = '';
25962
+ if (iniciarComIf) {
25963
+ resultado += 'if ';
25964
+ }
25965
+ else {
25966
+ resultado += 'elif ';
25967
+ }
25968
+ const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
25969
+ resultado += condicao;
25970
+ resultado += ':\n';
25971
+ resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
25972
+ if (declaracaoSe.caminhoSenao) {
25973
+ resultado += ' '.repeat(this.indentacao);
25974
+ const senao = declaracaoSe.caminhoSenao;
25975
+ if (senao === null || senao === void 0 ? void 0 : senao.caminhoEntao) {
25976
+ resultado += 'elif ';
25977
+ resultado += this.dicionarioConstrutos[senao.condicao.constructor.name](senao.condicao, false);
25978
+ resultado += ':\n';
25979
+ resultado += this.dicionarioDeclaracoes[senao.caminhoEntao.constructor.name](senao.caminhoEntao);
25980
+ resultado += ' '.repeat(this.indentacao);
25981
+ if (senao === null || senao === void 0 ? void 0 : senao.caminhoSenao) {
25982
+ if (senao.caminhoSenao instanceof declaracoes_1.Bloco) {
25983
+ resultado += 'else:\n';
25984
+ resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
25985
+ return resultado;
25986
+ }
25987
+ resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
25988
+ return resultado;
25989
+ }
25990
+ }
25991
+ resultado += 'else:\n';
25992
+ resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
25993
+ }
25994
+ return resultado;
25995
+ }
26074
25996
  traduzirDeclaracaoTente(declaracaoTente) {
26075
25997
  let resultado = 'try:\n';
26076
25998
  this.indentacao += 4;
@@ -26104,9 +26026,7 @@ class TradutorPython {
26104
26026
  return resultado;
26105
26027
  }
26106
26028
  traduzirDeclaracaoVar(declaracaoVar) {
26107
- let resultado = '';
26108
- resultado += this.traduzirNomeVariavel(declaracaoVar.simbolo.lexema);
26109
- resultado += ' = ';
26029
+ let resultado = declaracaoVar.simbolo.lexema + ' = ';
26110
26030
  const inicializador = declaracaoVar.inicializador;
26111
26031
  if (inicializador) {
26112
26032
  if (this.dicionarioConstrutos[inicializador.constructor.name]) {