@designliquido/delegua 1.6.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 (39) hide show
  1. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +1 -0
  2. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  3. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +85 -4
  4. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico.js +4 -1
  7. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +4 -0
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +73 -30
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  12. package/bibliotecas/biblioteca-global.d.ts +11 -4
  13. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  14. package/bibliotecas/biblioteca-global.js +48 -19
  15. package/bibliotecas/biblioteca-global.js.map +1 -1
  16. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +10 -3
  17. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  18. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +46 -18
  19. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  20. package/bin/package.json +1 -1
  21. package/construtos/acesso-intervalo-variavel.d.ts +3 -2
  22. package/construtos/acesso-intervalo-variavel.d.ts.map +1 -1
  23. package/construtos/acesso-intervalo-variavel.js +5 -2
  24. package/construtos/acesso-intervalo-variavel.js.map +1 -1
  25. package/interpretador/comum.js +1 -1
  26. package/interpretador/comum.js.map +1 -1
  27. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  28. package/interpretador/dialetos/pitugues/comum.js +35 -6
  29. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  30. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +12 -0
  31. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  32. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +83 -0
  33. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  34. package/package.json +1 -1
  35. package/tradutores/tradutor-assemblyscript.d.ts +48 -2
  36. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  37. package/tradutores/tradutor-assemblyscript.js +535 -30
  38. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  39. package/umd/delegua.js +666 -83
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, [
@@ -4813,14 +4816,23 @@ class AvaliadorSintaticoPitugues {
4813
4816
  }
4814
4817
  async declaracaoImplicitaVariaveis() {
4815
4818
  const identificador = this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado nome de variável.');
4819
+ let tipo = 'qualquer';
4820
+ let tipoExplicito = false;
4821
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)) {
4822
+ tipo = this.verificarDefinicaoTipoAtual();
4823
+ tipoExplicito = true;
4824
+ this.avancarEDevolverAnterior();
4825
+ }
4816
4826
  this.consumir(pitugues_2.default.IGUAL, "Esperado '=' após identificador.");
4817
4827
  if (this.estaNoFinal()) {
4818
4828
  throw this.erro(this.simboloAnterior(), 'Esperado valor após o símbolo de igual.');
4819
4829
  }
4820
4830
  const valor = await this.expressao();
4821
- const tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(valor, 'qualquer');
4831
+ if (!tipoExplicito) {
4832
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(valor, 'qualquer');
4833
+ }
4822
4834
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
4823
- return new declaracoes_1.Var(identificador, valor, tipo);
4835
+ return new declaracoes_1.Var(identificador, valor, tipo, tipoExplicito);
4824
4836
  }
4825
4837
  temPadraoMultiplaAtribuicao() {
4826
4838
  // Verifica padrão: IDENTIFICADOR, VIRGULA, IDENTIFICADOR, ..., IGUAL
@@ -5238,26 +5250,27 @@ class AvaliadorSintaticoPitugues {
5238
5250
  expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
5239
5251
  }
5240
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;
5241
5256
  let ehFatiamento = false;
5242
- let indiceInicio = null;
5243
- let indiceFim = null;
5244
- if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)) {
5245
- indiceInicio = await this.expressao();
5246
- }
5257
+ let fim = null;
5258
+ let passo = null;
5247
5259
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)) {
5248
5260
  ehFatiamento = true;
5249
- // Se o próximo não é ':', nem ']', então é o índice fim
5250
- if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS) &&
5251
- !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO)) {
5252
- indiceFim = await this.expressao();
5253
- }
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();
5254
5267
  }
5255
5268
  const simboloFechamento = this.consumir(pitugues_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
5256
5269
  if (ehFatiamento) {
5257
- expressao = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressao, indiceInicio, indiceFim, simboloFechamento);
5270
+ expressao = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressao, inicio, fim, passo, simboloFechamento);
5258
5271
  }
5259
5272
  else {
5260
- expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indiceInicio, simboloFechamento);
5273
+ expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, inicio, simboloFechamento);
5261
5274
  }
5262
5275
  }
5263
5276
  else {
@@ -5614,34 +5627,61 @@ class AvaliadorSintaticoPitugues {
5614
5627
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
5615
5628
  }
5616
5629
  async declaracaoPara() {
5630
+ const simboloPara = this.simboloAnterior();
5631
+ this.blocos += 1;
5617
5632
  try {
5618
- const simboloPara = this.simboloAnterior();
5619
- this.blocos += 1;
5620
5633
  this.consumir(pitugues_2.default.CADA, `Esperado palavra reservada 'cada' após 'para'. Atual: ${this.simbolos[this.atual].lexema}.`);
5621
- 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
+ }
5622
5648
  if (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DE, pitugues_2.default.EM)) {
5623
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'.");
5624
5650
  }
5625
- const vetor = await this.expressao();
5626
- if (!vetor.hasOwnProperty('tipo')) {
5627
- throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece possuir um tipo iterável.`);
5628
- }
5629
- const tipoVetor = vetor.tipo;
5630
- if (!tipoVetor.endsWith('[]') && !['qualquer', 'texto', 'vetor'].includes(tipoVetor)) {
5631
- 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'));
5632
5656
  }
5633
- this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
5634
5657
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
5635
5658
  const corpo = await this.resolverDeclaracao();
5636
- return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
5637
- }
5638
- catch (erro) {
5639
- throw erro;
5659
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, alvoIteracao, corpo);
5640
5660
  }
5641
5661
  finally {
5642
5662
  this.blocos -= 1;
5643
5663
  }
5644
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
+ }
5645
5685
  async declaracaoSe() {
5646
5686
  const condicao = await this.expressao();
5647
5687
  const caminhoEntao = await this.resolverDeclaracao();
@@ -5994,6 +6034,9 @@ class AvaliadorSintaticoPitugues {
5994
6034
  if (!this.variavelJaDeclarada(simboloAtual.lexema))
5995
6035
  return this.declaracaoImplicitaVariaveis();
5996
6036
  }
6037
+ if (proximoSimbolo && proximoSimbolo.tipo === pitugues_2.default.DOIS_PONTOS) {
6038
+ return this.declaracaoImplicitaVariaveis();
6039
+ }
5997
6040
  }
5998
6041
  switch (simboloAtual.tipo) {
5999
6042
  case pitugues_2.default.COMENTARIO:
@@ -6147,8 +6190,11 @@ class AvaliadorSintaticoPitugues {
6147
6190
  this.pilhaEscopos.definirInformacoesVariavel('tipo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tipo', 'qualquer', true, [
6148
6191
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('elemento', 'qualquer'),
6149
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
+ ]));
6150
6196
  this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
6151
- new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
6197
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
6152
6198
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
6153
6199
  ]));
6154
6200
  this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
@@ -8940,6 +8986,7 @@ exports.reduzir = reduzir;
8940
8986
  exports.somar = somar;
8941
8987
  exports.tamanho = tamanho;
8942
8988
  exports.texto = texto;
8989
+ exports.todos = todos;
8943
8990
  exports.todosEmCondicao = todosEmCondicao;
8944
8991
  exports.tupla = tupla;
8945
8992
  exports.vetor = vetor;
@@ -9937,40 +9984,68 @@ async function tamanho(interpretador, objeto) {
9937
9984
  async function texto(interpretador, valorParaConverter) {
9938
9985
  return Promise.resolve(`${valorParaConverter.hasOwnProperty('valor') ? valorParaConverter.valor : valorParaConverter}`);
9939
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
+ }
9940
10011
  /**
9941
10012
  * Retorna verdadeiro se todos os elementos do primeiro parâmetro retornam verdadeiro ao
9942
10013
  * serem aplicados como argumentos da função passada como segundo parâmetro.
9943
10014
  * @param {InterpretadorInterface} interpretador A instância do interpretador.
9944
- * @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.).
9945
10016
  * @param {VariavelInterface | any} funcaoCondicional A função que será executada com cada
9946
- * valor do vetor passado como primeiro parâmetro.
9947
- * @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
9948
10019
  * por parâmetro devolver verdadeiro, ou falso em caso contrário.
9949
10020
  */
9950
- async function todosEmCondicao(interpretador, vetor, funcaoCondicional) {
9951
- if (vetor === null || vetor === undefined)
9952
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9953
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9954
- linha: interpretador.linhaDeclaracaoAtual,
9955
- }, 'Parâmetro inválido. O primeiro parâmetro da função todosEmCondicao() não pode ser nulo.'));
9956
- const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
9957
- const valorFuncaoCondicional = funcaoCondicional.hasOwnProperty('valor')
9958
- ? funcaoCondicional.valor
9959
- : funcaoCondicional;
9960
- 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) {
9961
10030
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9962
10031
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9963
10032
  linha: interpretador.linhaDeclaracaoAtual,
9964
- }, '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.'));
9965
10034
  }
9966
- 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) {
9967
10039
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9968
10040
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9969
10041
  linha: interpretador.linhaDeclaracaoAtual,
9970
- }, '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.'));
9971
10043
  }
9972
- for (let indice = 0; indice < valorVetor.length; ++indice) {
9973
- 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))
9974
10049
  return false;
9975
10050
  }
9976
10051
  return true;
@@ -11003,16 +11078,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
11003
11078
  exports.AcessoIntervaloVariavel = void 0;
11004
11079
  /**
11005
11080
  * Construto para acesso de intervalos (fatiamento/slicing) em vetores.
11006
- * 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[:]
11007
11082
  */
11008
11083
  class AcessoIntervaloVariavel {
11009
- constructor(hashArquivo, entidadeChamada, indiceInicio, indiceFim, simboloFechamento, tipo = 'qualquer') {
11084
+ constructor(hashArquivo, entidadeChamada, indiceInicio, indiceFim, indicePasso, simboloFechamento, tipo = 'qualquer') {
11010
11085
  this.tipo = 'qualquer';
11011
11086
  this.linha = entidadeChamada.linha;
11012
11087
  this.hashArquivo = hashArquivo;
11013
11088
  this.entidadeChamada = entidadeChamada;
11014
11089
  this.indiceInicio = indiceInicio;
11015
11090
  this.indiceFim = indiceFim;
11091
+ this.indicePasso = indicePasso;
11016
11092
  this.simboloFechamento = simboloFechamento;
11017
11093
  this.tipo = tipo;
11018
11094
  }
@@ -11022,9 +11098,11 @@ class AcessoIntervaloVariavel {
11022
11098
  paraTexto() {
11023
11099
  const inicio = this.indiceInicio ? this.indiceInicio.paraTexto() : 'sem-início';
11024
11100
  const fim = this.indiceFim ? this.indiceFim.paraTexto() : 'sem-fim';
11101
+ const passo = this.indicePasso ? this.indicePasso.paraTexto() : 'sem-passo';
11025
11102
  return (`<acesso-índice-variável entidadeChamada=${this.entidadeChamada.paraTexto()} ` +
11026
11103
  `inicio=${inicio} ` +
11027
11104
  `fim=${fim}` +
11105
+ `passo=${passo}` +
11028
11106
  `/>`);
11029
11107
  }
11030
11108
  paraTextoSaida() {
@@ -15763,7 +15841,7 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
15763
15841
  pilhaEscoposExecucao.definirVariavel('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
15764
15842
  pilhaEscoposExecucao.definirVariavel('tamanho', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tamanho));
15765
15843
  pilhaEscoposExecucao.definirVariavel('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
15766
- pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
15844
+ pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
15767
15845
  pilhaEscoposExecucao.definirVariavel('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
15768
15846
  pilhaEscoposExecucao.definirVariavel('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
15769
15847
  pilhaEscoposExecucao.definirVariavel('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
@@ -39275,7 +39353,9 @@ class TradutorAssemblyScript {
39275
39353
  this.indentacao = 0;
39276
39354
  this.dicionarioConstrutos = {
39277
39355
  AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
39356
+ AcessoMetodo: this.traduzirConstrutoAcessoMetodo.bind(this),
39278
39357
  AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodo.bind(this),
39358
+ AcessoPropriedade: this.traduzirConstrutoAcessoPropriedade.bind(this),
39279
39359
  Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
39280
39360
  ArgumentoReferenciaFuncao: this.traduzirConstrutoArgumentoReferenciaFuncao.bind(this),
39281
39361
  AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
@@ -39283,19 +39363,34 @@ class TradutorAssemblyScript {
39283
39363
  Binario: this.traduzirConstrutoBinario.bind(this),
39284
39364
  Chamada: this.traduzirConstrutoChamada.bind(this),
39285
39365
  ComentarioComoConstruto: this.traduzirConstrutoComentario.bind(this),
39366
+ Deceto: this.traduzirConstrutoDeceto.bind(this),
39286
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),
39287
39372
  FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
39288
39373
  Isto: () => 'this',
39289
39374
  Literal: this.traduzirConstrutoLiteral.bind(this),
39290
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),
39291
39380
  ReferenciaFuncao: this.traduzirConstrutoReferenciaFuncao.bind(this),
39292
39381
  Separador: this.traduzirConstrutoSeparador.bind(this),
39382
+ SeTernario: this.traduzirConstrutoSeTernario.bind(this),
39383
+ Sexteto: this.traduzirConstrutoSexteto.bind(this),
39384
+ Septeto: this.traduzirConstrutoSepteto.bind(this),
39293
39385
  TipoDe: this.traduzirConstrutoTipoDe.bind(this),
39386
+ Trio: this.traduzirConstrutoTrio.bind(this),
39387
+ TuplaN: this.traduzirConstrutoTuplaN.bind(this),
39294
39388
  Unario: this.traduzirConstrutoUnario.bind(this),
39295
39389
  Variavel: this.traduzirConstrutoVariavel.bind(this),
39296
39390
  Vetor: this.traduzirConstrutoVetor.bind(this),
39297
39391
  };
39298
39392
  this.dicionarioDeclaracoes = {
39393
+ Ajuda: this.traduzirDeclaracaoAjuda.bind(this),
39299
39394
  Bloco: this.traduzirDeclaracaoBloco.bind(this),
39300
39395
  Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
39301
39396
  Comentario: this.traduzirConstrutoComentario.bind(this),
@@ -39315,8 +39410,13 @@ class TradutorAssemblyScript {
39315
39410
  Classe: this.traduzirDeclaracaoClasse.bind(this),
39316
39411
  Tente: this.traduzirDeclaracaoTente.bind(this),
39317
39412
  Const: this.traduzirDeclaracaoConst.bind(this),
39413
+ ConstMultiplo: this.traduzirDeclaracaoConstMultiplo.bind(this),
39318
39414
  Var: this.traduzirDeclaracaoVar.bind(this),
39415
+ VarMultiplo: this.traduzirDeclaracaoVarMultiplo.bind(this),
39319
39416
  Escreva: this.traduzirDeclaracaoEscreva.bind(this),
39417
+ EscrevaMesmaLinha: this.traduzirDeclaracaoEscrevaMesmaLinha.bind(this),
39418
+ TendoComo: this.traduzirDeclaracaoTendoComo.bind(this),
39419
+ TextoDocumentacao: this.traduzirDeclaracaoTextoDocumentacao.bind(this),
39320
39420
  };
39321
39421
  }
39322
39422
  traduzirSimboloOperador(operador) {
@@ -39332,7 +39432,7 @@ class TradutorAssemblyScript {
39332
39432
  case delegua_1.default.BIT_NOT:
39333
39433
  return '~';
39334
39434
  case delegua_1.default.DIFERENTE:
39335
- return '!==';
39435
+ return '!=';
39336
39436
  case delegua_1.default.DIVISAO:
39337
39437
  return '/';
39338
39438
  case delegua_1.default.E:
@@ -39342,7 +39442,7 @@ class TradutorAssemblyScript {
39342
39442
  case delegua_1.default.IGUAL:
39343
39443
  return '=';
39344
39444
  case delegua_1.default.IGUAL_IGUAL:
39345
- return '===';
39445
+ return '==';
39346
39446
  case delegua_1.default.MAIOR:
39347
39447
  return '>';
39348
39448
  case delegua_1.default.MAIOR_IGUAL:
@@ -39363,6 +39463,7 @@ class TradutorAssemblyScript {
39363
39463
  }
39364
39464
  traduzirFuncoesNativas(metodo) {
39365
39465
  switch (metodo.toLowerCase()) {
39466
+ // Array methods
39366
39467
  case 'adicionar':
39367
39468
  case 'empilhar':
39368
39469
  return 'push';
@@ -39371,6 +39472,7 @@ class TradutorAssemblyScript {
39371
39472
  case 'fatiar':
39372
39473
  return 'slice';
39373
39474
  case 'inclui':
39475
+ case 'incluido':
39374
39476
  return 'includes';
39375
39477
  case 'inverter':
39376
39478
  return 'reverse';
@@ -39384,16 +39486,126 @@ class TradutorAssemblyScript {
39384
39486
  return 'pop';
39385
39487
  case 'tamanho':
39386
39488
  return 'length';
39489
+ case 'indice':
39490
+ case 'indiceode':
39491
+ return 'indexOf';
39492
+ // String methods
39387
39493
  case 'maiusculo':
39388
39494
  return 'toUpperCase';
39389
39495
  case 'minusculo':
39390
39496
  return 'toLowerCase';
39391
39497
  case 'substituir':
39392
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';
39393
39550
  default:
39394
39551
  return metodo;
39395
39552
  }
39396
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
+ }
39397
39609
  traduzirConstrutoArgumentoReferenciaFuncao(argumentoReferenciaFuncao, argumentos) {
39398
39610
  const argumentosResolvidos = [];
39399
39611
  for (const argumento of argumentos) {
@@ -39418,7 +39630,7 @@ class TradutorAssemblyScript {
39418
39630
  return `${separador.conteudo} `;
39419
39631
  }
39420
39632
  traduzirDeclaracaoEscreva(declaracaoEscreva) {
39421
- let resultado = 'console.log(';
39633
+ let resultado = 'trace(';
39422
39634
  for (const argumento of declaracaoEscreva.argumentos) {
39423
39635
  const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
39424
39636
  resultado += valor + ', ';
@@ -39429,7 +39641,7 @@ class TradutorAssemblyScript {
39429
39641
  }
39430
39642
  traduzirConstrutoLiteral(literal) {
39431
39643
  if (typeof literal.valor === 'string')
39432
- return `'${literal.valor}'`;
39644
+ return `"${literal.valor}"`;
39433
39645
  return String(literal.valor);
39434
39646
  }
39435
39647
  resolveTipoDeclaracaoVarEContante(tipo) {
@@ -39437,25 +39649,67 @@ class TradutorAssemblyScript {
39437
39649
  case 'texto':
39438
39650
  return ': string';
39439
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';
39440
39660
  case 'numero':
39441
39661
  case 'número':
39442
39662
  case 'real':
39443
39663
  return ': f64';
39664
+ case 'real_curto':
39665
+ case 'realCurto':
39666
+ return ': f32';
39444
39667
  case 'logico':
39445
39668
  case 'lógico':
39446
39669
  return ': bool';
39670
+ case 'vazio':
39671
+ case 'nada':
39672
+ return ': void';
39447
39673
  case 'nulo':
39448
- return ': null';
39674
+ throw new Error(`Tipo 'nulo' não é válido no AssemblyScript. Use 'Type | null' para tipos anuláveis.`);
39449
39675
  case 'inteiro[]':
39676
+ return ': i32[]';
39677
+ case 'longo[]':
39678
+ return ': i64[]';
39450
39679
  case 'real[]':
39680
+ case 'numero[]':
39681
+ case 'número[]':
39451
39682
  return ': f64[]';
39452
39683
  case 'texto[]':
39453
39684
  return ': string[]';
39454
39685
  case 'logico[]':
39455
39686
  case 'lógico[]':
39456
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[]';
39457
39711
  default:
39458
- 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.`);
39459
39713
  }
39460
39714
  }
39461
39715
  traduzirDeclaracaoVar(declaracaoVar) {
@@ -39495,7 +39749,8 @@ class TradutorAssemblyScript {
39495
39749
  return resultado;
39496
39750
  }
39497
39751
  traduzirDeclaracaoTente(declaracaoTente) {
39498
- 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';
39499
39754
  this.indentacao += 4;
39500
39755
  resultado += ' '.repeat(this.indentacao);
39501
39756
  for (let condicao of declaracaoTente.caminhoTente) {
@@ -39531,6 +39786,81 @@ class TradutorAssemblyScript {
39531
39786
  }
39532
39787
  return resultado;
39533
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
+ }
39534
39864
  logicaComumBlocoEscopo(declaracoes) {
39535
39865
  let resultado = '{\n';
39536
39866
  this.indentacao += 4;
@@ -39614,10 +39944,38 @@ class TradutorAssemblyScript {
39614
39944
  return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
39615
39945
  }
39616
39946
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
39617
- 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} = `;
39618
39954
  resultado +=
39619
- this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + ') ';
39620
- 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;
39621
39979
  return resultado;
39622
39980
  }
39623
39981
  traduzirDeclaracaoPara(declaracaoPara) {
@@ -39646,19 +40004,89 @@ class TradutorAssemblyScript {
39646
40004
  }
39647
40005
  traduzirDeclaracaoFuncao(declaracaoFuncao) {
39648
40006
  let resultado = 'function ';
39649
- resultado += declaracaoFuncao.simbolo.lexema + ' (';
40007
+ resultado += declaracaoFuncao.simbolo.lexema + '(';
40008
+ // Adiciona parâmetros com tipos
39650
40009
  for (const parametro of declaracaoFuncao.funcao.parametros) {
39651
- 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 += ', ';
39652
40026
  }
39653
40027
  if (declaracaoFuncao.funcao.parametros.length > 0) {
39654
40028
  resultado = resultado.slice(0, -2);
39655
40029
  }
39656
- resultado += ') ';
40030
+ resultado += ')';
40031
+ // Adiciona tipo de retorno
40032
+ const tipoRetorno = this.inferirTipoRetornoFuncao(declaracaoFuncao.funcao);
40033
+ resultado += tipoRetorno;
40034
+ resultado += ' ';
39657
40035
  resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
39658
40036
  return resultado;
39659
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
+ }
39660
40088
  traduzirDeclaracaoFalhar(falhar) {
39661
- return `throw '${falhar.explicacao.valor}'`;
40089
+ return `abort('${falhar.explicacao.valor}')`;
39662
40090
  }
39663
40091
  traduzirDeclaracaoFazer(declaracaoFazer) {
39664
40092
  let resultado = 'do ';
@@ -39737,6 +40165,146 @@ class TradutorAssemblyScript {
39737
40165
  resultado += ']';
39738
40166
  return resultado;
39739
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
+ }
39740
40308
  traduzirConstrutoVariavel(variavel) {
39741
40309
  return variavel.simbolo.lexema;
39742
40310
  }
@@ -39754,20 +40322,13 @@ class TradutorAssemblyScript {
39754
40322
  return resultado;
39755
40323
  }
39756
40324
  traduzirConstrutoTipoDe(tipoDe) {
39757
- let resultado = 'typeof ';
39758
- if (typeof tipoDe.valor === 'string')
39759
- resultado += `'${tipoDe.valor}'`;
39760
- else if (tipoDe.valor instanceof construtos_1.Vetor)
39761
- resultado += this.traduzirConstrutoVetor(tipoDe.valor);
39762
- else
39763
- resultado += this.dicionarioConstrutos[tipoDe.valor.constructor.name](tipoDe.valor);
39764
- 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.');
39765
40326
  }
39766
40327
  traduzirConstrutoLogico(logico) {
39767
- let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
39768
- let operador = this.traduzirSimboloOperador(logico.operador);
39769
40328
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
39770
- 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}`;
39771
40332
  }
39772
40333
  traduzirFuncaoConstruto(funcaoConstruto) {
39773
40334
  let resultado = 'function(';
@@ -39792,6 +40353,15 @@ class TradutorAssemblyScript {
39792
40353
  }
39793
40354
  traduzirConstrutoChamada(chamada) {
39794
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
+ }
39795
40365
  const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
39796
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; });
39797
40367
  if (instanciaClasse) {
@@ -39827,6 +40397,12 @@ class TradutorAssemblyScript {
39827
40397
  return resultado;
39828
40398
  }
39829
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
+ }
39830
40406
  let resultado = '';
39831
40407
  if (binario.esquerda.constructor.name === 'Agrupamento')
39832
40408
  resultado +=
@@ -39852,16 +40428,23 @@ class TradutorAssemblyScript {
39852
40428
  ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
39853
40429
  return resultado;
39854
40430
  }
39855
- // TODO: Eliminar o soft cast para `any`.
39856
40431
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
39857
- var _a;
39858
40432
  let resultado = '';
39859
- 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 += '[';
39860
40442
  resultado +=
39861
40443
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
39862
40444
  resultado += ' = ';
39863
- if ((_a = (AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor).simbolo) === null || _a === void 0 ? void 0 : _a.lexema) {
39864
- 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;
39865
40448
  }
39866
40449
  else {
39867
40450
  resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);