@designliquido/delegua 1.7.0 → 1.7.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 (35) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  2. package/avaliador-sintatico/avaliador-sintatico.js +4 -1
  3. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  4. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +4 -0
  5. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +59 -28
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  8. package/bibliotecas/biblioteca-global.d.ts +11 -4
  9. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  10. package/bibliotecas/biblioteca-global.js +48 -19
  11. package/bibliotecas/biblioteca-global.js.map +1 -1
  12. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +10 -3
  13. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  14. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +46 -18
  15. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  16. package/bin/package.json +1 -1
  17. package/construtos/acesso-intervalo-variavel.d.ts +3 -2
  18. package/construtos/acesso-intervalo-variavel.d.ts.map +1 -1
  19. package/construtos/acesso-intervalo-variavel.js +5 -2
  20. package/construtos/acesso-intervalo-variavel.js.map +1 -1
  21. package/interpretador/comum.js +1 -1
  22. package/interpretador/comum.js.map +1 -1
  23. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  24. package/interpretador/dialetos/pitugues/comum.js +35 -6
  25. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  26. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +12 -0
  27. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  28. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +83 -0
  29. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  30. package/package.json +1 -1
  31. package/tradutores/tradutor-assemblyscript.d.ts +48 -2
  32. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  33. package/tradutores/tradutor-assemblyscript.js +535 -30
  34. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  35. package/umd/delegua.js +652 -81
@@ -12,7 +12,9 @@ class TradutorAssemblyScript {
12
12
  this.indentacao = 0;
13
13
  this.dicionarioConstrutos = {
14
14
  AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
15
+ AcessoMetodo: this.traduzirConstrutoAcessoMetodo.bind(this),
15
16
  AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodo.bind(this),
17
+ AcessoPropriedade: this.traduzirConstrutoAcessoPropriedade.bind(this),
16
18
  Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
17
19
  ArgumentoReferenciaFuncao: this.traduzirConstrutoArgumentoReferenciaFuncao.bind(this),
18
20
  AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
@@ -20,19 +22,34 @@ class TradutorAssemblyScript {
20
22
  Binario: this.traduzirConstrutoBinario.bind(this),
21
23
  Chamada: this.traduzirConstrutoChamada.bind(this),
22
24
  ComentarioComoConstruto: this.traduzirConstrutoComentario.bind(this),
25
+ Deceto: this.traduzirConstrutoDeceto.bind(this),
23
26
  DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
27
+ Dicionario: this.traduzirConstrutoDicionario.bind(this),
28
+ Dupla: this.traduzirConstrutoDupla.bind(this),
29
+ Elvis: this.traduzirConstrutoElvis.bind(this),
30
+ ExpressaoRegular: this.traduzirConstrutoExpressaoRegular.bind(this),
24
31
  FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
25
32
  Isto: () => 'this',
26
33
  Literal: this.traduzirConstrutoLiteral.bind(this),
27
34
  Logico: this.traduzirConstrutoLogico.bind(this),
35
+ Noneto: this.traduzirConstrutoNoneto.bind(this),
36
+ Octeto: this.traduzirConstrutoOcteto.bind(this),
37
+ Quarteto: this.traduzirConstrutoQuarteto.bind(this),
38
+ Quinteto: this.traduzirConstrutoQuinteto.bind(this),
28
39
  ReferenciaFuncao: this.traduzirConstrutoReferenciaFuncao.bind(this),
29
40
  Separador: this.traduzirConstrutoSeparador.bind(this),
41
+ SeTernario: this.traduzirConstrutoSeTernario.bind(this),
42
+ Sexteto: this.traduzirConstrutoSexteto.bind(this),
43
+ Septeto: this.traduzirConstrutoSepteto.bind(this),
30
44
  TipoDe: this.traduzirConstrutoTipoDe.bind(this),
45
+ Trio: this.traduzirConstrutoTrio.bind(this),
46
+ TuplaN: this.traduzirConstrutoTuplaN.bind(this),
31
47
  Unario: this.traduzirConstrutoUnario.bind(this),
32
48
  Variavel: this.traduzirConstrutoVariavel.bind(this),
33
49
  Vetor: this.traduzirConstrutoVetor.bind(this),
34
50
  };
35
51
  this.dicionarioDeclaracoes = {
52
+ Ajuda: this.traduzirDeclaracaoAjuda.bind(this),
36
53
  Bloco: this.traduzirDeclaracaoBloco.bind(this),
37
54
  Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
38
55
  Comentario: this.traduzirConstrutoComentario.bind(this),
@@ -52,8 +69,13 @@ class TradutorAssemblyScript {
52
69
  Classe: this.traduzirDeclaracaoClasse.bind(this),
53
70
  Tente: this.traduzirDeclaracaoTente.bind(this),
54
71
  Const: this.traduzirDeclaracaoConst.bind(this),
72
+ ConstMultiplo: this.traduzirDeclaracaoConstMultiplo.bind(this),
55
73
  Var: this.traduzirDeclaracaoVar.bind(this),
74
+ VarMultiplo: this.traduzirDeclaracaoVarMultiplo.bind(this),
56
75
  Escreva: this.traduzirDeclaracaoEscreva.bind(this),
76
+ EscrevaMesmaLinha: this.traduzirDeclaracaoEscrevaMesmaLinha.bind(this),
77
+ TendoComo: this.traduzirDeclaracaoTendoComo.bind(this),
78
+ TextoDocumentacao: this.traduzirDeclaracaoTextoDocumentacao.bind(this),
57
79
  };
58
80
  }
59
81
  traduzirSimboloOperador(operador) {
@@ -69,7 +91,7 @@ class TradutorAssemblyScript {
69
91
  case delegua_1.default.BIT_NOT:
70
92
  return '~';
71
93
  case delegua_1.default.DIFERENTE:
72
- return '!==';
94
+ return '!=';
73
95
  case delegua_1.default.DIVISAO:
74
96
  return '/';
75
97
  case delegua_1.default.E:
@@ -79,7 +101,7 @@ class TradutorAssemblyScript {
79
101
  case delegua_1.default.IGUAL:
80
102
  return '=';
81
103
  case delegua_1.default.IGUAL_IGUAL:
82
- return '===';
104
+ return '==';
83
105
  case delegua_1.default.MAIOR:
84
106
  return '>';
85
107
  case delegua_1.default.MAIOR_IGUAL:
@@ -100,6 +122,7 @@ class TradutorAssemblyScript {
100
122
  }
101
123
  traduzirFuncoesNativas(metodo) {
102
124
  switch (metodo.toLowerCase()) {
125
+ // Array methods
103
126
  case 'adicionar':
104
127
  case 'empilhar':
105
128
  return 'push';
@@ -108,6 +131,7 @@ class TradutorAssemblyScript {
108
131
  case 'fatiar':
109
132
  return 'slice';
110
133
  case 'inclui':
134
+ case 'incluido':
111
135
  return 'includes';
112
136
  case 'inverter':
113
137
  return 'reverse';
@@ -121,16 +145,126 @@ class TradutorAssemblyScript {
121
145
  return 'pop';
122
146
  case 'tamanho':
123
147
  return 'length';
148
+ case 'indice':
149
+ case 'indiceode':
150
+ return 'indexOf';
151
+ // String methods
124
152
  case 'maiusculo':
125
153
  return 'toUpperCase';
126
154
  case 'minusculo':
127
155
  return 'toLowerCase';
128
156
  case 'substituir':
129
157
  return 'replace';
158
+ case 'trimcomeco':
159
+ return 'trimStart';
160
+ case 'trimfim':
161
+ return 'trimEnd';
162
+ case 'trim':
163
+ return 'trim';
164
+ case 'comeca':
165
+ return 'startsWith';
166
+ case 'termina':
167
+ return 'endsWith';
168
+ case 'contém':
169
+ case 'contem':
170
+ return 'includes';
171
+ // Math constants and methods (would need Math. prefix in AS)
172
+ case 'abs':
173
+ case 'absoluto':
174
+ return 'Math.abs';
175
+ case 'ceil':
176
+ case 'teto':
177
+ return 'Math.ceil';
178
+ case 'floor':
179
+ case 'piso':
180
+ return 'Math.floor';
181
+ case 'round':
182
+ case 'arredondar':
183
+ return 'Math.round';
184
+ case 'sqrt':
185
+ case 'raizquadrada':
186
+ return 'Math.sqrt';
187
+ case 'pow':
188
+ case 'potencia':
189
+ return 'Math.pow';
190
+ case 'max':
191
+ case 'maximo':
192
+ return 'Math.max';
193
+ case 'min':
194
+ case 'minimo':
195
+ return 'Math.min';
196
+ case 'sin':
197
+ case 'seno':
198
+ return 'Math.sin';
199
+ case 'cos':
200
+ case 'cosseno':
201
+ return 'Math.cos';
202
+ case 'tan':
203
+ case 'tangente':
204
+ return 'Math.tan';
205
+ case 'pi':
206
+ return 'Math.PI';
207
+ case 'e':
208
+ return 'Math.E';
130
209
  default:
131
210
  return metodo;
132
211
  }
133
212
  }
213
+ traduzirFuncaoNativaGlobal(nomeFuncao, argumentos) {
214
+ switch (nomeFuncao.toLowerCase()) {
215
+ // Math functions
216
+ case 'aleatorio':
217
+ return `Math.random()`;
218
+ case 'aleatorioEntre':
219
+ case 'aleatorioente':
220
+ if (argumentos.length >= 2) {
221
+ return `(Math.random() * (${argumentos[1]} - ${argumentos[0]}) + ${argumentos[0]})`;
222
+ }
223
+ return null;
224
+ case 'arredondar':
225
+ return argumentos.length > 0 ? `Math.round(${argumentos[0]})` : null;
226
+ case 'inteiro':
227
+ return argumentos.length > 0 ? `Math.trunc(${argumentos[0]})` : null;
228
+ case 'numero':
229
+ return argumentos.length > 0 ? `Number(${argumentos[0]})` : null;
230
+ case 'texto':
231
+ return argumentos.length > 0 ? `String(${argumentos[0]})` : null;
232
+ case 'longo':
233
+ return argumentos.length > 0 ? `parseInt(${argumentos[0]})` : null;
234
+ case 'real':
235
+ return argumentos.length > 0 ? `parseFloat(${argumentos[0]})` : null;
236
+ // Array functions
237
+ case 'tamanho':
238
+ return argumentos.length > 0 ? `(${argumentos[0]}).length` : null;
239
+ case 'intervalo':
240
+ // intervalo(inicio, fim, passo?) - returns array of numbers
241
+ if (argumentos.length >= 2) {
242
+ if (argumentos.length >= 3) {
243
+ return `Array.from({length: (${argumentos[1]} - ${argumentos[0]}) / ${argumentos[2]}}, (_, i) => ${argumentos[0]} + i * ${argumentos[2]})`;
244
+ }
245
+ return `Array.from({length: ${argumentos[1]} - ${argumentos[0]}}, (_, i) => ${argumentos[0]} + i)`;
246
+ }
247
+ return null;
248
+ case 'maximo':
249
+ return argumentos.length > 0 ? `Math.max(...${argumentos[0]})` : null;
250
+ case 'minimo':
251
+ return argumentos.length > 0 ? `Math.min(...${argumentos[0]})` : null;
252
+ // These need custom implementation or are too complex for Phase 5
253
+ case 'mapear':
254
+ case 'filtrarPor':
255
+ case 'reduzir':
256
+ case 'ordenar':
257
+ case 'encontrar':
258
+ case 'encontrarIndice':
259
+ case 'incluido':
260
+ case 'todos':
261
+ case 'algum':
262
+ // These would require closures/lambda support - not easily translated
263
+ return null;
264
+ default:
265
+ return null;
266
+ }
267
+ }
134
268
  traduzirConstrutoArgumentoReferenciaFuncao(argumentoReferenciaFuncao, argumentos) {
135
269
  const argumentosResolvidos = [];
136
270
  for (const argumento of argumentos) {
@@ -155,7 +289,7 @@ class TradutorAssemblyScript {
155
289
  return `${separador.conteudo} `;
156
290
  }
157
291
  traduzirDeclaracaoEscreva(declaracaoEscreva) {
158
- let resultado = 'console.log(';
292
+ let resultado = 'trace(';
159
293
  for (const argumento of declaracaoEscreva.argumentos) {
160
294
  const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
161
295
  resultado += valor + ', ';
@@ -166,7 +300,7 @@ class TradutorAssemblyScript {
166
300
  }
167
301
  traduzirConstrutoLiteral(literal) {
168
302
  if (typeof literal.valor === 'string')
169
- return `'${literal.valor}'`;
303
+ return `"${literal.valor}"`;
170
304
  return String(literal.valor);
171
305
  }
172
306
  resolveTipoDeclaracaoVarEContante(tipo) {
@@ -174,25 +308,67 @@ class TradutorAssemblyScript {
174
308
  case 'texto':
175
309
  return ': string';
176
310
  case 'inteiro':
311
+ return ': i32';
312
+ case 'longo':
313
+ return ': i64';
314
+ case 'inteiro_curto':
315
+ case 'inteiroCurto':
316
+ return ': i16';
317
+ case 'byte':
318
+ return ': i8';
177
319
  case 'numero':
178
320
  case 'número':
179
321
  case 'real':
180
322
  return ': f64';
323
+ case 'real_curto':
324
+ case 'realCurto':
325
+ return ': f32';
181
326
  case 'logico':
182
327
  case 'lógico':
183
328
  return ': bool';
329
+ case 'vazio':
330
+ case 'nada':
331
+ return ': void';
184
332
  case 'nulo':
185
- return ': null';
333
+ throw new Error(`Tipo 'nulo' não é válido no AssemblyScript. Use 'Type | null' para tipos anuláveis.`);
186
334
  case 'inteiro[]':
335
+ return ': i32[]';
336
+ case 'longo[]':
337
+ return ': i64[]';
187
338
  case 'real[]':
339
+ case 'numero[]':
340
+ case 'número[]':
188
341
  return ': f64[]';
189
342
  case 'texto[]':
190
343
  return ': string[]';
191
344
  case 'logico[]':
192
345
  case 'lógico[]':
193
346
  return ': bool[]';
347
+ case 'dicionario':
348
+ case 'dicionário':
349
+ return ': Map<string, i32>';
350
+ case 'dupla':
351
+ return ': i32[]';
352
+ case 'trio':
353
+ return ': i32[]';
354
+ case 'quarteto':
355
+ return ': i32[]';
356
+ case 'quinteto':
357
+ return ': i32[]';
358
+ case 'sexteto':
359
+ return ': i32[]';
360
+ case 'septeto':
361
+ return ': i32[]';
362
+ case 'octeto':
363
+ return ': i32[]';
364
+ case 'noneto':
365
+ return ': i32[]';
366
+ case 'deceto':
367
+ return ': i32[]';
368
+ case 'tupla':
369
+ return ': i32[]';
194
370
  default:
195
- return ': any';
371
+ throw new Error(`Tipo não reconhecido ou não suportado no AssemblyScript: '${tipo}'. AssemblyScript requer anotações de tipo explícitas.`);
196
372
  }
197
373
  }
198
374
  traduzirDeclaracaoVar(declaracaoVar) {
@@ -232,7 +408,8 @@ class TradutorAssemblyScript {
232
408
  return resultado;
233
409
  }
234
410
  traduzirDeclaracaoTente(declaracaoTente) {
235
- let resultado = 'try {\n';
411
+ let resultado = '/* AVISO: AssemblyScript não suporta try/catch/finally. Este código pode não funcionar como esperado. */\n';
412
+ resultado += 'try {\n';
236
413
  this.indentacao += 4;
237
414
  resultado += ' '.repeat(this.indentacao);
238
415
  for (let condicao of declaracaoTente.caminhoTente) {
@@ -268,6 +445,81 @@ class TradutorAssemblyScript {
268
445
  }
269
446
  return resultado;
270
447
  }
448
+ traduzirDeclaracaoVarMultiplo(declaracaoVarMultiplo) {
449
+ const variaveis = declaracaoVarMultiplo.simbolos.map(s => s.lexema).join(', ');
450
+ let resultado = 'let ';
451
+ resultado += variaveis;
452
+ resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoVarMultiplo.tipo);
453
+ if (!(declaracaoVarMultiplo === null || declaracaoVarMultiplo === void 0 ? void 0 : declaracaoVarMultiplo.inicializador))
454
+ resultado += ';';
455
+ else {
456
+ resultado += ' = ';
457
+ if (this.dicionarioConstrutos[declaracaoVarMultiplo.inicializador.constructor.name]) {
458
+ resultado += this.dicionarioConstrutos[declaracaoVarMultiplo.inicializador.constructor.name](declaracaoVarMultiplo.inicializador);
459
+ }
460
+ else {
461
+ resultado += this.dicionarioDeclaracoes[declaracaoVarMultiplo.inicializador.constructor.name](declaracaoVarMultiplo.inicializador);
462
+ }
463
+ resultado += ';';
464
+ }
465
+ return resultado;
466
+ }
467
+ traduzirDeclaracaoConstMultiplo(declaracaoConstMultiplo) {
468
+ const constantes = declaracaoConstMultiplo.simbolos.map(s => s.lexema).join(', ');
469
+ let resultado = 'const ';
470
+ resultado += constantes;
471
+ resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoConstMultiplo.tipo);
472
+ if (!(declaracaoConstMultiplo === null || declaracaoConstMultiplo === void 0 ? void 0 : declaracaoConstMultiplo.inicializador))
473
+ resultado += ';';
474
+ else {
475
+ resultado += ' = ';
476
+ if (this.dicionarioConstrutos[declaracaoConstMultiplo.inicializador.constructor.name]) {
477
+ resultado += this.dicionarioConstrutos[declaracaoConstMultiplo.inicializador.constructor.name](declaracaoConstMultiplo.inicializador);
478
+ }
479
+ else {
480
+ resultado += this.dicionarioDeclaracoes[declaracaoConstMultiplo.inicializador.constructor.name](declaracaoConstMultiplo.inicializador);
481
+ }
482
+ resultado += ';';
483
+ }
484
+ return resultado;
485
+ }
486
+ traduzirDeclaracaoEscrevaMesmaLinha(declaracaoEscrevaMesmaLinha) {
487
+ let resultado = 'trace(';
488
+ for (const argumento of declaracaoEscrevaMesmaLinha.argumentos) {
489
+ const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
490
+ resultado += valor + ', ';
491
+ }
492
+ resultado = resultado.slice(0, -2);
493
+ resultado += ')';
494
+ return resultado;
495
+ }
496
+ traduzirDeclaracaoTendoComo(declaracaoTendoComo) {
497
+ // TendoComo is a resource management pattern (like try-with-resources in Java)
498
+ // AssemblyScript doesn't have built-in support, so we'll just treat it as a scope
499
+ let resultado = `// tendo ${declaracaoTendoComo.simboloVariavel.lexema} como recurso\n`;
500
+ resultado += ' '.repeat(this.indentacao);
501
+ resultado += `let ${declaracaoTendoComo.simboloVariavel.lexema} = `;
502
+ if (this.dicionarioConstrutos[declaracaoTendoComo.inicializacaoVariavel.constructor.name]) {
503
+ resultado += this.dicionarioConstrutos[declaracaoTendoComo.inicializacaoVariavel.constructor.name](declaracaoTendoComo.inicializacaoVariavel);
504
+ }
505
+ else {
506
+ resultado += this.dicionarioDeclaracoes[declaracaoTendoComo.inicializacaoVariavel.constructor.name](declaracaoTendoComo.inicializacaoVariavel);
507
+ }
508
+ resultado += ';\n';
509
+ resultado += ' '.repeat(this.indentacao);
510
+ resultado += this.dicionarioDeclaracoes[declaracaoTendoComo.corpo.constructor.name](declaracaoTendoComo.corpo);
511
+ return resultado;
512
+ }
513
+ traduzirDeclaracaoAjuda(declaracaoAjuda) {
514
+ // Ajuda is a help/documentation statement
515
+ // In AssemblyScript, we'll just comment it out
516
+ return '// ajuda' + '\n';
517
+ }
518
+ traduzirDeclaracaoTextoDocumentacao(declaracaoTextoDoc) {
519
+ // TextoDocumentacao is documentation text
520
+ // We'll convert it to a comment
521
+ return `/** ${declaracaoTextoDoc} */\n`;
522
+ }
271
523
  logicaComumBlocoEscopo(declaracoes) {
272
524
  let resultado = '{\n';
273
525
  this.indentacao += 4;
@@ -351,10 +603,38 @@ class TradutorAssemblyScript {
351
603
  return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
352
604
  }
353
605
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
354
- let resultado = `for (let ${declaracaoParaCada.variavelIteracao} of `;
606
+ // AssemblyScript não suporta for...of. Convertendo para loop baseado em índice.
607
+ if (declaracaoParaCada.variavelIteracao.constructor.name !== 'Variavel') {
608
+ throw new Error('Desestruturação em paraCada não é suportada no AssemblyScript. Use uma variável simples.');
609
+ }
610
+ const nomeVariavel = declaracaoParaCada.variavelIteracao.simbolo.lexema;
611
+ const nomeVetor = `__arr_${nomeVariavel}`;
612
+ let resultado = `const ${nomeVetor} = `;
355
613
  resultado +=
356
- this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + ') ';
357
- resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);
614
+ this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + ';';
615
+ resultado += '\n';
616
+ resultado += ' '.repeat(this.indentacao);
617
+ resultado += `for (let __i_${nomeVariavel} = 0; __i_${nomeVariavel} < ${nomeVetor}.length; __i_${nomeVariavel}++) `;
618
+ // Injeta a atribuição da variável de iteração no início do corpo do bloco
619
+ const corpoBloco = declaracaoParaCada.corpo;
620
+ const declaracoesCorpo = corpoBloco.declaracoes || [];
621
+ let resultadoCorpo = '{\n';
622
+ this.indentacao += 4;
623
+ resultadoCorpo += ' '.repeat(this.indentacao) + `const ${nomeVariavel} = ${nomeVetor}[__i_${nomeVariavel}];\n`;
624
+ for (const declaracaoOuConstruto of declaracoesCorpo) {
625
+ resultadoCorpo += ' '.repeat(this.indentacao);
626
+ const nomeConstrutor = declaracaoOuConstruto.constructor.name;
627
+ if (this.dicionarioConstrutos.hasOwnProperty(nomeConstrutor)) {
628
+ resultadoCorpo += this.dicionarioConstrutos[nomeConstrutor](declaracaoOuConstruto);
629
+ }
630
+ else {
631
+ resultadoCorpo += this.dicionarioDeclaracoes[nomeConstrutor](declaracaoOuConstruto);
632
+ }
633
+ resultadoCorpo += '\n';
634
+ }
635
+ this.indentacao -= 4;
636
+ resultadoCorpo += ' '.repeat(this.indentacao) + '}\n';
637
+ resultado += resultadoCorpo;
358
638
  return resultado;
359
639
  }
360
640
  traduzirDeclaracaoPara(declaracaoPara) {
@@ -383,19 +663,89 @@ class TradutorAssemblyScript {
383
663
  }
384
664
  traduzirDeclaracaoFuncao(declaracaoFuncao) {
385
665
  let resultado = 'function ';
386
- resultado += declaracaoFuncao.simbolo.lexema + ' (';
666
+ resultado += declaracaoFuncao.simbolo.lexema + '(';
667
+ // Adiciona parâmetros com tipos
387
668
  for (const parametro of declaracaoFuncao.funcao.parametros) {
388
- resultado += parametro.nome.lexema + ', ';
669
+ resultado += parametro.nome.lexema;
670
+ // Adiciona tipo do parâmetro se disponível
671
+ if (parametro.tipoDado) {
672
+ try {
673
+ resultado += this.resolveTipoDeclaracaoVarEContante(parametro.tipoDado);
674
+ }
675
+ catch (e) {
676
+ // Se não conseguir resolver o tipo, lança erro mais específico
677
+ throw new Error(`Parâmetro '${parametro.nome.lexema}' da função '${declaracaoFuncao.simbolo.lexema}' tem tipo não suportado: '${parametro.tipoDado}'`);
678
+ }
679
+ }
680
+ else {
681
+ // AssemblyScript requer tipos explícitos em todos os parâmetros
682
+ throw new Error(`Parâmetro '${parametro.nome.lexema}' da função '${declaracaoFuncao.simbolo.lexema}' não tem tipo definido. AssemblyScript requer tipos explícitos.`);
683
+ }
684
+ resultado += ', ';
389
685
  }
390
686
  if (declaracaoFuncao.funcao.parametros.length > 0) {
391
687
  resultado = resultado.slice(0, -2);
392
688
  }
393
- resultado += ') ';
689
+ resultado += ')';
690
+ // Adiciona tipo de retorno
691
+ const tipoRetorno = this.inferirTipoRetornoFuncao(declaracaoFuncao.funcao);
692
+ resultado += tipoRetorno;
693
+ resultado += ' ';
394
694
  resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
395
695
  return resultado;
396
696
  }
697
+ inferirTipoRetornoFuncao(funcao) {
698
+ // Se a função tem tipo de retorno explícito, usa ele
699
+ if (funcao.tipo && funcao.tipo !== 'qualquer') {
700
+ try {
701
+ return this.resolveTipoDeclaracaoVarEContante(funcao.tipo);
702
+ }
703
+ catch (e) {
704
+ // Se não conseguir resolver, retorna void por padrão
705
+ return ': void';
706
+ }
707
+ }
708
+ // Procura por declarações de retorno no corpo e infere tipo a partir delas
709
+ const tipoInferido = this.inferirTipoDeRetorno(funcao.corpo);
710
+ if (tipoInferido) {
711
+ try {
712
+ return this.resolveTipoDeclaracaoVarEContante(tipoInferido);
713
+ }
714
+ catch (e) {
715
+ return ': void';
716
+ }
717
+ }
718
+ return ': void';
719
+ }
720
+ inferirTipoDeRetorno(corpo) {
721
+ if (!corpo)
722
+ return null;
723
+ for (const declaracao of corpo) {
724
+ if (declaracao.constructor.name === 'Retorna') {
725
+ const retorna = declaracao;
726
+ if (retorna.tipo && retorna.tipo !== 'vazio') {
727
+ return retorna.tipo;
728
+ }
729
+ }
730
+ // Verifica recursivamente em blocos aninhados
731
+ if (declaracao.corpo) {
732
+ const corpoInterno = declaracao.corpo;
733
+ if (Array.isArray(corpoInterno)) {
734
+ const tipo = this.inferirTipoDeRetorno(corpoInterno);
735
+ if (tipo)
736
+ return tipo;
737
+ }
738
+ else if (corpoInterno.declaracoes) {
739
+ const tipo = this.inferirTipoDeRetorno(corpoInterno.declaracoes);
740
+ if (tipo)
741
+ return tipo;
742
+ }
743
+ }
744
+ }
745
+ return null;
746
+ }
397
747
  traduzirDeclaracaoFalhar(falhar) {
398
- return `throw '${falhar.explicacao.valor}'`;
748
+ return `abort('${falhar.explicacao.valor}')`;
399
749
  }
400
750
  traduzirDeclaracaoFazer(declaracaoFazer) {
401
751
  let resultado = 'do ';
@@ -474,6 +824,146 @@ class TradutorAssemblyScript {
474
824
  resultado += ']';
475
825
  return resultado;
476
826
  }
827
+ traduzirConstrutoDicionario(dicionario) {
828
+ // AssemblyScript Maps são inicializados via construtor
829
+ // Map<K, V>() requer: new Map<string, ValueType>()
830
+ if (!dicionario.chaves.length) {
831
+ return 'new Map<string, i32>()';
832
+ }
833
+ // AssemblyScript não suporta literal syntax para Map, precisa usar constructor
834
+ // Gerar algo como: { let m = new Map<string, i32>(); m.set("key", value); ... return m; }
835
+ let resultado = '(() => { let m = new Map<string, i32>(); ';
836
+ for (let i = 0; i < dicionario.chaves.length; i++) {
837
+ const chave = dicionario.chaves[i];
838
+ const valor = dicionario.valores[i];
839
+ // A chave pode ser um Construto (como Literal) ou um valor simples
840
+ let chaveStr;
841
+ if (typeof chave === 'string') {
842
+ chaveStr = `"${chave}"`;
843
+ }
844
+ else if (chave && chave.constructor && this.dicionarioConstrutos[chave.constructor.name]) {
845
+ // Se for um Construto, traduzi-lo
846
+ chaveStr = this.dicionarioConstrutos[chave.constructor.name](chave);
847
+ }
848
+ else {
849
+ // Fallback: converter para string
850
+ chaveStr = `"${String(chave)}"`;
851
+ }
852
+ resultado += `m.set(${chaveStr}, ${this.dicionarioConstrutos[valor.constructor.name](valor)}); `;
853
+ }
854
+ resultado += 'return m; })()';
855
+ return resultado;
856
+ }
857
+ traduzirConstrutoDupla(dupla) {
858
+ const primeiro = this.dicionarioConstrutos[dupla.primeiro.constructor.name](dupla.primeiro);
859
+ const segundo = this.dicionarioConstrutos[dupla.segundo.constructor.name](dupla.segundo);
860
+ return `[${primeiro}, ${segundo}]`;
861
+ }
862
+ traduzirConstrutoTrio(trio) {
863
+ const primeiro = this.dicionarioConstrutos[trio.primeiro.constructor.name](trio.primeiro);
864
+ const segundo = this.dicionarioConstrutos[trio.segundo.constructor.name](trio.segundo);
865
+ const terceiro = this.dicionarioConstrutos[trio.terceiro.constructor.name](trio.terceiro);
866
+ return `[${primeiro}, ${segundo}, ${terceiro}]`;
867
+ }
868
+ traduzirConstrutoQuarteto(quarteto) {
869
+ const primeiro = this.dicionarioConstrutos[quarteto.primeiro.constructor.name](quarteto.primeiro);
870
+ const segundo = this.dicionarioConstrutos[quarteto.segundo.constructor.name](quarteto.segundo);
871
+ const terceiro = this.dicionarioConstrutos[quarteto.terceiro.constructor.name](quarteto.terceiro);
872
+ const quarto = this.dicionarioConstrutos[quarteto.quarto.constructor.name](quarteto.quarto);
873
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}]`;
874
+ }
875
+ traduzirConstrutoQuinteto(quinteto) {
876
+ const primeiro = this.dicionarioConstrutos[quinteto.primeiro.constructor.name](quinteto.primeiro);
877
+ const segundo = this.dicionarioConstrutos[quinteto.segundo.constructor.name](quinteto.segundo);
878
+ const terceiro = this.dicionarioConstrutos[quinteto.terceiro.constructor.name](quinteto.terceiro);
879
+ const quarto = this.dicionarioConstrutos[quinteto.quarto.constructor.name](quinteto.quarto);
880
+ const quinto = this.dicionarioConstrutos[quinteto.quinto.constructor.name](quinteto.quinto);
881
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}]`;
882
+ }
883
+ traduzirConstrutoSexteto(sexteto) {
884
+ const primeiro = this.dicionarioConstrutos[sexteto.primeiro.constructor.name](sexteto.primeiro);
885
+ const segundo = this.dicionarioConstrutos[sexteto.segundo.constructor.name](sexteto.segundo);
886
+ const terceiro = this.dicionarioConstrutos[sexteto.terceiro.constructor.name](sexteto.terceiro);
887
+ const quarto = this.dicionarioConstrutos[sexteto.quarto.constructor.name](sexteto.quarto);
888
+ const quinto = this.dicionarioConstrutos[sexteto.quinto.constructor.name](sexteto.quinto);
889
+ const sexto = this.dicionarioConstrutos[sexteto.sexto.constructor.name](sexteto.sexto);
890
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}]`;
891
+ }
892
+ traduzirConstrutoSepteto(septeto) {
893
+ const primeiro = this.dicionarioConstrutos[septeto.primeiro.constructor.name](septeto.primeiro);
894
+ const segundo = this.dicionarioConstrutos[septeto.segundo.constructor.name](septeto.segundo);
895
+ const terceiro = this.dicionarioConstrutos[septeto.terceiro.constructor.name](septeto.terceiro);
896
+ const quarto = this.dicionarioConstrutos[septeto.quarto.constructor.name](septeto.quarto);
897
+ const quinto = this.dicionarioConstrutos[septeto.quinto.constructor.name](septeto.quinto);
898
+ const sexto = this.dicionarioConstrutos[septeto.sexto.constructor.name](septeto.sexto);
899
+ const setimo = this.dicionarioConstrutos[septeto.setimo.constructor.name](septeto.setimo);
900
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}]`;
901
+ }
902
+ traduzirConstrutoOcteto(octeto) {
903
+ const primeiro = this.dicionarioConstrutos[octeto.primeiro.constructor.name](octeto.primeiro);
904
+ const segundo = this.dicionarioConstrutos[octeto.segundo.constructor.name](octeto.segundo);
905
+ const terceiro = this.dicionarioConstrutos[octeto.terceiro.constructor.name](octeto.terceiro);
906
+ const quarto = this.dicionarioConstrutos[octeto.quarto.constructor.name](octeto.quarto);
907
+ const quinto = this.dicionarioConstrutos[octeto.quinto.constructor.name](octeto.quinto);
908
+ const sexto = this.dicionarioConstrutos[octeto.sexto.constructor.name](octeto.sexto);
909
+ const setimo = this.dicionarioConstrutos[octeto.setimo.constructor.name](octeto.setimo);
910
+ const oitavo = this.dicionarioConstrutos[octeto.oitavo.constructor.name](octeto.oitavo);
911
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}]`;
912
+ }
913
+ traduzirConstrutoNoneto(noneto) {
914
+ const primeiro = this.dicionarioConstrutos[noneto.primeiro.constructor.name](noneto.primeiro);
915
+ const segundo = this.dicionarioConstrutos[noneto.segundo.constructor.name](noneto.segundo);
916
+ const terceiro = this.dicionarioConstrutos[noneto.terceiro.constructor.name](noneto.terceiro);
917
+ const quarto = this.dicionarioConstrutos[noneto.quarto.constructor.name](noneto.quarto);
918
+ const quinto = this.dicionarioConstrutos[noneto.quinto.constructor.name](noneto.quinto);
919
+ const sexto = this.dicionarioConstrutos[noneto.sexto.constructor.name](noneto.sexto);
920
+ const setimo = this.dicionarioConstrutos[noneto.setimo.constructor.name](noneto.setimo);
921
+ const oitavo = this.dicionarioConstrutos[noneto.oitavo.constructor.name](noneto.oitavo);
922
+ const nono = this.dicionarioConstrutos[noneto.nono.constructor.name](noneto.nono);
923
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}]`;
924
+ }
925
+ traduzirConstrutoDeceto(deceto) {
926
+ const primeiro = this.dicionarioConstrutos[deceto.primeiro.constructor.name](deceto.primeiro);
927
+ const segundo = this.dicionarioConstrutos[deceto.segundo.constructor.name](deceto.segundo);
928
+ const terceiro = this.dicionarioConstrutos[deceto.terceiro.constructor.name](deceto.terceiro);
929
+ const quarto = this.dicionarioConstrutos[deceto.quarto.constructor.name](deceto.quarto);
930
+ const quinto = this.dicionarioConstrutos[deceto.quinto.constructor.name](deceto.quinto);
931
+ const sexto = this.dicionarioConstrutos[deceto.sexto.constructor.name](deceto.sexto);
932
+ const setimo = this.dicionarioConstrutos[deceto.setimo.constructor.name](deceto.setimo);
933
+ const oitavo = this.dicionarioConstrutos[deceto.oitavo.constructor.name](deceto.oitavo);
934
+ const nono = this.dicionarioConstrutos[deceto.nono.constructor.name](deceto.nono);
935
+ const decimo = this.dicionarioConstrutos[deceto.decimo.constructor.name](deceto.decimo);
936
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}, ${decimo}]`;
937
+ }
938
+ traduzirConstrutoTuplaN(tuplaN) {
939
+ const elementos = tuplaN.elementos.map(elemento => this.dicionarioConstrutos[elemento.constructor.name](elemento));
940
+ return `[${elementos.join(', ')}]`;
941
+ }
942
+ traduzirConstrutoSeTernario(seTernario) {
943
+ const condicao = this.dicionarioConstrutos[seTernario.condicao.constructor.name](seTernario.condicao);
944
+ const expressaoSe = this.dicionarioConstrutos[seTernario.expressaoSe.constructor.name](seTernario.expressaoSe);
945
+ const expressaoSenao = this.dicionarioConstrutos[seTernario.expressaoSenao.constructor.name](seTernario.expressaoSenao);
946
+ return `${condicao} ? ${expressaoSe} : ${expressaoSenao}`;
947
+ }
948
+ traduzirConstrutoElvis(elvis) {
949
+ const esquerda = this.dicionarioConstrutos[elvis.esquerda.constructor.name](elvis.esquerda);
950
+ const direita = this.dicionarioConstrutos[elvis.direita.constructor.name](elvis.direita);
951
+ // Elvis operator (?:) is equivalent to || in JavaScript for null-coalescing
952
+ return `${esquerda} || ${direita}`;
953
+ }
954
+ traduzirConstrutoAcessoPropriedade(acessoPropriedade) {
955
+ const objeto = this.dicionarioConstrutos[acessoPropriedade.objeto.constructor.name](acessoPropriedade.objeto);
956
+ return `${objeto}.${acessoPropriedade.nomePropriedade}`;
957
+ }
958
+ traduzirConstrutoExpressaoRegular(expressaoRegular) {
959
+ // AssemblyScript doesn't have native regex support like JavaScript
960
+ // Return the pattern as a string for now
961
+ const valor = expressaoRegular.valor;
962
+ if (typeof valor === 'string') {
963
+ return `"${valor}"`;
964
+ }
965
+ return String(valor);
966
+ }
477
967
  traduzirConstrutoVariavel(variavel) {
478
968
  return variavel.simbolo.lexema;
479
969
  }
@@ -491,20 +981,13 @@ class TradutorAssemblyScript {
491
981
  return resultado;
492
982
  }
493
983
  traduzirConstrutoTipoDe(tipoDe) {
494
- let resultado = 'typeof ';
495
- if (typeof tipoDe.valor === 'string')
496
- resultado += `'${tipoDe.valor}'`;
497
- else if (tipoDe.valor instanceof construtos_1.Vetor)
498
- resultado += this.traduzirConstrutoVetor(tipoDe.valor);
499
- else
500
- resultado += this.dicionarioConstrutos[tipoDe.valor.constructor.name](tipoDe.valor);
501
- return resultado;
984
+ throw new Error('O operador typeof não é suportado no AssemblyScript. Use verificações de tipo em tempo de compilação como instanceof ou is<T>() em vez disso.');
502
985
  }
503
986
  traduzirConstrutoLogico(logico) {
504
- let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
505
- let operador = this.traduzirSimboloOperador(logico.operador);
506
987
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
507
- return `${direita} ${operador} ${esquerda}`;
988
+ let operador = this.traduzirSimboloOperador(logico.operador);
989
+ let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
990
+ return `${esquerda} ${operador} ${direita}`;
508
991
  }
509
992
  traduzirFuncaoConstruto(funcaoConstruto) {
510
993
  let resultado = 'function(';
@@ -529,6 +1012,15 @@ class TradutorAssemblyScript {
529
1012
  }
530
1013
  traduzirConstrutoChamada(chamada) {
531
1014
  let resultado = '';
1015
+ // Check if this is a native library function call
1016
+ if (chamada.entidadeChamada instanceof construtos_1.Variavel) {
1017
+ const nomeVariavel = chamada.entidadeChamada.simbolo.lexema;
1018
+ const argumentosTexto = chamada.argumentos.map(arg => this.dicionarioConstrutos[arg.constructor.name](arg));
1019
+ const funcaoNativa = this.traduzirFuncaoNativaGlobal(nomeVariavel, argumentosTexto);
1020
+ if (funcaoNativa) {
1021
+ return funcaoNativa;
1022
+ }
1023
+ }
532
1024
  const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
533
1025
  const instanciaClasse = this.declaracoesDeClasses.some((declaracao) => { var _a; return ((_a = declaracao === null || declaracao === void 0 ? void 0 : declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) === retorno; });
534
1026
  if (instanciaClasse) {
@@ -564,6 +1056,12 @@ class TradutorAssemblyScript {
564
1056
  return resultado;
565
1057
  }
566
1058
  traduzirConstrutoBinario(binario) {
1059
+ // Tratamento especial para exponenciação no AssemblyScript
1060
+ if (binario.operador.tipo === delegua_1.default.EXPONENCIACAO) {
1061
+ const esquerda = this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
1062
+ const direita = this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
1063
+ return `Math.pow(${esquerda}, ${direita})`;
1064
+ }
567
1065
  let resultado = '';
568
1066
  if (binario.esquerda.constructor.name === 'Agrupamento')
569
1067
  resultado +=
@@ -589,16 +1087,23 @@ class TradutorAssemblyScript {
589
1087
  ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
590
1088
  return resultado;
591
1089
  }
592
- // TODO: Eliminar o soft cast para `any`.
593
1090
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
594
- var _a;
595
1091
  let resultado = '';
596
- resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
1092
+ // Traduz o objeto (array ou coleção)
1093
+ if (AtribuicaoPorIndice.objeto instanceof construtos_1.Variavel) {
1094
+ resultado += AtribuicaoPorIndice.objeto.simbolo.lexema;
1095
+ }
1096
+ else {
1097
+ resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.objeto.constructor.name](AtribuicaoPorIndice.objeto);
1098
+ }
1099
+ // Adiciona o índice
1100
+ resultado += '[';
597
1101
  resultado +=
598
1102
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
599
1103
  resultado += ' = ';
600
- if ((_a = (AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor).simbolo) === null || _a === void 0 ? void 0 : _a.lexema) {
601
- resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
1104
+ // Traduz o valor a ser atribuído
1105
+ if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
1106
+ resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
602
1107
  }
603
1108
  else {
604
1109
  resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);