@designliquido/delegua 1.7.0 → 1.7.2

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 +7 -1
  5. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +80 -46
  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 +673 -99
package/umd/delegua.js CHANGED
@@ -3854,8 +3854,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3854
3854
  this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('texto', 'texto', true, [
3855
3855
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
3856
3856
  ]));
3857
+ this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
3858
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer')
3859
+ ]));
3857
3860
  this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
3858
- new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
3861
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
3859
3862
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
3860
3863
  ]));
3861
3864
  this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
@@ -4707,6 +4710,7 @@ class AvaliadorSintaticoPitugues {
4707
4710
  this.atual = 0;
4708
4711
  this.blocos = 0;
4709
4712
  this.performance = performance;
4713
+ this.intuirTipoQualquerParaIdentificadores = false;
4710
4714
  this.escopos = [];
4711
4715
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
4712
4716
  this.primitivasConhecidas = {};
@@ -5107,17 +5111,22 @@ class AvaliadorSintaticoPitugues {
5107
5111
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
5108
5112
  return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 0, 'qualquer[]');
5109
5113
  }
5110
- if (this.simbolos[this.atual].tipo == 'IDENTIFICADOR' &&
5111
- !this.verificarTipoProximoSimbolo(pitugues_2.default.VIRGULA)) {
5112
- return this.resolverCompreensaoDeLista();
5114
+ // Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
5115
+ // de lista serão tratados como 'qualquer', para evitar erros de tipo.
5116
+ this.intuirTipoQualquerParaIdentificadores = true;
5117
+ const retornoExpressaoOuPrimeiroValor = await this.seTernario();
5118
+ this.intuirTipoQualquerParaIdentificadores = false;
5119
+ if (this.simbolos[this.atual].tipo === pitugues_2.default.PARA) {
5120
+ return await this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
5113
5121
  }
5114
- const valoresVetor = [];
5122
+ // Aqui sabemos que não é uma compreensão de lista.
5123
+ const valoresVetor = [retornoExpressaoOuPrimeiroValor];
5115
5124
  while (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
5116
- const valor = await this.atribuir();
5117
- valoresVetor.push(valor);
5118
5125
  if (this.simbolos[this.atual].tipo !== pitugues_2.default.COLCHETE_DIREITO) {
5119
5126
  this.consumir(pitugues_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
5120
5127
  }
5128
+ const valor = await this.atribuir();
5129
+ valoresVetor.push(valor);
5121
5130
  }
5122
5131
  const tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresVetor);
5123
5132
  return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, valoresVetor, valoresVetor.length, tipoVetor);
@@ -5159,7 +5168,13 @@ class AvaliadorSintaticoPitugues {
5159
5168
  case pitugues_2.default.IDENTIFICADOR:
5160
5169
  const simboloIdentificador = this.avancarEDevolverAnterior();
5161
5170
  let tipoOperando;
5162
- if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
5171
+ if (this.intuirTipoQualquerParaIdentificadores) {
5172
+ // Esta indicação é utilizada para compreensões de lista, onde o
5173
+ // tipo do identificador de iteração é 'qualquer' por definição.
5174
+ tipoOperando = 'qualquer';
5175
+ this.pilhaEscopos.definirInformacoesVariavel(simboloIdentificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloIdentificador.lexema, 'qualquer'));
5176
+ }
5177
+ else if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
5163
5178
  tipoOperando = simboloIdentificador.lexema;
5164
5179
  }
5165
5180
  else {
@@ -5247,26 +5262,27 @@ class AvaliadorSintaticoPitugues {
5247
5262
  expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
5248
5263
  }
5249
5264
  else if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_ESQUERDO)) {
5265
+ const inicio = !this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)
5266
+ ? await this.expressao()
5267
+ : null;
5250
5268
  let ehFatiamento = false;
5251
- let indiceInicio = null;
5252
- let indiceFim = null;
5253
- if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)) {
5254
- indiceInicio = await this.expressao();
5255
- }
5269
+ let fim = null;
5270
+ let passo = null;
5256
5271
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)) {
5257
5272
  ehFatiamento = true;
5258
- // Se o próximo não é ':', nem ']', então é o índice fim
5259
- if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS) &&
5260
- !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO)) {
5261
- indiceFim = await this.expressao();
5262
- }
5273
+ if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)
5274
+ && !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
5275
+ fim = await this.expressao();
5276
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)
5277
+ && !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
5278
+ passo = await this.expressao();
5263
5279
  }
5264
5280
  const simboloFechamento = this.consumir(pitugues_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
5265
5281
  if (ehFatiamento) {
5266
- expressao = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressao, indiceInicio, indiceFim, simboloFechamento);
5282
+ expressao = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressao, inicio, fim, passo, simboloFechamento);
5267
5283
  }
5268
5284
  else {
5269
- expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indiceInicio, simboloFechamento);
5285
+ expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, inicio, simboloFechamento);
5270
5286
  }
5271
5287
  }
5272
5288
  else {
@@ -5623,34 +5639,61 @@ class AvaliadorSintaticoPitugues {
5623
5639
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
5624
5640
  }
5625
5641
  async declaracaoPara() {
5642
+ const simboloPara = this.simboloAnterior();
5643
+ this.blocos += 1;
5626
5644
  try {
5627
- const simboloPara = this.simboloAnterior();
5628
- this.blocos += 1;
5629
5645
  this.consumir(pitugues_2.default.CADA, `Esperado palavra reservada 'cada' após 'para'. Atual: ${this.simbolos[this.atual].lexema}.`);
5630
- const nomeVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
5646
+ const primeiraVariavel = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
5647
+ let simboloSegundaVariavel = null;
5648
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.VIRGULA)) {
5649
+ simboloSegundaVariavel = this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado identificador após a vírgula.');
5650
+ }
5651
+ let variavelIteracao;
5652
+ const v1 = new construtos_1.Variavel(this.hashArquivo, primeiraVariavel, 'qualquer');
5653
+ if (simboloSegundaVariavel) {
5654
+ const v2 = new construtos_1.Variavel(this.hashArquivo, simboloSegundaVariavel, 'qualquer');
5655
+ variavelIteracao = new construtos_1.Dupla(v1, v2);
5656
+ }
5657
+ else {
5658
+ variavelIteracao = v1;
5659
+ }
5631
5660
  if (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DE, pitugues_2.default.EM)) {
5632
5661
  throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
5633
5662
  }
5634
- const vetor = await this.expressao();
5635
- if (!vetor.hasOwnProperty('tipo')) {
5636
- throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece possuir um tipo iterável.`);
5637
- }
5638
- const tipoVetor = vetor.tipo;
5639
- if (!tipoVetor.endsWith('[]') && !['qualquer', 'texto', 'vetor'].includes(tipoVetor)) {
5640
- throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
5663
+ const alvoIteracao = await this.expressao();
5664
+ this.validarSeAlvoEIteravel(simboloPara, alvoIteracao, !!simboloSegundaVariavel);
5665
+ this.pilhaEscopos.definirInformacoesVariavel(primeiraVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(primeiraVariavel.lexema, 'qualquer'));
5666
+ if (simboloSegundaVariavel) {
5667
+ this.pilhaEscopos.definirInformacoesVariavel(simboloSegundaVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloSegundaVariavel.lexema, 'qualquer'));
5641
5668
  }
5642
- this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
5643
5669
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
5644
5670
  const corpo = await this.resolverDeclaracao();
5645
- return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
5646
- }
5647
- catch (erro) {
5648
- throw erro;
5671
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, alvoIteracao, corpo);
5649
5672
  }
5650
5673
  finally {
5651
5674
  this.blocos -= 1;
5652
5675
  }
5653
5676
  }
5677
+ /**
5678
+ * Função auxiliar para validar se o alvo pode ser iterado.
5679
+ */
5680
+ validarSeAlvoEIteravel(simboloPara, alvo, temDuasVariaveis) {
5681
+ if (!alvo || !alvo.tipo)
5682
+ return;
5683
+ const tipo = alvo.tipo;
5684
+ const tiposValidos = ['qualquer', 'vetor', 'dicionário', 'texto'];
5685
+ const eVetor = tipo.endsWith('[]') || tipo === 'vetor';
5686
+ if (temDuasVariaveis) {
5687
+ if (!eVetor && tipo !== 'dicionário' && tipo !== 'qualquer') {
5688
+ throw this.erro(simboloPara, `Para iterar com duas variáveis, o objeto deve ser um dicionário ou lista. Tipo atual: ${tipo}.`);
5689
+ }
5690
+ }
5691
+ else {
5692
+ if (!eVetor && !tiposValidos.includes(tipo)) {
5693
+ throw this.erro(simboloPara, `O objeto do tipo '${tipo}' não é iterável.`);
5694
+ }
5695
+ }
5696
+ }
5654
5697
  async declaracaoSe() {
5655
5698
  const condicao = await this.expressao();
5656
5699
  const caminhoEntao = await this.resolverDeclaracao();
@@ -5789,19 +5832,10 @@ class AvaliadorSintaticoPitugues {
5789
5832
  }
5790
5833
  /**
5791
5834
  * Resolve uma lista de compreensão.
5835
+ * @param retornoExpressao A expressão já resolvida que representa o valor a ser retornado.
5792
5836
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
5793
5837
  */
5794
- async resolverCompreensaoDeLista() {
5795
- // TODO: Se expressão não começar com um identificador, por exemplo `3 * x`, como faríamos para
5796
- // aceitar o `x` na avaliação da expressão?
5797
- if (this.simbolos[this.atual].tipo === pitugues_2.default.IDENTIFICADOR) {
5798
- // Antes de avaliar a condição, precisamos registrar a variável de iteração.
5799
- const simboloVariavelIteracao = this.simbolos[this.atual];
5800
- this.pilhaEscopos.definirInformacoesVariavel(simboloVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloVariavelIteracao.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
5801
- );
5802
- }
5803
- // TODO: Reavaliar a precedência do se ternário.
5804
- const retornoExpressao = await this.ou();
5838
+ async resolverCompreensaoDeLista(retornoExpressao) {
5805
5839
  this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificado.");
5806
5840
  this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
5807
5841
  const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
@@ -6159,8 +6193,11 @@ class AvaliadorSintaticoPitugues {
6159
6193
  this.pilhaEscopos.definirInformacoesVariavel('tipo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tipo', 'qualquer', true, [
6160
6194
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('elemento', 'qualquer'),
6161
6195
  ]));
6196
+ this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
6197
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer')
6198
+ ]));
6162
6199
  this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
6163
- new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
6200
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
6164
6201
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
6165
6202
  ]));
6166
6203
  this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
@@ -8952,6 +8989,7 @@ exports.reduzir = reduzir;
8952
8989
  exports.somar = somar;
8953
8990
  exports.tamanho = tamanho;
8954
8991
  exports.texto = texto;
8992
+ exports.todos = todos;
8955
8993
  exports.todosEmCondicao = todosEmCondicao;
8956
8994
  exports.tupla = tupla;
8957
8995
  exports.vetor = vetor;
@@ -9949,40 +9987,68 @@ async function tamanho(interpretador, objeto) {
9949
9987
  async function texto(interpretador, valorParaConverter) {
9950
9988
  return Promise.resolve(`${valorParaConverter.hasOwnProperty('valor') ? valorParaConverter.valor : valorParaConverter}`);
9951
9989
  }
9990
+ /**
9991
+ * Retorna verdadeiro se todos os elementos do iterável forem truly.
9992
+ * @param {InterpretadorInterface} interpretador A instância do interpretador.
9993
+ * @param {VariavelInterface | any} iteravel O primeiro parâmetro, qualquer dado que seja iterável (vetores, tuplas, dicionários etc.).
9994
+ * @returns {Promise<boolean>} Verdadeiro, se todos os valores do iterável forem Truly.
9995
+ */
9996
+ async function todos(interpretador, iteravel) {
9997
+ const valorIteravel = interpretador.resolverValor(iteravel);
9998
+ const ehObjetoOuDicionario = valorIteravel && typeof valorIteravel === 'object' && !Array.isArray(valorIteravel);
9999
+ const ehIteravelNativo = valorIteravel && typeof valorIteravel[Symbol.iterator] === 'function';
10000
+ if (!ehIteravelNativo && !ehObjetoOuDicionario) {
10001
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10002
+ hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
10003
+ linha: interpretador.linhaDeclaracaoAtual,
10004
+ }, 'Parâmetro inválido. O primeiro parâmetro deve ser um iterável.'));
10005
+ }
10006
+ const itens = ehIteravelNativo ? valorIteravel : Object.values(valorIteravel);
10007
+ for (const valor of itens) {
10008
+ const valorResolvido = interpretador.resolverValor(valor);
10009
+ if (!interpretador.eVerdadeiro(valorResolvido))
10010
+ return false;
10011
+ }
10012
+ return true;
10013
+ }
9952
10014
  /**
9953
10015
  * Retorna verdadeiro se todos os elementos do primeiro parâmetro retornam verdadeiro ao
9954
10016
  * serem aplicados como argumentos da função passada como segundo parâmetro.
9955
10017
  * @param {InterpretadorInterface} interpretador A instância do interpretador.
9956
- * @param {VariavelInterface | any} vetor O primeiro parâmetro, um vetor.
10018
+ * @param {VariavelInterface | any} iteravel O primeiro parâmetro, qualquer dado que seja iterável (vetores, tuplas, dicionários etc.).
9957
10019
  * @param {VariavelInterface | any} funcaoCondicional A função que será executada com cada
9958
- * valor do vetor passado como primeiro parâmetro.
9959
- * @returns {Promise<boolean>} Verdadeiro, se todos os valores do vetor fazem a função passada
10020
+ * valor do iterável passado como primeiro parâmetro.
10021
+ * @returns {Promise<boolean>} Verdadeiro, se todos os valores do iterável fazem a função passada
9960
10022
  * por parâmetro devolver verdadeiro, ou falso em caso contrário.
9961
10023
  */
9962
- async function todosEmCondicao(interpretador, vetor, funcaoCondicional) {
9963
- if (vetor === null || vetor === undefined)
9964
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9965
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9966
- linha: interpretador.linhaDeclaracaoAtual,
9967
- }, 'Parâmetro inválido. O primeiro parâmetro da função todosEmCondicao() não pode ser nulo.'));
9968
- const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
9969
- const valorFuncaoCondicional = funcaoCondicional.hasOwnProperty('valor')
9970
- ? funcaoCondicional.valor
9971
- : funcaoCondicional;
9972
- if (!Array.isArray(valorVetor)) {
10024
+ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
10025
+ const simboloChamada = {
10026
+ linha: interpretador.linhaDeclaracaoAtual,
10027
+ hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
10028
+ };
10029
+ const valorIteravel = interpretador.resolverValor(iteravel);
10030
+ const ehObjetoOuDicionario = valorIteravel && typeof valorIteravel === 'object' && !Array.isArray(valorIteravel);
10031
+ const ehIteravelNativo = valorIteravel && typeof valorIteravel[Symbol.iterator] === 'function';
10032
+ if (!ehIteravelNativo && !ehObjetoOuDicionario) {
9973
10033
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9974
10034
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9975
10035
  linha: interpretador.linhaDeclaracaoAtual,
9976
- }, 'Parâmetro inválido. O primeiro parâmetro da função todosEmCondicao() deve ser um vetor.'));
10036
+ }, 'Parâmetro inválido. O primeiro parâmetro deve ser um iterável.'));
9977
10037
  }
9978
- if (valorFuncaoCondicional.constructor !== estruturas_1.DeleguaFuncao) {
10038
+ const valorFuncao = interpretador.resolverValor(funcaoCondicional);
10039
+ const ehFuncaoValida = valorFuncao instanceof estruturas_1.DeleguaFuncao ||
10040
+ valorFuncao instanceof funcao_padrao_1.FuncaoPadrao;
10041
+ if (!ehFuncaoValida) {
9979
10042
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9980
10043
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9981
10044
  linha: interpretador.linhaDeclaracaoAtual,
9982
- }, 'Parâmetro inválido. O segundo parâmetro da função todosEmCondicao() deve ser uma função.'));
10045
+ }, 'Parâmetro inválido. O segundo parâmetro deve ser uma função.'));
9983
10046
  }
9984
- for (let indice = 0; indice < valorVetor.length; ++indice) {
9985
- if (!(await valorFuncaoCondicional.chamar(interpretador, [valorVetor[indice]])))
10047
+ const itens = ehIteravelNativo ? valorIteravel : Object.values(valorIteravel);
10048
+ for (const valor of itens) {
10049
+ const resultadoChamada = await valorFuncao.chamar(interpretador, [valor], simboloChamada);
10050
+ const resultadoResolvido = interpretador.resolverValor(resultadoChamada);
10051
+ if (!interpretador.eVerdadeiro(resultadoResolvido))
9986
10052
  return false;
9987
10053
  }
9988
10054
  return true;
@@ -11015,16 +11081,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
11015
11081
  exports.AcessoIntervaloVariavel = void 0;
11016
11082
  /**
11017
11083
  * Construto para acesso de intervalos (fatiamento/slicing) em vetores.
11018
- * Ex: vetor[1:4], vetor[1:], vetor[:3] ou vetor[:]
11084
+ * Ex: vetor[1:4], vetor[1:4:2], vetor[1:], vetor[:3] ou vetor[:]
11019
11085
  */
11020
11086
  class AcessoIntervaloVariavel {
11021
- constructor(hashArquivo, entidadeChamada, indiceInicio, indiceFim, simboloFechamento, tipo = 'qualquer') {
11087
+ constructor(hashArquivo, entidadeChamada, indiceInicio, indiceFim, indicePasso, simboloFechamento, tipo = 'qualquer') {
11022
11088
  this.tipo = 'qualquer';
11023
11089
  this.linha = entidadeChamada.linha;
11024
11090
  this.hashArquivo = hashArquivo;
11025
11091
  this.entidadeChamada = entidadeChamada;
11026
11092
  this.indiceInicio = indiceInicio;
11027
11093
  this.indiceFim = indiceFim;
11094
+ this.indicePasso = indicePasso;
11028
11095
  this.simboloFechamento = simboloFechamento;
11029
11096
  this.tipo = tipo;
11030
11097
  }
@@ -11034,9 +11101,11 @@ class AcessoIntervaloVariavel {
11034
11101
  paraTexto() {
11035
11102
  const inicio = this.indiceInicio ? this.indiceInicio.paraTexto() : 'sem-início';
11036
11103
  const fim = this.indiceFim ? this.indiceFim.paraTexto() : 'sem-fim';
11104
+ const passo = this.indicePasso ? this.indicePasso.paraTexto() : 'sem-passo';
11037
11105
  return (`<acesso-índice-variável entidadeChamada=${this.entidadeChamada.paraTexto()} ` +
11038
11106
  `inicio=${inicio} ` +
11039
11107
  `fim=${fim}` +
11108
+ `passo=${passo}` +
11040
11109
  `/>`);
11041
11110
  }
11042
11111
  paraTextoSaida() {
@@ -15775,7 +15844,7 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
15775
15844
  pilhaEscoposExecucao.definirVariavel('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
15776
15845
  pilhaEscoposExecucao.definirVariavel('tamanho', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tamanho));
15777
15846
  pilhaEscoposExecucao.definirVariavel('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
15778
- pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
15847
+ pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
15779
15848
  pilhaEscoposExecucao.definirVariavel('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
15780
15849
  pilhaEscoposExecucao.definirVariavel('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
15781
15850
  pilhaEscoposExecucao.definirVariavel('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
@@ -39287,7 +39356,9 @@ class TradutorAssemblyScript {
39287
39356
  this.indentacao = 0;
39288
39357
  this.dicionarioConstrutos = {
39289
39358
  AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
39359
+ AcessoMetodo: this.traduzirConstrutoAcessoMetodo.bind(this),
39290
39360
  AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodo.bind(this),
39361
+ AcessoPropriedade: this.traduzirConstrutoAcessoPropriedade.bind(this),
39291
39362
  Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
39292
39363
  ArgumentoReferenciaFuncao: this.traduzirConstrutoArgumentoReferenciaFuncao.bind(this),
39293
39364
  AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
@@ -39295,19 +39366,34 @@ class TradutorAssemblyScript {
39295
39366
  Binario: this.traduzirConstrutoBinario.bind(this),
39296
39367
  Chamada: this.traduzirConstrutoChamada.bind(this),
39297
39368
  ComentarioComoConstruto: this.traduzirConstrutoComentario.bind(this),
39369
+ Deceto: this.traduzirConstrutoDeceto.bind(this),
39298
39370
  DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
39371
+ Dicionario: this.traduzirConstrutoDicionario.bind(this),
39372
+ Dupla: this.traduzirConstrutoDupla.bind(this),
39373
+ Elvis: this.traduzirConstrutoElvis.bind(this),
39374
+ ExpressaoRegular: this.traduzirConstrutoExpressaoRegular.bind(this),
39299
39375
  FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
39300
39376
  Isto: () => 'this',
39301
39377
  Literal: this.traduzirConstrutoLiteral.bind(this),
39302
39378
  Logico: this.traduzirConstrutoLogico.bind(this),
39379
+ Noneto: this.traduzirConstrutoNoneto.bind(this),
39380
+ Octeto: this.traduzirConstrutoOcteto.bind(this),
39381
+ Quarteto: this.traduzirConstrutoQuarteto.bind(this),
39382
+ Quinteto: this.traduzirConstrutoQuinteto.bind(this),
39303
39383
  ReferenciaFuncao: this.traduzirConstrutoReferenciaFuncao.bind(this),
39304
39384
  Separador: this.traduzirConstrutoSeparador.bind(this),
39385
+ SeTernario: this.traduzirConstrutoSeTernario.bind(this),
39386
+ Sexteto: this.traduzirConstrutoSexteto.bind(this),
39387
+ Septeto: this.traduzirConstrutoSepteto.bind(this),
39305
39388
  TipoDe: this.traduzirConstrutoTipoDe.bind(this),
39389
+ Trio: this.traduzirConstrutoTrio.bind(this),
39390
+ TuplaN: this.traduzirConstrutoTuplaN.bind(this),
39306
39391
  Unario: this.traduzirConstrutoUnario.bind(this),
39307
39392
  Variavel: this.traduzirConstrutoVariavel.bind(this),
39308
39393
  Vetor: this.traduzirConstrutoVetor.bind(this),
39309
39394
  };
39310
39395
  this.dicionarioDeclaracoes = {
39396
+ Ajuda: this.traduzirDeclaracaoAjuda.bind(this),
39311
39397
  Bloco: this.traduzirDeclaracaoBloco.bind(this),
39312
39398
  Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
39313
39399
  Comentario: this.traduzirConstrutoComentario.bind(this),
@@ -39327,8 +39413,13 @@ class TradutorAssemblyScript {
39327
39413
  Classe: this.traduzirDeclaracaoClasse.bind(this),
39328
39414
  Tente: this.traduzirDeclaracaoTente.bind(this),
39329
39415
  Const: this.traduzirDeclaracaoConst.bind(this),
39416
+ ConstMultiplo: this.traduzirDeclaracaoConstMultiplo.bind(this),
39330
39417
  Var: this.traduzirDeclaracaoVar.bind(this),
39418
+ VarMultiplo: this.traduzirDeclaracaoVarMultiplo.bind(this),
39331
39419
  Escreva: this.traduzirDeclaracaoEscreva.bind(this),
39420
+ EscrevaMesmaLinha: this.traduzirDeclaracaoEscrevaMesmaLinha.bind(this),
39421
+ TendoComo: this.traduzirDeclaracaoTendoComo.bind(this),
39422
+ TextoDocumentacao: this.traduzirDeclaracaoTextoDocumentacao.bind(this),
39332
39423
  };
39333
39424
  }
39334
39425
  traduzirSimboloOperador(operador) {
@@ -39344,7 +39435,7 @@ class TradutorAssemblyScript {
39344
39435
  case delegua_1.default.BIT_NOT:
39345
39436
  return '~';
39346
39437
  case delegua_1.default.DIFERENTE:
39347
- return '!==';
39438
+ return '!=';
39348
39439
  case delegua_1.default.DIVISAO:
39349
39440
  return '/';
39350
39441
  case delegua_1.default.E:
@@ -39354,7 +39445,7 @@ class TradutorAssemblyScript {
39354
39445
  case delegua_1.default.IGUAL:
39355
39446
  return '=';
39356
39447
  case delegua_1.default.IGUAL_IGUAL:
39357
- return '===';
39448
+ return '==';
39358
39449
  case delegua_1.default.MAIOR:
39359
39450
  return '>';
39360
39451
  case delegua_1.default.MAIOR_IGUAL:
@@ -39375,6 +39466,7 @@ class TradutorAssemblyScript {
39375
39466
  }
39376
39467
  traduzirFuncoesNativas(metodo) {
39377
39468
  switch (metodo.toLowerCase()) {
39469
+ // Array methods
39378
39470
  case 'adicionar':
39379
39471
  case 'empilhar':
39380
39472
  return 'push';
@@ -39383,6 +39475,7 @@ class TradutorAssemblyScript {
39383
39475
  case 'fatiar':
39384
39476
  return 'slice';
39385
39477
  case 'inclui':
39478
+ case 'incluido':
39386
39479
  return 'includes';
39387
39480
  case 'inverter':
39388
39481
  return 'reverse';
@@ -39396,16 +39489,126 @@ class TradutorAssemblyScript {
39396
39489
  return 'pop';
39397
39490
  case 'tamanho':
39398
39491
  return 'length';
39492
+ case 'indice':
39493
+ case 'indiceode':
39494
+ return 'indexOf';
39495
+ // String methods
39399
39496
  case 'maiusculo':
39400
39497
  return 'toUpperCase';
39401
39498
  case 'minusculo':
39402
39499
  return 'toLowerCase';
39403
39500
  case 'substituir':
39404
39501
  return 'replace';
39502
+ case 'trimcomeco':
39503
+ return 'trimStart';
39504
+ case 'trimfim':
39505
+ return 'trimEnd';
39506
+ case 'trim':
39507
+ return 'trim';
39508
+ case 'comeca':
39509
+ return 'startsWith';
39510
+ case 'termina':
39511
+ return 'endsWith';
39512
+ case 'contém':
39513
+ case 'contem':
39514
+ return 'includes';
39515
+ // Math constants and methods (would need Math. prefix in AS)
39516
+ case 'abs':
39517
+ case 'absoluto':
39518
+ return 'Math.abs';
39519
+ case 'ceil':
39520
+ case 'teto':
39521
+ return 'Math.ceil';
39522
+ case 'floor':
39523
+ case 'piso':
39524
+ return 'Math.floor';
39525
+ case 'round':
39526
+ case 'arredondar':
39527
+ return 'Math.round';
39528
+ case 'sqrt':
39529
+ case 'raizquadrada':
39530
+ return 'Math.sqrt';
39531
+ case 'pow':
39532
+ case 'potencia':
39533
+ return 'Math.pow';
39534
+ case 'max':
39535
+ case 'maximo':
39536
+ return 'Math.max';
39537
+ case 'min':
39538
+ case 'minimo':
39539
+ return 'Math.min';
39540
+ case 'sin':
39541
+ case 'seno':
39542
+ return 'Math.sin';
39543
+ case 'cos':
39544
+ case 'cosseno':
39545
+ return 'Math.cos';
39546
+ case 'tan':
39547
+ case 'tangente':
39548
+ return 'Math.tan';
39549
+ case 'pi':
39550
+ return 'Math.PI';
39551
+ case 'e':
39552
+ return 'Math.E';
39405
39553
  default:
39406
39554
  return metodo;
39407
39555
  }
39408
39556
  }
39557
+ traduzirFuncaoNativaGlobal(nomeFuncao, argumentos) {
39558
+ switch (nomeFuncao.toLowerCase()) {
39559
+ // Math functions
39560
+ case 'aleatorio':
39561
+ return `Math.random()`;
39562
+ case 'aleatorioEntre':
39563
+ case 'aleatorioente':
39564
+ if (argumentos.length >= 2) {
39565
+ return `(Math.random() * (${argumentos[1]} - ${argumentos[0]}) + ${argumentos[0]})`;
39566
+ }
39567
+ return null;
39568
+ case 'arredondar':
39569
+ return argumentos.length > 0 ? `Math.round(${argumentos[0]})` : null;
39570
+ case 'inteiro':
39571
+ return argumentos.length > 0 ? `Math.trunc(${argumentos[0]})` : null;
39572
+ case 'numero':
39573
+ return argumentos.length > 0 ? `Number(${argumentos[0]})` : null;
39574
+ case 'texto':
39575
+ return argumentos.length > 0 ? `String(${argumentos[0]})` : null;
39576
+ case 'longo':
39577
+ return argumentos.length > 0 ? `parseInt(${argumentos[0]})` : null;
39578
+ case 'real':
39579
+ return argumentos.length > 0 ? `parseFloat(${argumentos[0]})` : null;
39580
+ // Array functions
39581
+ case 'tamanho':
39582
+ return argumentos.length > 0 ? `(${argumentos[0]}).length` : null;
39583
+ case 'intervalo':
39584
+ // intervalo(inicio, fim, passo?) - returns array of numbers
39585
+ if (argumentos.length >= 2) {
39586
+ if (argumentos.length >= 3) {
39587
+ return `Array.from({length: (${argumentos[1]} - ${argumentos[0]}) / ${argumentos[2]}}, (_, i) => ${argumentos[0]} + i * ${argumentos[2]})`;
39588
+ }
39589
+ return `Array.from({length: ${argumentos[1]} - ${argumentos[0]}}, (_, i) => ${argumentos[0]} + i)`;
39590
+ }
39591
+ return null;
39592
+ case 'maximo':
39593
+ return argumentos.length > 0 ? `Math.max(...${argumentos[0]})` : null;
39594
+ case 'minimo':
39595
+ return argumentos.length > 0 ? `Math.min(...${argumentos[0]})` : null;
39596
+ // These need custom implementation or are too complex for Phase 5
39597
+ case 'mapear':
39598
+ case 'filtrarPor':
39599
+ case 'reduzir':
39600
+ case 'ordenar':
39601
+ case 'encontrar':
39602
+ case 'encontrarIndice':
39603
+ case 'incluido':
39604
+ case 'todos':
39605
+ case 'algum':
39606
+ // These would require closures/lambda support - not easily translated
39607
+ return null;
39608
+ default:
39609
+ return null;
39610
+ }
39611
+ }
39409
39612
  traduzirConstrutoArgumentoReferenciaFuncao(argumentoReferenciaFuncao, argumentos) {
39410
39613
  const argumentosResolvidos = [];
39411
39614
  for (const argumento of argumentos) {
@@ -39430,7 +39633,7 @@ class TradutorAssemblyScript {
39430
39633
  return `${separador.conteudo} `;
39431
39634
  }
39432
39635
  traduzirDeclaracaoEscreva(declaracaoEscreva) {
39433
- let resultado = 'console.log(';
39636
+ let resultado = 'trace(';
39434
39637
  for (const argumento of declaracaoEscreva.argumentos) {
39435
39638
  const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
39436
39639
  resultado += valor + ', ';
@@ -39441,7 +39644,7 @@ class TradutorAssemblyScript {
39441
39644
  }
39442
39645
  traduzirConstrutoLiteral(literal) {
39443
39646
  if (typeof literal.valor === 'string')
39444
- return `'${literal.valor}'`;
39647
+ return `"${literal.valor}"`;
39445
39648
  return String(literal.valor);
39446
39649
  }
39447
39650
  resolveTipoDeclaracaoVarEContante(tipo) {
@@ -39449,25 +39652,67 @@ class TradutorAssemblyScript {
39449
39652
  case 'texto':
39450
39653
  return ': string';
39451
39654
  case 'inteiro':
39655
+ return ': i32';
39656
+ case 'longo':
39657
+ return ': i64';
39658
+ case 'inteiro_curto':
39659
+ case 'inteiroCurto':
39660
+ return ': i16';
39661
+ case 'byte':
39662
+ return ': i8';
39452
39663
  case 'numero':
39453
39664
  case 'número':
39454
39665
  case 'real':
39455
39666
  return ': f64';
39667
+ case 'real_curto':
39668
+ case 'realCurto':
39669
+ return ': f32';
39456
39670
  case 'logico':
39457
39671
  case 'lógico':
39458
39672
  return ': bool';
39673
+ case 'vazio':
39674
+ case 'nada':
39675
+ return ': void';
39459
39676
  case 'nulo':
39460
- return ': null';
39677
+ throw new Error(`Tipo 'nulo' não é válido no AssemblyScript. Use 'Type | null' para tipos anuláveis.`);
39461
39678
  case 'inteiro[]':
39679
+ return ': i32[]';
39680
+ case 'longo[]':
39681
+ return ': i64[]';
39462
39682
  case 'real[]':
39683
+ case 'numero[]':
39684
+ case 'número[]':
39463
39685
  return ': f64[]';
39464
39686
  case 'texto[]':
39465
39687
  return ': string[]';
39466
39688
  case 'logico[]':
39467
39689
  case 'lógico[]':
39468
39690
  return ': bool[]';
39691
+ case 'dicionario':
39692
+ case 'dicionário':
39693
+ return ': Map<string, i32>';
39694
+ case 'dupla':
39695
+ return ': i32[]';
39696
+ case 'trio':
39697
+ return ': i32[]';
39698
+ case 'quarteto':
39699
+ return ': i32[]';
39700
+ case 'quinteto':
39701
+ return ': i32[]';
39702
+ case 'sexteto':
39703
+ return ': i32[]';
39704
+ case 'septeto':
39705
+ return ': i32[]';
39706
+ case 'octeto':
39707
+ return ': i32[]';
39708
+ case 'noneto':
39709
+ return ': i32[]';
39710
+ case 'deceto':
39711
+ return ': i32[]';
39712
+ case 'tupla':
39713
+ return ': i32[]';
39469
39714
  default:
39470
- return ': any';
39715
+ throw new Error(`Tipo não reconhecido ou não suportado no AssemblyScript: '${tipo}'. AssemblyScript requer anotações de tipo explícitas.`);
39471
39716
  }
39472
39717
  }
39473
39718
  traduzirDeclaracaoVar(declaracaoVar) {
@@ -39507,7 +39752,8 @@ class TradutorAssemblyScript {
39507
39752
  return resultado;
39508
39753
  }
39509
39754
  traduzirDeclaracaoTente(declaracaoTente) {
39510
- let resultado = 'try {\n';
39755
+ let resultado = '/* AVISO: AssemblyScript não suporta try/catch/finally. Este código pode não funcionar como esperado. */\n';
39756
+ resultado += 'try {\n';
39511
39757
  this.indentacao += 4;
39512
39758
  resultado += ' '.repeat(this.indentacao);
39513
39759
  for (let condicao of declaracaoTente.caminhoTente) {
@@ -39543,6 +39789,81 @@ class TradutorAssemblyScript {
39543
39789
  }
39544
39790
  return resultado;
39545
39791
  }
39792
+ traduzirDeclaracaoVarMultiplo(declaracaoVarMultiplo) {
39793
+ const variaveis = declaracaoVarMultiplo.simbolos.map(s => s.lexema).join(', ');
39794
+ let resultado = 'let ';
39795
+ resultado += variaveis;
39796
+ resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoVarMultiplo.tipo);
39797
+ if (!(declaracaoVarMultiplo === null || declaracaoVarMultiplo === void 0 ? void 0 : declaracaoVarMultiplo.inicializador))
39798
+ resultado += ';';
39799
+ else {
39800
+ resultado += ' = ';
39801
+ if (this.dicionarioConstrutos[declaracaoVarMultiplo.inicializador.constructor.name]) {
39802
+ resultado += this.dicionarioConstrutos[declaracaoVarMultiplo.inicializador.constructor.name](declaracaoVarMultiplo.inicializador);
39803
+ }
39804
+ else {
39805
+ resultado += this.dicionarioDeclaracoes[declaracaoVarMultiplo.inicializador.constructor.name](declaracaoVarMultiplo.inicializador);
39806
+ }
39807
+ resultado += ';';
39808
+ }
39809
+ return resultado;
39810
+ }
39811
+ traduzirDeclaracaoConstMultiplo(declaracaoConstMultiplo) {
39812
+ const constantes = declaracaoConstMultiplo.simbolos.map(s => s.lexema).join(', ');
39813
+ let resultado = 'const ';
39814
+ resultado += constantes;
39815
+ resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoConstMultiplo.tipo);
39816
+ if (!(declaracaoConstMultiplo === null || declaracaoConstMultiplo === void 0 ? void 0 : declaracaoConstMultiplo.inicializador))
39817
+ resultado += ';';
39818
+ else {
39819
+ resultado += ' = ';
39820
+ if (this.dicionarioConstrutos[declaracaoConstMultiplo.inicializador.constructor.name]) {
39821
+ resultado += this.dicionarioConstrutos[declaracaoConstMultiplo.inicializador.constructor.name](declaracaoConstMultiplo.inicializador);
39822
+ }
39823
+ else {
39824
+ resultado += this.dicionarioDeclaracoes[declaracaoConstMultiplo.inicializador.constructor.name](declaracaoConstMultiplo.inicializador);
39825
+ }
39826
+ resultado += ';';
39827
+ }
39828
+ return resultado;
39829
+ }
39830
+ traduzirDeclaracaoEscrevaMesmaLinha(declaracaoEscrevaMesmaLinha) {
39831
+ let resultado = 'trace(';
39832
+ for (const argumento of declaracaoEscrevaMesmaLinha.argumentos) {
39833
+ const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
39834
+ resultado += valor + ', ';
39835
+ }
39836
+ resultado = resultado.slice(0, -2);
39837
+ resultado += ')';
39838
+ return resultado;
39839
+ }
39840
+ traduzirDeclaracaoTendoComo(declaracaoTendoComo) {
39841
+ // TendoComo is a resource management pattern (like try-with-resources in Java)
39842
+ // AssemblyScript doesn't have built-in support, so we'll just treat it as a scope
39843
+ let resultado = `// tendo ${declaracaoTendoComo.simboloVariavel.lexema} como recurso\n`;
39844
+ resultado += ' '.repeat(this.indentacao);
39845
+ resultado += `let ${declaracaoTendoComo.simboloVariavel.lexema} = `;
39846
+ if (this.dicionarioConstrutos[declaracaoTendoComo.inicializacaoVariavel.constructor.name]) {
39847
+ resultado += this.dicionarioConstrutos[declaracaoTendoComo.inicializacaoVariavel.constructor.name](declaracaoTendoComo.inicializacaoVariavel);
39848
+ }
39849
+ else {
39850
+ resultado += this.dicionarioDeclaracoes[declaracaoTendoComo.inicializacaoVariavel.constructor.name](declaracaoTendoComo.inicializacaoVariavel);
39851
+ }
39852
+ resultado += ';\n';
39853
+ resultado += ' '.repeat(this.indentacao);
39854
+ resultado += this.dicionarioDeclaracoes[declaracaoTendoComo.corpo.constructor.name](declaracaoTendoComo.corpo);
39855
+ return resultado;
39856
+ }
39857
+ traduzirDeclaracaoAjuda(declaracaoAjuda) {
39858
+ // Ajuda is a help/documentation statement
39859
+ // In AssemblyScript, we'll just comment it out
39860
+ return '// ajuda' + '\n';
39861
+ }
39862
+ traduzirDeclaracaoTextoDocumentacao(declaracaoTextoDoc) {
39863
+ // TextoDocumentacao is documentation text
39864
+ // We'll convert it to a comment
39865
+ return `/** ${declaracaoTextoDoc} */\n`;
39866
+ }
39546
39867
  logicaComumBlocoEscopo(declaracoes) {
39547
39868
  let resultado = '{\n';
39548
39869
  this.indentacao += 4;
@@ -39626,10 +39947,38 @@ class TradutorAssemblyScript {
39626
39947
  return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
39627
39948
  }
39628
39949
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
39629
- let resultado = `for (let ${declaracaoParaCada.variavelIteracao} of `;
39950
+ // AssemblyScript não suporta for...of. Convertendo para loop baseado em índice.
39951
+ if (declaracaoParaCada.variavelIteracao.constructor.name !== 'Variavel') {
39952
+ throw new Error('Desestruturação em paraCada não é suportada no AssemblyScript. Use uma variável simples.');
39953
+ }
39954
+ const nomeVariavel = declaracaoParaCada.variavelIteracao.simbolo.lexema;
39955
+ const nomeVetor = `__arr_${nomeVariavel}`;
39956
+ let resultado = `const ${nomeVetor} = `;
39630
39957
  resultado +=
39631
- this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + ') ';
39632
- resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);
39958
+ this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + ';';
39959
+ resultado += '\n';
39960
+ resultado += ' '.repeat(this.indentacao);
39961
+ resultado += `for (let __i_${nomeVariavel} = 0; __i_${nomeVariavel} < ${nomeVetor}.length; __i_${nomeVariavel}++) `;
39962
+ // Injeta a atribuição da variável de iteração no início do corpo do bloco
39963
+ const corpoBloco = declaracaoParaCada.corpo;
39964
+ const declaracoesCorpo = corpoBloco.declaracoes || [];
39965
+ let resultadoCorpo = '{\n';
39966
+ this.indentacao += 4;
39967
+ resultadoCorpo += ' '.repeat(this.indentacao) + `const ${nomeVariavel} = ${nomeVetor}[__i_${nomeVariavel}];\n`;
39968
+ for (const declaracaoOuConstruto of declaracoesCorpo) {
39969
+ resultadoCorpo += ' '.repeat(this.indentacao);
39970
+ const nomeConstrutor = declaracaoOuConstruto.constructor.name;
39971
+ if (this.dicionarioConstrutos.hasOwnProperty(nomeConstrutor)) {
39972
+ resultadoCorpo += this.dicionarioConstrutos[nomeConstrutor](declaracaoOuConstruto);
39973
+ }
39974
+ else {
39975
+ resultadoCorpo += this.dicionarioDeclaracoes[nomeConstrutor](declaracaoOuConstruto);
39976
+ }
39977
+ resultadoCorpo += '\n';
39978
+ }
39979
+ this.indentacao -= 4;
39980
+ resultadoCorpo += ' '.repeat(this.indentacao) + '}\n';
39981
+ resultado += resultadoCorpo;
39633
39982
  return resultado;
39634
39983
  }
39635
39984
  traduzirDeclaracaoPara(declaracaoPara) {
@@ -39658,19 +40007,89 @@ class TradutorAssemblyScript {
39658
40007
  }
39659
40008
  traduzirDeclaracaoFuncao(declaracaoFuncao) {
39660
40009
  let resultado = 'function ';
39661
- resultado += declaracaoFuncao.simbolo.lexema + ' (';
40010
+ resultado += declaracaoFuncao.simbolo.lexema + '(';
40011
+ // Adiciona parâmetros com tipos
39662
40012
  for (const parametro of declaracaoFuncao.funcao.parametros) {
39663
- resultado += parametro.nome.lexema + ', ';
40013
+ resultado += parametro.nome.lexema;
40014
+ // Adiciona tipo do parâmetro se disponível
40015
+ if (parametro.tipoDado) {
40016
+ try {
40017
+ resultado += this.resolveTipoDeclaracaoVarEContante(parametro.tipoDado);
40018
+ }
40019
+ catch (e) {
40020
+ // Se não conseguir resolver o tipo, lança erro mais específico
40021
+ throw new Error(`Parâmetro '${parametro.nome.lexema}' da função '${declaracaoFuncao.simbolo.lexema}' tem tipo não suportado: '${parametro.tipoDado}'`);
40022
+ }
40023
+ }
40024
+ else {
40025
+ // AssemblyScript requer tipos explícitos em todos os parâmetros
40026
+ throw new Error(`Parâmetro '${parametro.nome.lexema}' da função '${declaracaoFuncao.simbolo.lexema}' não tem tipo definido. AssemblyScript requer tipos explícitos.`);
40027
+ }
40028
+ resultado += ', ';
39664
40029
  }
39665
40030
  if (declaracaoFuncao.funcao.parametros.length > 0) {
39666
40031
  resultado = resultado.slice(0, -2);
39667
40032
  }
39668
- resultado += ') ';
40033
+ resultado += ')';
40034
+ // Adiciona tipo de retorno
40035
+ const tipoRetorno = this.inferirTipoRetornoFuncao(declaracaoFuncao.funcao);
40036
+ resultado += tipoRetorno;
40037
+ resultado += ' ';
39669
40038
  resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
39670
40039
  return resultado;
39671
40040
  }
40041
+ inferirTipoRetornoFuncao(funcao) {
40042
+ // Se a função tem tipo de retorno explícito, usa ele
40043
+ if (funcao.tipo && funcao.tipo !== 'qualquer') {
40044
+ try {
40045
+ return this.resolveTipoDeclaracaoVarEContante(funcao.tipo);
40046
+ }
40047
+ catch (e) {
40048
+ // Se não conseguir resolver, retorna void por padrão
40049
+ return ': void';
40050
+ }
40051
+ }
40052
+ // Procura por declarações de retorno no corpo e infere tipo a partir delas
40053
+ const tipoInferido = this.inferirTipoDeRetorno(funcao.corpo);
40054
+ if (tipoInferido) {
40055
+ try {
40056
+ return this.resolveTipoDeclaracaoVarEContante(tipoInferido);
40057
+ }
40058
+ catch (e) {
40059
+ return ': void';
40060
+ }
40061
+ }
40062
+ return ': void';
40063
+ }
40064
+ inferirTipoDeRetorno(corpo) {
40065
+ if (!corpo)
40066
+ return null;
40067
+ for (const declaracao of corpo) {
40068
+ if (declaracao.constructor.name === 'Retorna') {
40069
+ const retorna = declaracao;
40070
+ if (retorna.tipo && retorna.tipo !== 'vazio') {
40071
+ return retorna.tipo;
40072
+ }
40073
+ }
40074
+ // Verifica recursivamente em blocos aninhados
40075
+ if (declaracao.corpo) {
40076
+ const corpoInterno = declaracao.corpo;
40077
+ if (Array.isArray(corpoInterno)) {
40078
+ const tipo = this.inferirTipoDeRetorno(corpoInterno);
40079
+ if (tipo)
40080
+ return tipo;
40081
+ }
40082
+ else if (corpoInterno.declaracoes) {
40083
+ const tipo = this.inferirTipoDeRetorno(corpoInterno.declaracoes);
40084
+ if (tipo)
40085
+ return tipo;
40086
+ }
40087
+ }
40088
+ }
40089
+ return null;
40090
+ }
39672
40091
  traduzirDeclaracaoFalhar(falhar) {
39673
- return `throw '${falhar.explicacao.valor}'`;
40092
+ return `abort('${falhar.explicacao.valor}')`;
39674
40093
  }
39675
40094
  traduzirDeclaracaoFazer(declaracaoFazer) {
39676
40095
  let resultado = 'do ';
@@ -39749,6 +40168,146 @@ class TradutorAssemblyScript {
39749
40168
  resultado += ']';
39750
40169
  return resultado;
39751
40170
  }
40171
+ traduzirConstrutoDicionario(dicionario) {
40172
+ // AssemblyScript Maps são inicializados via construtor
40173
+ // Map<K, V>() requer: new Map<string, ValueType>()
40174
+ if (!dicionario.chaves.length) {
40175
+ return 'new Map<string, i32>()';
40176
+ }
40177
+ // AssemblyScript não suporta literal syntax para Map, precisa usar constructor
40178
+ // Gerar algo como: { let m = new Map<string, i32>(); m.set("key", value); ... return m; }
40179
+ let resultado = '(() => { let m = new Map<string, i32>(); ';
40180
+ for (let i = 0; i < dicionario.chaves.length; i++) {
40181
+ const chave = dicionario.chaves[i];
40182
+ const valor = dicionario.valores[i];
40183
+ // A chave pode ser um Construto (como Literal) ou um valor simples
40184
+ let chaveStr;
40185
+ if (typeof chave === 'string') {
40186
+ chaveStr = `"${chave}"`;
40187
+ }
40188
+ else if (chave && chave.constructor && this.dicionarioConstrutos[chave.constructor.name]) {
40189
+ // Se for um Construto, traduzi-lo
40190
+ chaveStr = this.dicionarioConstrutos[chave.constructor.name](chave);
40191
+ }
40192
+ else {
40193
+ // Fallback: converter para string
40194
+ chaveStr = `"${String(chave)}"`;
40195
+ }
40196
+ resultado += `m.set(${chaveStr}, ${this.dicionarioConstrutos[valor.constructor.name](valor)}); `;
40197
+ }
40198
+ resultado += 'return m; })()';
40199
+ return resultado;
40200
+ }
40201
+ traduzirConstrutoDupla(dupla) {
40202
+ const primeiro = this.dicionarioConstrutos[dupla.primeiro.constructor.name](dupla.primeiro);
40203
+ const segundo = this.dicionarioConstrutos[dupla.segundo.constructor.name](dupla.segundo);
40204
+ return `[${primeiro}, ${segundo}]`;
40205
+ }
40206
+ traduzirConstrutoTrio(trio) {
40207
+ const primeiro = this.dicionarioConstrutos[trio.primeiro.constructor.name](trio.primeiro);
40208
+ const segundo = this.dicionarioConstrutos[trio.segundo.constructor.name](trio.segundo);
40209
+ const terceiro = this.dicionarioConstrutos[trio.terceiro.constructor.name](trio.terceiro);
40210
+ return `[${primeiro}, ${segundo}, ${terceiro}]`;
40211
+ }
40212
+ traduzirConstrutoQuarteto(quarteto) {
40213
+ const primeiro = this.dicionarioConstrutos[quarteto.primeiro.constructor.name](quarteto.primeiro);
40214
+ const segundo = this.dicionarioConstrutos[quarteto.segundo.constructor.name](quarteto.segundo);
40215
+ const terceiro = this.dicionarioConstrutos[quarteto.terceiro.constructor.name](quarteto.terceiro);
40216
+ const quarto = this.dicionarioConstrutos[quarteto.quarto.constructor.name](quarteto.quarto);
40217
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}]`;
40218
+ }
40219
+ traduzirConstrutoQuinteto(quinteto) {
40220
+ const primeiro = this.dicionarioConstrutos[quinteto.primeiro.constructor.name](quinteto.primeiro);
40221
+ const segundo = this.dicionarioConstrutos[quinteto.segundo.constructor.name](quinteto.segundo);
40222
+ const terceiro = this.dicionarioConstrutos[quinteto.terceiro.constructor.name](quinteto.terceiro);
40223
+ const quarto = this.dicionarioConstrutos[quinteto.quarto.constructor.name](quinteto.quarto);
40224
+ const quinto = this.dicionarioConstrutos[quinteto.quinto.constructor.name](quinteto.quinto);
40225
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}]`;
40226
+ }
40227
+ traduzirConstrutoSexteto(sexteto) {
40228
+ const primeiro = this.dicionarioConstrutos[sexteto.primeiro.constructor.name](sexteto.primeiro);
40229
+ const segundo = this.dicionarioConstrutos[sexteto.segundo.constructor.name](sexteto.segundo);
40230
+ const terceiro = this.dicionarioConstrutos[sexteto.terceiro.constructor.name](sexteto.terceiro);
40231
+ const quarto = this.dicionarioConstrutos[sexteto.quarto.constructor.name](sexteto.quarto);
40232
+ const quinto = this.dicionarioConstrutos[sexteto.quinto.constructor.name](sexteto.quinto);
40233
+ const sexto = this.dicionarioConstrutos[sexteto.sexto.constructor.name](sexteto.sexto);
40234
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}]`;
40235
+ }
40236
+ traduzirConstrutoSepteto(septeto) {
40237
+ const primeiro = this.dicionarioConstrutos[septeto.primeiro.constructor.name](septeto.primeiro);
40238
+ const segundo = this.dicionarioConstrutos[septeto.segundo.constructor.name](septeto.segundo);
40239
+ const terceiro = this.dicionarioConstrutos[septeto.terceiro.constructor.name](septeto.terceiro);
40240
+ const quarto = this.dicionarioConstrutos[septeto.quarto.constructor.name](septeto.quarto);
40241
+ const quinto = this.dicionarioConstrutos[septeto.quinto.constructor.name](septeto.quinto);
40242
+ const sexto = this.dicionarioConstrutos[septeto.sexto.constructor.name](septeto.sexto);
40243
+ const setimo = this.dicionarioConstrutos[septeto.setimo.constructor.name](septeto.setimo);
40244
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}]`;
40245
+ }
40246
+ traduzirConstrutoOcteto(octeto) {
40247
+ const primeiro = this.dicionarioConstrutos[octeto.primeiro.constructor.name](octeto.primeiro);
40248
+ const segundo = this.dicionarioConstrutos[octeto.segundo.constructor.name](octeto.segundo);
40249
+ const terceiro = this.dicionarioConstrutos[octeto.terceiro.constructor.name](octeto.terceiro);
40250
+ const quarto = this.dicionarioConstrutos[octeto.quarto.constructor.name](octeto.quarto);
40251
+ const quinto = this.dicionarioConstrutos[octeto.quinto.constructor.name](octeto.quinto);
40252
+ const sexto = this.dicionarioConstrutos[octeto.sexto.constructor.name](octeto.sexto);
40253
+ const setimo = this.dicionarioConstrutos[octeto.setimo.constructor.name](octeto.setimo);
40254
+ const oitavo = this.dicionarioConstrutos[octeto.oitavo.constructor.name](octeto.oitavo);
40255
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}]`;
40256
+ }
40257
+ traduzirConstrutoNoneto(noneto) {
40258
+ const primeiro = this.dicionarioConstrutos[noneto.primeiro.constructor.name](noneto.primeiro);
40259
+ const segundo = this.dicionarioConstrutos[noneto.segundo.constructor.name](noneto.segundo);
40260
+ const terceiro = this.dicionarioConstrutos[noneto.terceiro.constructor.name](noneto.terceiro);
40261
+ const quarto = this.dicionarioConstrutos[noneto.quarto.constructor.name](noneto.quarto);
40262
+ const quinto = this.dicionarioConstrutos[noneto.quinto.constructor.name](noneto.quinto);
40263
+ const sexto = this.dicionarioConstrutos[noneto.sexto.constructor.name](noneto.sexto);
40264
+ const setimo = this.dicionarioConstrutos[noneto.setimo.constructor.name](noneto.setimo);
40265
+ const oitavo = this.dicionarioConstrutos[noneto.oitavo.constructor.name](noneto.oitavo);
40266
+ const nono = this.dicionarioConstrutos[noneto.nono.constructor.name](noneto.nono);
40267
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}]`;
40268
+ }
40269
+ traduzirConstrutoDeceto(deceto) {
40270
+ const primeiro = this.dicionarioConstrutos[deceto.primeiro.constructor.name](deceto.primeiro);
40271
+ const segundo = this.dicionarioConstrutos[deceto.segundo.constructor.name](deceto.segundo);
40272
+ const terceiro = this.dicionarioConstrutos[deceto.terceiro.constructor.name](deceto.terceiro);
40273
+ const quarto = this.dicionarioConstrutos[deceto.quarto.constructor.name](deceto.quarto);
40274
+ const quinto = this.dicionarioConstrutos[deceto.quinto.constructor.name](deceto.quinto);
40275
+ const sexto = this.dicionarioConstrutos[deceto.sexto.constructor.name](deceto.sexto);
40276
+ const setimo = this.dicionarioConstrutos[deceto.setimo.constructor.name](deceto.setimo);
40277
+ const oitavo = this.dicionarioConstrutos[deceto.oitavo.constructor.name](deceto.oitavo);
40278
+ const nono = this.dicionarioConstrutos[deceto.nono.constructor.name](deceto.nono);
40279
+ const decimo = this.dicionarioConstrutos[deceto.decimo.constructor.name](deceto.decimo);
40280
+ return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}, ${decimo}]`;
40281
+ }
40282
+ traduzirConstrutoTuplaN(tuplaN) {
40283
+ const elementos = tuplaN.elementos.map(elemento => this.dicionarioConstrutos[elemento.constructor.name](elemento));
40284
+ return `[${elementos.join(', ')}]`;
40285
+ }
40286
+ traduzirConstrutoSeTernario(seTernario) {
40287
+ const condicao = this.dicionarioConstrutos[seTernario.condicao.constructor.name](seTernario.condicao);
40288
+ const expressaoSe = this.dicionarioConstrutos[seTernario.expressaoSe.constructor.name](seTernario.expressaoSe);
40289
+ const expressaoSenao = this.dicionarioConstrutos[seTernario.expressaoSenao.constructor.name](seTernario.expressaoSenao);
40290
+ return `${condicao} ? ${expressaoSe} : ${expressaoSenao}`;
40291
+ }
40292
+ traduzirConstrutoElvis(elvis) {
40293
+ const esquerda = this.dicionarioConstrutos[elvis.esquerda.constructor.name](elvis.esquerda);
40294
+ const direita = this.dicionarioConstrutos[elvis.direita.constructor.name](elvis.direita);
40295
+ // Elvis operator (?:) is equivalent to || in JavaScript for null-coalescing
40296
+ return `${esquerda} || ${direita}`;
40297
+ }
40298
+ traduzirConstrutoAcessoPropriedade(acessoPropriedade) {
40299
+ const objeto = this.dicionarioConstrutos[acessoPropriedade.objeto.constructor.name](acessoPropriedade.objeto);
40300
+ return `${objeto}.${acessoPropriedade.nomePropriedade}`;
40301
+ }
40302
+ traduzirConstrutoExpressaoRegular(expressaoRegular) {
40303
+ // AssemblyScript doesn't have native regex support like JavaScript
40304
+ // Return the pattern as a string for now
40305
+ const valor = expressaoRegular.valor;
40306
+ if (typeof valor === 'string') {
40307
+ return `"${valor}"`;
40308
+ }
40309
+ return String(valor);
40310
+ }
39752
40311
  traduzirConstrutoVariavel(variavel) {
39753
40312
  return variavel.simbolo.lexema;
39754
40313
  }
@@ -39766,20 +40325,13 @@ class TradutorAssemblyScript {
39766
40325
  return resultado;
39767
40326
  }
39768
40327
  traduzirConstrutoTipoDe(tipoDe) {
39769
- let resultado = 'typeof ';
39770
- if (typeof tipoDe.valor === 'string')
39771
- resultado += `'${tipoDe.valor}'`;
39772
- else if (tipoDe.valor instanceof construtos_1.Vetor)
39773
- resultado += this.traduzirConstrutoVetor(tipoDe.valor);
39774
- else
39775
- resultado += this.dicionarioConstrutos[tipoDe.valor.constructor.name](tipoDe.valor);
39776
- return resultado;
40328
+ 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.');
39777
40329
  }
39778
40330
  traduzirConstrutoLogico(logico) {
39779
- let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
39780
- let operador = this.traduzirSimboloOperador(logico.operador);
39781
40331
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
39782
- return `${direita} ${operador} ${esquerda}`;
40332
+ let operador = this.traduzirSimboloOperador(logico.operador);
40333
+ let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
40334
+ return `${esquerda} ${operador} ${direita}`;
39783
40335
  }
39784
40336
  traduzirFuncaoConstruto(funcaoConstruto) {
39785
40337
  let resultado = 'function(';
@@ -39804,6 +40356,15 @@ class TradutorAssemblyScript {
39804
40356
  }
39805
40357
  traduzirConstrutoChamada(chamada) {
39806
40358
  let resultado = '';
40359
+ // Check if this is a native library function call
40360
+ if (chamada.entidadeChamada instanceof construtos_1.Variavel) {
40361
+ const nomeVariavel = chamada.entidadeChamada.simbolo.lexema;
40362
+ const argumentosTexto = chamada.argumentos.map(arg => this.dicionarioConstrutos[arg.constructor.name](arg));
40363
+ const funcaoNativa = this.traduzirFuncaoNativaGlobal(nomeVariavel, argumentosTexto);
40364
+ if (funcaoNativa) {
40365
+ return funcaoNativa;
40366
+ }
40367
+ }
39807
40368
  const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
39808
40369
  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; });
39809
40370
  if (instanciaClasse) {
@@ -39839,6 +40400,12 @@ class TradutorAssemblyScript {
39839
40400
  return resultado;
39840
40401
  }
39841
40402
  traduzirConstrutoBinario(binario) {
40403
+ // Tratamento especial para exponenciação no AssemblyScript
40404
+ if (binario.operador.tipo === delegua_1.default.EXPONENCIACAO) {
40405
+ const esquerda = this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
40406
+ const direita = this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
40407
+ return `Math.pow(${esquerda}, ${direita})`;
40408
+ }
39842
40409
  let resultado = '';
39843
40410
  if (binario.esquerda.constructor.name === 'Agrupamento')
39844
40411
  resultado +=
@@ -39864,16 +40431,23 @@ class TradutorAssemblyScript {
39864
40431
  ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
39865
40432
  return resultado;
39866
40433
  }
39867
- // TODO: Eliminar o soft cast para `any`.
39868
40434
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
39869
- var _a;
39870
40435
  let resultado = '';
39871
- resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
40436
+ // Traduz o objeto (array ou coleção)
40437
+ if (AtribuicaoPorIndice.objeto instanceof construtos_1.Variavel) {
40438
+ resultado += AtribuicaoPorIndice.objeto.simbolo.lexema;
40439
+ }
40440
+ else {
40441
+ resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.objeto.constructor.name](AtribuicaoPorIndice.objeto);
40442
+ }
40443
+ // Adiciona o índice
40444
+ resultado += '[';
39872
40445
  resultado +=
39873
40446
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
39874
40447
  resultado += ' = ';
39875
- if ((_a = (AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor).simbolo) === null || _a === void 0 ? void 0 : _a.lexema) {
39876
- resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
40448
+ // Traduz o valor a ser atribuído
40449
+ if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
40450
+ resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
39877
40451
  }
39878
40452
  else {
39879
40453
  resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);