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