@designliquido/delegua 0.47.0 → 0.48.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 (70) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts +2 -0
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  3. package/avaliador-sintatico/avaliador-sintatico.js +37 -4
  4. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  5. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +1 -1
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  9. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  10. package/bibliotecas/primitivas-dicionario.js +31 -10
  11. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  12. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  13. package/bibliotecas/primitivas-numero.js +27 -0
  14. package/bibliotecas/primitivas-numero.js.map +1 -1
  15. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  16. package/bibliotecas/primitivas-texto.js +125 -11
  17. package/bibliotecas/primitivas-texto.js.map +1 -1
  18. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  19. package/bibliotecas/primitivas-vetor.js +173 -12
  20. package/bibliotecas/primitivas-vetor.js.map +1 -1
  21. package/bin/package.json +1 -1
  22. package/declaracoes/para-cada.d.ts +3 -3
  23. package/declaracoes/para-cada.d.ts.map +1 -1
  24. package/declaracoes/para-cada.js +2 -2
  25. package/declaracoes/para-cada.js.map +1 -1
  26. package/formatadores/formatador-delegua.js +1 -1
  27. package/formatadores/formatador-delegua.js.map +1 -1
  28. package/informacao-variavel-ou-constante.d.ts +2 -2
  29. package/informacao-variavel-ou-constante.d.ts.map +1 -1
  30. package/informacao-variavel-ou-constante.js +2 -1
  31. package/informacao-variavel-ou-constante.js.map +1 -1
  32. package/interfaces/pilha-escopos-execucao-interface.d.ts +1 -0
  33. package/interfaces/pilha-escopos-execucao-interface.d.ts.map +1 -1
  34. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -0
  35. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  36. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +19 -65
  37. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  38. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -0
  39. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  40. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +14 -11
  41. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  42. package/interpretador/interpretador-base.d.ts +1 -0
  43. package/interpretador/interpretador-base.d.ts.map +1 -1
  44. package/interpretador/interpretador-base.js +48 -50
  45. package/interpretador/interpretador-base.js.map +1 -1
  46. package/interpretador/interpretador.d.ts +5 -2
  47. package/interpretador/interpretador.d.ts.map +1 -1
  48. package/interpretador/interpretador.js +145 -8
  49. package/interpretador/interpretador.js.map +1 -1
  50. package/interpretador/pilha-escopos-execucao.d.ts +1 -0
  51. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  52. package/interpretador/pilha-escopos-execucao.js +14 -0
  53. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  54. package/package.json +1 -1
  55. package/tradutores/tradutor-assembly-x64.js +13 -13
  56. package/tradutores/tradutor-assemblyscript.js +1 -1
  57. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  58. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  59. package/tradutores/tradutor-javascript.js +2 -1
  60. package/tradutores/tradutor-javascript.js.map +1 -1
  61. package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
  62. package/tradutores/tradutor-mermaidjs.js +2 -1
  63. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  64. package/tradutores/tradutor-python.d.ts.map +1 -1
  65. package/tradutores/tradutor-python.js +2 -1
  66. package/tradutores/tradutor-python.js.map +1 -1
  67. package/tradutores/tradutor-reverso-tenda.d.ts.map +1 -1
  68. package/tradutores/tradutor-reverso-tenda.js +2 -1
  69. package/tradutores/tradutor-reverso-tenda.js.map +1 -1
  70. package/umd/delegua.js +616 -106
package/umd/delegua.js CHANGED
@@ -1070,8 +1070,32 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1070
1070
  this.blocos -= 1;
1071
1071
  }
1072
1072
  }
1073
- declaracaoParaCada(simboloPara) {
1074
- const nomeVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
1073
+ declaracaoParaCadaDicionario(simboloPara) {
1074
+ this.avancarEDevolverAnterior(); // chave esquerda
1075
+ const nomeVariavelChave = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável para chave de iteração, em instrução 'para cada'.");
1076
+ this.consumir(delegua_2.default.VIRGULA, "Esperado vírgula após nome de variável para chave de iteração, em instrução 'para cada'.");
1077
+ const nomeVariavelValor = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável para valor de iteração, em instrução 'para cada'.");
1078
+ this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado chave direita após nome de variável para valor de iteração, em instrução 'para cada'.");
1079
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1080
+ 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'.");
1081
+ }
1082
+ const dicionario = this.expressao();
1083
+ if (!dicionario.hasOwnProperty('tipo')) {
1084
+ throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece ser um dicionário.`);
1085
+ }
1086
+ const tipoDicionario = dicionario.tipo;
1087
+ if (tipoDicionario !== 'dicionário') {
1088
+ throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é um dicionário. Tipo resolvido: ${tipoDicionario}.`);
1089
+ }
1090
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelChave.lexema, 'qualquer'));
1091
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelValor.lexema, 'qualquer'));
1092
+ // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1093
+ const corpo = this.resolverDeclaracao();
1094
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new tuplas_1.Dupla(new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelChave.lexema), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelValor.lexema)), dicionario, corpo);
1095
+ }
1096
+ declaracaoParaCadaVetor(simboloPara) {
1097
+ const nomeVariavelIteracao = this.avancarEDevolverAnterior();
1098
+ const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao);
1075
1099
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1076
1100
  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'.");
1077
1101
  }
@@ -1080,7 +1104,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1080
1104
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece possuir um tipo iterável.`);
1081
1105
  }
1082
1106
  const tipoVetor = vetor.tipo;
1083
- if (!tipoVetor.endsWith('[]') && !['qualquer', 'vetor'].includes(tipoVetor)) {
1107
+ if (!tipoVetor.endsWith('[]') && !['dicionário', 'qualquer', 'vetor'].includes(tipoVetor)) {
1084
1108
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
1085
1109
  }
1086
1110
  let tipoVariavelIteracao = 'qualquer';
@@ -1090,7 +1114,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1090
1114
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
1091
1115
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
1092
1116
  const corpo = this.resolverDeclaracao();
1093
- return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
1117
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, vetor, corpo);
1118
+ }
1119
+ declaracaoParaCada(simboloPara) {
1120
+ if (this.verificarTipoSimboloAtual(delegua_2.default.IDENTIFICADOR)) {
1121
+ return this.declaracaoParaCadaVetor(simboloPara);
1122
+ }
1123
+ if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
1124
+ return this.declaracaoParaCadaDicionario(simboloPara);
1125
+ }
1126
+ throw this.erro(simboloPara, 'Identificador de iteração deve ser ou um par chave-valor, ou um nome de variável.');
1094
1127
  }
1095
1128
  declaracaoParaTradicional(simboloPara) {
1096
1129
  const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
@@ -3231,7 +3264,7 @@ class AvaliadorSintaticoPitugues {
3231
3264
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
3232
3265
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
3233
3266
  const corpo = this.resolverDeclaracao();
3234
- return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
3267
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
3235
3268
  }
3236
3269
  declaracaoParaTradicional(simboloPara) {
3237
3270
  let inicializador;
@@ -4438,7 +4471,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
4438
4471
  this.pilhaEscopos.definirInformacoesVariavel(simboloVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloVariavelIteracao.lexema, tipoVariavelIteracao));
4439
4472
  this.consumir(tenda_1.default.FAÇA, "Esperado palavra reservada 'faça' após literal ou variável de iteração em declaração 'para cada'.");
4440
4473
  const corpo = this.blocoEscopo();
4441
- return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloParaCada.linha), simboloVariavelIteracao.lexema, literalOuVariavelIteravel, new declaracoes_1.Bloco(simboloParaCada.hashArquivo, simboloParaCada.linha, corpo));
4474
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloParaCada.linha), new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao), literalOuVariavelIteravel, new declaracoes_1.Bloco(simboloParaCada.hashArquivo, simboloParaCada.linha, corpo));
4442
4475
  }
4443
4476
  declaracaoParaTradicional(simboloPara, simboloVariavelIteracao, literalOuVariavelInicio) {
4444
4477
  this.consumir(tenda_1.default.ATÉ, "Esperado palavra reservada 'até' após literal ou identificador de início de declaração 'para cada'.");
@@ -5801,6 +5834,25 @@ async function tupla(interpretador, vetor) {
5801
5834
  "use strict";
5802
5835
  Object.defineProperty(exports, "__esModule", { value: true });
5803
5836
  const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-constante");
5837
+ const contemComum = (nome) => {
5838
+ return {
5839
+ tipoRetorno: 'lógico',
5840
+ argumentos: [
5841
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('chave', 'qualquer', true, [], 'O elemento como chave do dicionário.')
5842
+ ],
5843
+ implementacao: (interpretador, valor, chave) => Promise.resolve(chave in valor),
5844
+ assinaturaFormato: `dicionário.${nome}(chave: qualquer)`,
5845
+ documentacao: `# \`dicionário.${nome}(chave)\`\n\n` +
5846
+ 'Retorna verdadeiro se o elemento passado como parâmetro existe como chave do dicionário. Devolve falso em caso contrário.\n' +
5847
+ '\n\n ## Exemplo de Código\n' +
5848
+ '\n\n```delegua\n' +
5849
+ 'var d = {"a": 1, "b": 2, "c": 3}\n' +
5850
+ `escreva(d.${nome}("a")) // verdadeiro\n` +
5851
+ `escreva(d.${nome}("f")) // falso\n\`\`\`` +
5852
+ '\n\n## Formas de uso\n',
5853
+ exemploCodigo: 'dicionário.contem("minhaChave")'
5854
+ };
5855
+ };
5804
5856
  exports.default = {
5805
5857
  chaves: {
5806
5858
  tipoRetorno: 'texto[]',
@@ -5808,21 +5860,23 @@ exports.default = {
5808
5860
  implementacao: (interpretador, valor) => {
5809
5861
  return Promise.resolve(Object.keys(valor));
5810
5862
  },
5863
+ assinaturaFormato: 'dicionário.chaves()',
5864
+ documentacao: '# `dicionário.chaves()`\n\n' +
5865
+ 'Retorna um vetor de texto com todas as chaves de um dicionário.\n' +
5866
+ '\n\n ## Exemplo de Código\n' +
5867
+ '\n\n```delegua\n' +
5868
+ 'var d = {"a": 1, "b": 2, "c": 3}\n' +
5869
+ 'escreva(d.chaves()) // ["a", "b", "c"]\n```' +
5870
+ '\n\n## Formas de uso\n',
5871
+ exemploCodigo: 'dicionário.chaves()'
5811
5872
  },
5812
- contem: {
5813
- tipoRetorno: 'lógico',
5814
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('chave', 'texto')],
5815
- implementacao: (interpretador, valor, chave) => Promise.resolve(chave in valor),
5816
- },
5817
- contém: {
5818
- tipoRetorno: 'lógico',
5819
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('chave', 'texto')],
5820
- implementacao: (interpretador, valor, chave) => Promise.resolve(chave in valor),
5821
- },
5873
+ contem: contemComum('contem'),
5874
+ contém: contemComum('contém'),
5822
5875
  remover: {
5823
5876
  tipoRetorno: 'lógico',
5824
5877
  argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('chave', 'texto')],
5825
5878
  implementacao: (interpretador, valor, chave) => Promise.resolve(delete valor[chave]),
5879
+ assinaturaFormato: `dicionário.remover(chave: qualquer)`,
5826
5880
  },
5827
5881
  valores: {
5828
5882
  tipoRetorno: 'qualquer[]',
@@ -5843,6 +5897,15 @@ exports.default = {
5843
5897
  implementacao: (interpretador, valor) => {
5844
5898
  return Promise.resolve(Math.abs(valor));
5845
5899
  },
5900
+ assinaturaFormato: 'número.absoluto()',
5901
+ documentacao: '# `número.absoluto()`\n\n' +
5902
+ 'Retorna a versão absoluta de um número, ou seja, seu valor sem sinal.' +
5903
+ '\n\n ## Exemplo de Código\n' +
5904
+ '\n\n```delegua\n' +
5905
+ 'var n = -5\n' +
5906
+ 'escreva(n.absoluto()) // 5\n```' +
5907
+ '\n\n## Formas de uso\n',
5908
+ exemploCodigo: 'numero.absoluto()'
5846
5909
  },
5847
5910
  arredondarParaBaixo: {
5848
5911
  tipoRetorno: 'número',
@@ -5850,6 +5913,15 @@ exports.default = {
5850
5913
  implementacao: (interpretador, valor) => {
5851
5914
  return Promise.resolve(Math.floor(valor));
5852
5915
  },
5916
+ assinaturaFormato: 'número.arredondarParaBaixo()',
5917
+ documentacao: '# `número.arredondarParaBaixo()`\n\n' +
5918
+ 'Retira as partes decimais de um número com partes decimais e retorna sua parte inteira. Se o número já é inteiro, devolve apenas o próprio número.' +
5919
+ '\n\n ## Exemplo de Código\n' +
5920
+ '\n\n```delegua\n' +
5921
+ 'var n = 2.5\n' +
5922
+ 'escreva(n.arredondarParaBaixo()) // 2\n```' +
5923
+ '\n\n## Formas de uso\n',
5924
+ exemploCodigo: 'numero.arredondarParaBaixo()'
5853
5925
  },
5854
5926
  arredondarParaCima: {
5855
5927
  tipoRetorno: 'número',
@@ -5857,6 +5929,15 @@ exports.default = {
5857
5929
  implementacao: (interpretador, valor) => {
5858
5930
  return Promise.resolve(Math.ceil(valor));
5859
5931
  },
5932
+ assinaturaFormato: 'número.arredondarParaCima()',
5933
+ documentacao: '# `número.arredondarParaCima()`\n\n' +
5934
+ 'Arredonda um número com partes decimais para cima, ou seja, para o próximo número inteiro.' +
5935
+ '\n\n ## Exemplo de Código\n' +
5936
+ '\n\n```delegua\n' +
5937
+ 'var n = 2.5\n' +
5938
+ 'escreva(n.arredondarParaCima()) // 3\n```' +
5939
+ '\n\n## Formas de uso\n',
5940
+ exemploCodigo: 'numero.arredondarParaCima()'
5860
5941
  },
5861
5942
  };
5862
5943
 
@@ -5869,27 +5950,62 @@ exports.default = {
5869
5950
  tipoRetorno: 'texto',
5870
5951
  argumentos: [],
5871
5952
  implementacao: (interpretador, texto) => Promise.resolve(texto.trim()),
5953
+ assinaturaFormato: 'texto.aparar()',
5954
+ documentacao: '# `texto.aparar()` \n \n' +
5955
+ 'Remove espaços em branco no início e no fim de um texto.' +
5956
+ '\n\n ## Exemplo de Código\n' +
5957
+ '\n\n```delegua\nvar t = " meu texto com espaços no início e no fim "\n' +
5958
+ 'escreva("|" + t.aparar() + "|") // "|meu texto com espaços no início e no fim|"\n```' +
5959
+ '\n\n ### Formas de uso \n',
5960
+ exemploCodigo: 'texto.aparar()'
5872
5961
  },
5873
5962
  apararFim: {
5874
5963
  tipoRetorno: 'texto',
5875
5964
  argumentos: [],
5876
5965
  implementacao: (interpretador, texto) => Promise.resolve(texto.trimEnd()),
5966
+ assinaturaFormato: 'texto.apararFim()',
5967
+ documentacao: '# `texto.apararFim()` \n \n' +
5968
+ 'Remove espaços em branco no no fim de um texto.' +
5969
+ '\n\n ## Exemplo de Código\n' +
5970
+ '\n\n```delegua\nvar t = " meu texto com espaços no início e no fim "\n' +
5971
+ 'escreva("|" + t.apararFim() + "|") // "| meu texto com espaços no início e no fim|"\n```' +
5972
+ '\n\n ### Formas de uso \n',
5973
+ exemploCodigo: 'texto.apararFim()'
5877
5974
  },
5878
5975
  apararInicio: {
5879
5976
  tipoRetorno: 'texto',
5880
5977
  argumentos: [],
5881
5978
  implementacao: (interpretador, texto) => Promise.resolve(texto.trimStart()),
5979
+ assinaturaFormato: 'texto.apararInicio()',
5980
+ documentacao: '# `texto.apararInicio()` \n \n' +
5981
+ 'Remover espaços em branco no início e no fim de um texto.' +
5982
+ '\n\n ## Exemplo de Código\n' +
5983
+ '\n\n```delegua\nvar t = " meu texto com espaços no início e no fim "\n' +
5984
+ 'escreva("|" + t.apararInicio() + "|") // "|meu texto com espaços no início e no fim |"\n```' +
5985
+ '\n\n ### Formas de uso \n',
5986
+ exemploCodigo: 'texto.apararInicio()'
5882
5987
  },
5883
5988
  concatenar: {
5884
5989
  tipoRetorno: 'texto',
5885
- argumentos: [],
5990
+ argumentos: [
5991
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroTexto', 'texto', true, [], 'O texto a ser concatenado.')
5992
+ ],
5886
5993
  implementacao: (interpretador, ...texto) => Promise.resolve(''.concat(...texto)),
5994
+ assinaturaFormato: 'texto.concatenar(...outroTexto: texto)',
5995
+ documentacao: '# `texto.concatenar(outroTexto)` \n \n' +
5996
+ 'Realiza a junção de palavras/textos.' +
5997
+ '\n\n ## Exemplo de Código\n' +
5998
+ '\n\n```delegua\nvar t1 = "um"\n' +
5999
+ 'var t2 = "dois três"\n' +
6000
+ 'escreva(t1.concatenar(t2)) // "umdois três"\n```' +
6001
+ '\n\n ### Formas de uso \n',
6002
+ exemploCodigo: 'texto.concatenar(outroTexto)'
5887
6003
  },
5888
6004
  dividir: {
5889
6005
  tipoRetorno: 'texto[]',
5890
6006
  argumentos: [
5891
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('divisor', 'texto'),
5892
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número'),
6007
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('delimitador', 'texto', true, [], 'O delimitador usado para dividir o texto.'),
6008
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número', false, [], '(Opcional) Número limite de elementos a serem retornados.'),
5893
6009
  ],
5894
6010
  implementacao: (interpretador, texto, divisor, limite) => {
5895
6011
  if (limite) {
@@ -5897,55 +6013,134 @@ exports.default = {
5897
6013
  }
5898
6014
  return Promise.resolve(texto.split(divisor));
5899
6015
  },
6016
+ assinaturaFormato: 'texto.dividir(delimitador: texto, limite?: inteiro)',
6017
+ documentacao: '# `texto.dividir(delimitador)` \n \n' +
6018
+ 'Divide o texto pelo separador passado como parâmetro.' +
6019
+ '\n\n ## Exemplo de Código\n' +
6020
+ '\n\n```delegua\nvar t = "um dois três"\n' +
6021
+ 't.dividir(\' \') // [\'um\',\'dois\',\'três\']\n```' +
6022
+ '\n\n ### Formas de uso \n',
6023
+ exemploCodigo: 'texto.dividir(\'<delimitador (, ; \' \')>\')'
5900
6024
  },
5901
6025
  fatiar: {
5902
6026
  tipoRetorno: 'texto',
5903
6027
  argumentos: [
5904
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
5905
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
6028
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número', true, [], 'A posição inicial da fatia.'),
6029
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número', false, [], '(Opcional) A posição final da fatia. Se não fornecido, seleciona até o final do texto.'),
5906
6030
  ],
5907
6031
  implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
6032
+ assinaturaFormato: 'texto.fatiar(inicio: número, fim?: número)',
6033
+ documentacao: '# `texto.fatiar(inicio)` \n \n' +
6034
+ 'Extrai uma fatia do texto, dadas posições de início e fim.' +
6035
+ '\n\n ## Exemplo de Código\n' +
6036
+ '\n\n```delegua\nvar t = "Um dois três quatro"\n' +
6037
+ 't.fatiar() // "um dois três quatro", ou seja, não faz coisa alguma.\n' +
6038
+ 't.fatiar(2, 7) // "dois"\n' +
6039
+ 't.fatiar(8, 12) // "três"\n' +
6040
+ 't.fatiar(8) // "três quatro", ou seja, seleciona tudo da posição 8 até o final do texto.\n```' +
6041
+ '\n\n ### Formas de uso \n',
6042
+ exemploCodigo: 'texto.fatiar(início, final)\n' +
6043
+ 'texto.fatiar(aPartirDaPosicao)'
5908
6044
  },
5909
6045
  inclui: {
5910
6046
  tipoRetorno: 'texto',
5911
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')],
6047
+ argumentos: [
6048
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto', true, [], 'O elemento a ser verificado se está contido no texto.')
6049
+ ],
5912
6050
  implementacao: (interpretador, texto, elemento) => Promise.resolve(texto.includes(elemento)),
6051
+ assinaturaFormato: 'inclui(elemento: texto)',
6052
+ documentacao: '# `texto.inclui(elemento)` \n \n' +
6053
+ 'Devolve verdadeiro se elemento passado por parâmetro está contido no texto, e falso em caso contrário.' +
6054
+ '\n\n ## Exemplo de Código\n' +
6055
+ '\n\n```delegua\nvar t = "um dois três"\n' +
6056
+ 't.inclui("dois") // verdadeiro\n' +
6057
+ 't.inclui("quatro") // falso\n```' +
6058
+ '\n\n ### Formas de uso \n',
6059
+ exemploCodigo: 'texto.inclui(\'palavra\')'
5913
6060
  },
5914
6061
  inverter: {
5915
6062
  tipoRetorno: 'texto',
5916
6063
  argumentos: [],
5917
6064
  implementacao: (interpretador, texto) => Promise.resolve(texto.split('').reduce((texto, caracter) => (texto = caracter + texto), '')),
6065
+ assinaturaFormato: 'texto.inverter()',
6066
+ documentacao: '# `texto.inverter()` \n \n' +
6067
+ 'Inverte as letras de um texto.' +
6068
+ '\n\n ## Exemplo de Código\n' +
6069
+ '\n\n```delegua\nvar t = "um dois três"\n' +
6070
+ 't.inverter() // "sêrt siod mu"```' +
6071
+ '\n\n ### Formas de uso \n',
6072
+ exemploCodigo: 'texto.inverter()'
5918
6073
  },
5919
6074
  maiusculo: {
5920
6075
  tipoRetorno: 'texto',
5921
6076
  argumentos: [],
5922
6077
  implementacao: (interpretador, texto) => Promise.resolve(texto.toUpperCase()),
6078
+ assinaturaFormato: 'texto.maiusculo()',
6079
+ documentacao: '# `texto.maiusculo()` \n \n' +
6080
+ 'Converte todos os caracteres alfabéticos para suas respectivas formas em maiúsculo.' +
6081
+ '\n\n ## Exemplo de Código\n' +
6082
+ '\n\n```delegua\nvar t = "tudo em minúsculo"\n' +
6083
+ 'escreva(t.maiusculo()) // "TUDO EM MINÚSCULO"\n```' +
6084
+ '\n\n ### Formas de uso \n',
6085
+ exemploCodigo: 'texto.maiusculo()'
5923
6086
  },
5924
6087
  minusculo: {
5925
6088
  tipoRetorno: 'texto',
5926
6089
  argumentos: [],
5927
6090
  implementacao: (interpretador, texto) => Promise.resolve(texto.toLowerCase()),
6091
+ assinaturaFormato: 'texto.minusculo()',
6092
+ documentacao: '# `texto.minusculo()` \n \n' +
6093
+ 'Converte todos os caracteres alfabéticos para suas respectivas formas em minúsculo.' +
6094
+ '\n\n ## Exemplo de Código\n' +
6095
+ '\n\n```delegua\nvar t = "TUDO EM MAIÚSCULO"\n' +
6096
+ 'escreva(t.minusculo()) // "tudo em maiúsculo"\n```' +
6097
+ '\n\n ### Formas de uso \n',
6098
+ exemploCodigo: 'texto.minusculo()'
5928
6099
  },
5929
6100
  substituir: {
5930
6101
  tipoRetorno: 'texto',
5931
6102
  argumentos: [
5932
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto'),
5933
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto'),
6103
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('textoASerSubstituido', 'texto', true, [], 'Texto a ser substituído.'),
6104
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto', true, [], 'A substituição'),
5934
6105
  ],
5935
6106
  implementacao: (interpretador, texto, elemento, substituto) => Promise.resolve(texto.replace(elemento, substituto)),
6107
+ assinaturaFormato: 'texto.substituir(textoASerSubstituido: texto, substituto: texto)',
6108
+ documentacao: '# `texto.substituir(textoASerSubstituido, substituto)` \n \n' +
6109
+ 'Substitui a primeira ocorrência no texto do primeiro parâmetro pelo segundo parâmetro.' +
6110
+ '\n\n ## Exemplo de Código\n' +
6111
+ '\n\n```delegua\nvar t = "Eu gosto de caju"\n' +
6112
+ 't.substituir("caju", "graviola") // Resultado será "Eu gosto de graviola"\n```' +
6113
+ '\n\n ### Formas de uso \n',
6114
+ exemploCodigo: 'texto.substituir(\'palavra a ser substituída\',\'nova palavra\')'
5936
6115
  },
5937
6116
  subtexto: {
5938
6117
  tipoRetorno: 'texto',
5939
6118
  argumentos: [
5940
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
5941
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
6119
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'inteiro', true, [], 'A posição de início do texto a ser extraído.'),
6120
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'inteiro', true, [], 'A posição de fim do texto a ser extraído.'),
5942
6121
  ],
5943
6122
  implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
6123
+ assinaturaFormato: 'texto.subtexto(inicio: inteiro, fim: inteiro)',
6124
+ documentacao: '# `texto.subtexto(inicio, fim)` \n\n' +
6125
+ 'Extrai uma fatia do texto, dadas posições de início e fim.' +
6126
+ '\n\n ## Exemplo de Código\n' +
6127
+ '\n\n```delegua\nvar t = "Eu gosto de caju e de graviola"\n' +
6128
+ 't.subtexto(3, 16) // Resultado será "gosto de caju"\n```' +
6129
+ '\n\n ### Formas de uso \n',
6130
+ exemploCodigo: 'texto.subtexto(posiçãoInicial, posiçãoFinal)'
5944
6131
  },
5945
6132
  tamanho: {
5946
- tipoRetorno: 'número',
6133
+ tipoRetorno: 'inteiro',
5947
6134
  argumentos: [],
5948
6135
  implementacao: (interpretador, texto) => Promise.resolve(texto.length),
6136
+ assinaturaFormato: 'texto.tamanho()',
6137
+ documentacao: '# `texto.tamanho()` \n\n' +
6138
+ 'Devolve um número inteiro com o número de caracteres do texto.' +
6139
+ '\n\n ## Exemplo de Código\n' +
6140
+ '\n\n```delegua\nvar t = "Um dois três quatro"\n' +
6141
+ 't.tamanho() // 19\n```' +
6142
+ '\n\n ### Formas de uso \n',
6143
+ exemploCodigo: 'texto.tamanho()'
5949
6144
  },
5950
6145
  };
5951
6146
 
@@ -5956,31 +6151,66 @@ const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-co
5956
6151
  exports.default = {
5957
6152
  adicionar: {
5958
6153
  tipoRetorno: 'qualquer[]',
5959
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
6154
+ argumentos: [
6155
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer', true, [], 'Os elementos a serem adicionados ao vetor.')
6156
+ ],
5960
6157
  implementacao: (interpretador, vetor, elemento) => {
5961
6158
  vetor.push(elemento);
5962
6159
  return Promise.resolve(vetor);
5963
6160
  },
6161
+ assinaturaFormato: 'vetor.adicionar(...elemento: qualquer)',
6162
+ documentacao: '# `vetor.adicionar(elemento)` \n \n' +
6163
+ 'Adiciona um ou mais elementos em um vetor.' +
6164
+ '\n\n ## Exemplo de Código\n' +
6165
+ '```delegua\nv.adicionar(7)\n' +
6166
+ 'v.adicionar(5)\n' +
6167
+ 'v.adicionar(3)\n' +
6168
+ 'escreva(v) // [7, 5, 3]\n```' +
6169
+ '\n\n ### Formas de uso \n',
6170
+ exemploCodigo: 'vetor.adicionar(elemento)'
5964
6171
  },
5965
6172
  concatenar: {
5966
6173
  tipoRetorno: 'qualquer[]',
5967
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')],
6174
+ argumentos: [
6175
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]', true, [], 'O outro vetorm ou outros vetores, a serem concatenados a este vetor.')
6176
+ ],
5968
6177
  implementacao: (interpretador, vetor, outroVetor) => {
5969
6178
  return Promise.resolve(vetor.concat(outroVetor));
5970
6179
  },
6180
+ assinaturaFormato: 'vetor.concatenar(...outroVetor: qualquer[])',
6181
+ documentacao: '# `vetor.concatenar(outroVetor)` \n \n' +
6182
+ 'Adiciona ao conteúdo do vetor um ou mais elementos' +
6183
+ '\n\n ## Exemplo de Código\n' +
6184
+ '\n\n```delegua\nvar v = [7, 5, 3]\n' +
6185
+ 'escreva(v.concatenar([1, 2, 4])) // [7, 5, 3, 1, 2, 4]\n```' +
6186
+ '\n\n ### Formas de uso \n',
6187
+ exemploCodigo: 'vetor.concatenar(...argumentos)'
5971
6188
  },
5972
6189
  empilhar: {
5973
6190
  tipoRetorno: 'qualquer[]',
5974
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
6191
+ argumentos: [
6192
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer', true, [], '')
6193
+ ],
5975
6194
  implementacao: (interpretador, vetor, elemento) => {
5976
6195
  vetor.push(elemento);
5977
6196
  return Promise.resolve(vetor);
5978
6197
  },
6198
+ assinaturaFormato: 'vetor.empilhar(elemento: qualquer)',
6199
+ documentacao: '# `vetor.empilhar(elemento)` \n \n' +
6200
+ 'Adiciona um elemento ao final do vetor, como se o vetor fosse uma pilha na vertical.' +
6201
+ '\n\n ## Exemplo de Código\n' +
6202
+ '\n\n```delegua\nvar v = []\n' +
6203
+ 'v.empilhar(7)\n' +
6204
+ 'v.empilhar(5)\n' +
6205
+ 'v.empilhar(3)\n' +
6206
+ 'escreva(v) // [7, 5, 3]\n```' +
6207
+ '\n\n ### Formas de uso \n',
6208
+ exemploCodigo: 'vetor.empilhar(elemento)'
5979
6209
  },
5980
6210
  encaixar: {
5981
6211
  tipoRetorno: 'qualquer[]',
5982
6212
  argumentos: [
5983
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'qualquer'),
6213
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'inteiro'),
5984
6214
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('excluirQuantidade', 'número'),
5985
6215
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]'),
5986
6216
  ],
@@ -6000,14 +6230,28 @@ exports.default = {
6000
6230
  fatiar: {
6001
6231
  tipoRetorno: 'qualquer[]',
6002
6232
  argumentos: [
6003
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
6004
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
6233
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número', false, [], 'A posição de início do vetor a ser fatiado. Se não fornecido, retorna o vetor inteiro.'),
6234
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número', false, [], 'A posição de fim do vetor a ser fatiado.'),
6005
6235
  ],
6006
6236
  implementacao: (interpretador, vetor, inicio, fim) => Promise.resolve(vetor.slice(inicio, fim)),
6237
+ assinaturaFormato: 'vetor.fatiar(inicio?: número, fim?: número)',
6238
+ documentacao: '# `vetor.fatiar(inicio, fim)` \n \n' +
6239
+ 'Extrai uma fatia do vetor, dadas posições de início e fim. \n' +
6240
+ '\n\n ## Exemplo de Código\n' +
6241
+ '\n\n```delegua\nvar v = [1, 2, 3, 4, 5]\n' +
6242
+ 'escreva(v.fatiar()) // "[1, 2, 3, 4, 5]", ou seja, não faz coisa alguma.\n' +
6243
+ 'escreva(v.fatiar(2, 4)) // "[3, 4]"\n' +
6244
+ 'escreva(v.fatiar(2)) // "[3, 4, 5]", ou seja, seleciona tudo da posição 3 até o final do vetor.\n```' +
6245
+ '\n\n ### Formas de uso \n' +
6246
+ 'Fatiar suporta sobrecarga do método.\n\n',
6247
+ exemploCodigo: 'vetor.fatiar(<a partir desta posição>)\n' +
6248
+ 'vetor.fatiar(<a partir desta posição>, <até esta posição>)'
6007
6249
  },
6008
6250
  filtrarPor: {
6009
6251
  tipoRetorno: 'qualquer[]',
6010
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
6252
+ argumentos: [
6253
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função', true, [], 'A função de filtragem.')
6254
+ ],
6011
6255
  implementacao: async (interpretador, vetor, funcao) => {
6012
6256
  if (funcao === undefined || funcao === null) {
6013
6257
  return Promise.reject("É necessário passar uma função para o método 'filtrarPor'");
@@ -6020,25 +6264,66 @@ exports.default = {
6020
6264
  }
6021
6265
  return retorno;
6022
6266
  },
6267
+ assinaturaFormato: 'vetor.filtrarPor(funcao: função)',
6268
+ documentacao: '# `vetor.filtrarPor(funcao)` \n \n' +
6269
+ 'Dada uma função passada como parâmetro, executa essa função para cada elemento do vetor. \n' +
6270
+ 'Elementos cujo retorno da função é `falso` são excluídos. \n' +
6271
+ '\n\n ### Exemplo de Código\n' +
6272
+ '\n\n```delegua\nvar v = [1, 2, 3, 4, 5]\n' +
6273
+ 'var funcaoNumerosImpares = funcao (n) { retorna n % 2 > 0 }\n' +
6274
+ 'escreva(v.filtrarPor(funcaoNumerosImpares)) // "[1, 3, 5]"\n```' +
6275
+ '\n\n ### Formas de uso \n',
6276
+ exemploCodigo: 'vetor.filtrarPor(funcao (argumento) { <corpo da função com retorna> })'
6023
6277
  },
6024
6278
  inclui: {
6025
6279
  tipoRetorno: 'lógico',
6026
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
6280
+ argumentos: [
6281
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer', true, [], 'O elemento a ser verificado se está presente no vetor.')
6282
+ ],
6027
6283
  implementacao: (interpretador, vetor, elemento) => Promise.resolve(vetor.includes(elemento)),
6284
+ assinaturaFormato: 'vetor.inclui(elemento: qualquer)',
6285
+ documentacao: '# `vetor.inclui(elemento)` \n \n' +
6286
+ 'Verifica se o elemento existe no vetor. Devolve `verdadeiro` se existe, e `falso` em caso contrário.\n' +
6287
+ '\n\n ## Exemplo de Código\n' +
6288
+ '\n\n```delegua\nvar v = [1, 2, 3]\n' +
6289
+ 'escreva(v.inclui(2)) // verdadeiro\n' +
6290
+ 'escreva(v.inclui(4)) // falso\n```' +
6291
+ '\n\n ### Formas de uso \n',
6292
+ exemploCodigo: 'vetor.inclui(elemento)'
6028
6293
  },
6029
6294
  inverter: {
6030
6295
  tipoRetorno: 'qualquer[]',
6031
6296
  argumentos: [],
6032
6297
  implementacao: (interpretador, vetor) => Promise.resolve(vetor.reverse()),
6298
+ assinaturaFormato: 'vetor.inverter()',
6299
+ documentacao: '# `vetor.inverter()` \n \n' +
6300
+ 'Inverte a ordem dos elementos de um vetor.\n' +
6301
+ '\n\n ## Exemplo de Código\n' +
6302
+ '\n\n```delegua\nvar v = [1, 2, 3]\n' +
6303
+ 'escreva(v.inverter()) // [3, 2, 1]\n```' +
6304
+ '\n\n ### Formas de uso \n',
6305
+ exemploCodigo: 'vetor.inverter()'
6033
6306
  },
6034
6307
  juntar: {
6035
6308
  tipoRetorno: 'texto',
6036
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')],
6309
+ argumentos: [
6310
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto', true, [], 'O separador entre elementos do vetor para o texto.')
6311
+ ],
6037
6312
  implementacao: (interpretador, vetor, separador) => Promise.resolve(vetor.join(separador)),
6313
+ assinaturaFormato: 'vetor.juntar(separador: texto)',
6314
+ documentacao: '# `vetor.juntar(separador)` \n \n' +
6315
+ 'Junta todos os elementos de um vetor em um texto, separando cada elemento pelo separador passado como parâmetro.\n' +
6316
+ '\n\n ## Exemplo de Código\n' +
6317
+ '\n\n```delegua\nvar v = [1, 2, 3]\n' +
6318
+ 'escreva(v.juntar(":")) // "1:2:3"\n```' +
6319
+ '\n\n ### Formas de uso \n',
6320
+ exemploCodigo: 'vetor.juntar()'
6038
6321
  },
6039
6322
  mapear: {
6040
6323
  tipoRetorno: 'qualquer[]',
6041
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
6324
+ argumentos: [
6325
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função', true, [], 'A função que transforma cada elemento de um vetor em outro elemento a ser retornado em um novo vetor.')
6326
+ ],
6042
6327
  implementacao: async (interpretador, vetor, funcao) => {
6043
6328
  if (funcao === undefined || funcao === null) {
6044
6329
  return Promise.reject("É necessário passar uma função para o método 'mapear'");
@@ -6050,10 +6335,22 @@ exports.default = {
6050
6335
  }
6051
6336
  return retorno;
6052
6337
  },
6338
+ assinaturaFormato: 'vetor.mapear(funcao: função)',
6339
+ documentacao: '# `vetor.mapear(funcao)` \n \n' +
6340
+ 'Dada uma função passada como parâmetro, executa essa função para cada elemento do vetor. \n' +
6341
+ 'Cada elemento retornado por esta função é adicionado ao vetor resultante. \n' +
6342
+ '\n\n ## Exemplo de Código\n' +
6343
+ '\n\n```delegua\nvar v = [1, 2, 3, 4, 5]\n' +
6344
+ 'var funcaoPotenciasDeDois = funcao (n) { retorna n ** 2 }\n' +
6345
+ 'escreva(v.mapear(funcaoPotenciasDeDois)) // [1, 4, 9, 16, 25]\n```' +
6346
+ '\n\n ### Formas de uso \n',
6347
+ exemploCodigo: 'vetor.mapear(funcao (argumento) { <corpo da função com retorna> })'
6053
6348
  },
6054
6349
  ordenar: {
6055
6350
  tipoRetorno: 'qualquer[]',
6056
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')],
6351
+ argumentos: [
6352
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função', false, [], '(Opcional) Função para guiar a ordenação.')
6353
+ ],
6057
6354
  implementacao: async (interpretador, vetor, funcaoOrdenacao) => {
6058
6355
  if (funcaoOrdenacao !== undefined && funcaoOrdenacao !== null) {
6059
6356
  for (let i = 0; i < vetor.length - 1; i++) {
@@ -6075,16 +6372,39 @@ exports.default = {
6075
6372
  }
6076
6373
  return vetor.sort((a, b) => a - b);
6077
6374
  },
6375
+ assinaturaFormato: 'vetor.ordenar()',
6376
+ documentacao: '# `vetor.ordenar()` \n \n' +
6377
+ 'Ordena valores de um vetor em ordem crescente.\n' +
6378
+ '\n\n ## Exemplo de Código\n' +
6379
+ '\n\n```delegua\n// A ordenação padrão é ascendente, ou seja, para o caso de números, a ordem fica do menor para o maior.\n' +
6380
+ 'var v = [4, 2, 12, 5]\n' +
6381
+ 'escreva(v.ordenar()) // [2, 4, 5, 12]\n' +
6382
+ '// Para o caso de textos, a ordenação é feita em ordem alfabética, caractere a caractere.\n' +
6383
+ 'var v = ["aaa", "a", "aba", "abb", "abc"]\n' +
6384
+ 'escreva(v.ordenar()) // ["a", "aaa", "aba", "abb", "abc"]\n```' +
6385
+ '\n\n ### Formas de uso \n',
6386
+ exemploCodigo: 'vetor.ordenar()'
6078
6387
  },
6079
6388
  remover: {
6080
6389
  tipoRetorno: 'qualquer[]',
6081
- argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
6390
+ argumentos: [
6391
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer', true, [], 'O elemento a ser removido do vetor.')
6392
+ ],
6082
6393
  implementacao: (interpretador, vetor, elemento) => {
6083
6394
  const index = vetor.indexOf(elemento);
6084
6395
  if (index !== -1)
6085
6396
  vetor.splice(index, 1);
6086
6397
  return Promise.resolve(vetor);
6087
6398
  },
6399
+ assinaturaFormato: 'vetor.remover(elemento: qualquer)',
6400
+ documentacao: '# `vetor.remover(elemento)` \n \n' +
6401
+ 'Remove um elemento do vetor caso o elemento exista no vetor.\n' +
6402
+ '\n\n ## Exemplo de Código\n' +
6403
+ '\n\n```delegua\nvar vetor = [1, 2, 3]\n' +
6404
+ 'vetor.remover(2)\n' +
6405
+ 'escreva(vetor) // [1, 3]\n```' +
6406
+ '\n\n ### Formas de uso \n',
6407
+ exemploCodigo: 'vetor.remover(elemento)'
6088
6408
  },
6089
6409
  removerPrimeiro: {
6090
6410
  tipoRetorno: 'qualquer',
@@ -6093,6 +6413,16 @@ exports.default = {
6093
6413
  let elemento = vetor.shift();
6094
6414
  return Promise.resolve(elemento);
6095
6415
  },
6416
+ assinaturaFormato: 'vetor.removerPrimeiro()',
6417
+ documentacao: '# `vetor.removerPrimeiro()` \n \n' +
6418
+ 'Remove o primeiro elemento do vetor caso o elemento exista no vetor.\n' +
6419
+ '\n\n ## Exemplo de Código\n' +
6420
+ '\n\n```delegua\nvar vetor = [1, 2, 3]\n' +
6421
+ 'var primeiroElemento = vetor.removerPrimeiro()\n' +
6422
+ 'escreva(primeiroElemento) // 1\n' +
6423
+ 'escreva(vetor) // [2, 3]\n```' +
6424
+ '\n\n ### Formas de uso \n',
6425
+ exemploCodigo: 'vetor.removerPrimeiro()'
6096
6426
  },
6097
6427
  removerUltimo: {
6098
6428
  tipoRetorno: 'qualquer',
@@ -6101,6 +6431,16 @@ exports.default = {
6101
6431
  let elemento = vetor.pop();
6102
6432
  return Promise.resolve(elemento);
6103
6433
  },
6434
+ assinaturaFormato: 'vetor.removerUltimo()',
6435
+ documentacao: '# `vetor.removerUltimo()` \n \n' +
6436
+ 'Remove o último elemento do vetor caso o elemento exista no vetor.\n' +
6437
+ '\n\n ## Exemplo de Código\n' +
6438
+ '\n\n```delegua\nvar vetor = [1, 2, 3]\n' +
6439
+ 'var ultimoElemento = vetor.removerUltimo()\n' +
6440
+ 'escreva(ultimoElemento) // 3\n' +
6441
+ 'escreva(vetor) // [1, 2]\n```' +
6442
+ '\n\n ### Formas de uso \n',
6443
+ exemploCodigo: 'vetor.removerUltimo()'
6104
6444
  },
6105
6445
  somar: {
6106
6446
  tipoRetorno: 'qualquer',
@@ -6108,11 +6448,27 @@ exports.default = {
6108
6448
  implementacao: (interpretador, vetor) => {
6109
6449
  return Promise.resolve(vetor.reduce((acc, item) => acc + (typeof item === 'number' ? item : item.valor), 0));
6110
6450
  },
6451
+ assinaturaFormato: 'vetor.somar()',
6452
+ documentacao: '# `vetor.somar()` \n \n' +
6453
+ 'Soma ou concatena todos os elementos do vetor (de acordo com o tipo de dados desses elementos) e retorna o resultado.\n' +
6454
+ '\n\n ### Exemplo de Código\n' +
6455
+ '\n\n```delegua\nvar vetor = [1, 2, 3, 4, 5]\n' +
6456
+ 'escreva(vetor.somar()) // 15\n```' +
6457
+ '\n\n ### Formas de uso \n',
6458
+ exemploCodigo: 'vetor.somar()'
6111
6459
  },
6112
6460
  tamanho: {
6113
6461
  tipoRetorno: 'número',
6114
6462
  argumentos: [],
6115
6463
  implementacao: (interpretador, vetor) => Promise.resolve(vetor.length),
6464
+ assinaturaFormato: 'vetor.tamanho()',
6465
+ documentacao: '# `vetor.tamanho()` \n \n' +
6466
+ 'Retorna o número de elementos que compõem o vetor.\n' +
6467
+ '\n\n ## Exemplo de Código\n' +
6468
+ '\n\n```delegua\nvar vetor = [0, 1, 2, 3, 4]\n' +
6469
+ 'escreva(vetor.tamanho()) // 5\n```' +
6470
+ '\n\n ### Formas de uso \n',
6471
+ exemploCodigo: 'vetor.tamanho()'
6116
6472
  },
6117
6473
  };
6118
6474
 
@@ -7535,9 +7891,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
7535
7891
  exports.ParaCada = void 0;
7536
7892
  const declaracao_1 = require("./declaracao");
7537
7893
  class ParaCada extends declaracao_1.Declaracao {
7538
- constructor(hashArquivo, linha, nomeVariavelIteracao, vetor, corpo) {
7894
+ constructor(hashArquivo, linha, variavelIteracao, vetor, corpo) {
7539
7895
  super(linha, hashArquivo);
7540
- this.nomeVariavelIteracao = nomeVariavelIteracao;
7896
+ this.variavelIteracao = variavelIteracao;
7541
7897
  this.vetor = vetor;
7542
7898
  this.corpo = corpo;
7543
7899
  this.posicaoAtual = 0;
@@ -8042,7 +8398,7 @@ class FormatadorDelegua {
8042
8398
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
8043
8399
  }
8044
8400
  visitarDeclaracaoParaCada(declaracao) {
8045
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}para cada ${declaracao.nomeVariavelIteracao} de `;
8401
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}para cada ${declaracao.variavelIteracao} de `;
8046
8402
  this.formatarDeclaracaoOuConstruto(declaracao.vetor);
8047
8403
  this.visitarExpressaoBloco(declaracao.corpo);
8048
8404
  }
@@ -8917,12 +9273,13 @@ function tipoInferenciaParaTipoDadosElementar(tipoInferencia) {
8917
9273
  Object.defineProperty(exports, "__esModule", { value: true });
8918
9274
  exports.InformacaoVariavelOuConstante = void 0;
8919
9275
  class InformacaoVariavelOuConstante {
8920
- constructor(nome, tipo, obrigatorio = true, argumentos = []) {
9276
+ constructor(nome, tipo, obrigatorio = true, argumentos = [], documentacao = "") {
8921
9277
  this.argumentos = [];
8922
9278
  this.nome = nome;
8923
9279
  this.tipo = tipo;
8924
9280
  this.obrigatorio = obrigatorio;
8925
9281
  this.argumentos = argumentos;
9282
+ this.documentacao = documentacao;
8926
9283
  }
8927
9284
  toString() {
8928
9285
  return `<informação-variável-ou-constante nome=${this.nome}, tipo=${this.tipo}, obrigatorio=${this.obrigatorio ? 'verdadeiro' : 'falso'} argumentos=${this.argumentos.map((arg) => arg.toString()).join(', ')}>`;
@@ -9817,6 +10174,15 @@ class InterpretadorBase {
9817
10174
  this.pilhaEscoposExecucao.empilhar(escopoExecucao);
9818
10175
  (0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
9819
10176
  }
10177
+ resolverValor(objeto) {
10178
+ if (objeto === null || objeto === undefined) {
10179
+ return objeto;
10180
+ }
10181
+ if (objeto.hasOwnProperty('valor')) {
10182
+ return objeto.valor;
10183
+ }
10184
+ return objeto;
10185
+ }
9820
10186
  visitarExpressaoArgumentoReferenciaFuncao(expressao) {
9821
10187
  throw new Error('Método não implementado.');
9822
10188
  }
@@ -9924,14 +10290,12 @@ class InterpretadorBase {
9924
10290
  retirarInterpolacao(texto, variaveis) {
9925
10291
  let textoFinal = texto;
9926
10292
  variaveis.forEach((elemento) => {
9927
- var _a, _b, _c;
10293
+ var _a, _b;
9928
10294
  if (((_a = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _a === void 0 ? void 0 : _a.tipo) === delegua_2.default.LOGICO) {
9929
10295
  textoFinal = textoFinal.replace('${' + elemento.variavel + '}', this.paraTexto((_b = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _b === void 0 ? void 0 : _b.valor));
9930
10296
  }
9931
10297
  else {
9932
- const valor = ((_c = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _c === void 0 ? void 0 : _c.hasOwnProperty('valor'))
9933
- ? elemento === null || elemento === void 0 ? void 0 : elemento.valor.valor
9934
- : elemento === null || elemento === void 0 ? void 0 : elemento.valor;
10298
+ const valor = this.resolverValor(elemento.valor);
9935
10299
  textoFinal = textoFinal.replace('${' + elemento.variavel + '}', `${this.paraTexto(valor)}`);
9936
10300
  }
9937
10301
  });
@@ -9990,7 +10354,7 @@ class InterpretadorBase {
9990
10354
  }
9991
10355
  async visitarExpressaoUnaria(expressao) {
9992
10356
  const operando = await this.avaliar(expressao.operando);
9993
- let valor = operando.hasOwnProperty('valor') ? operando.valor : operando;
10357
+ let valor = this.resolverValor(operando);
9994
10358
  switch (expressao.operador.tipo) {
9995
10359
  case delegua_1.default.SUBTRACAO:
9996
10360
  this.verificarOperandoNumero(expressao.operador, valor);
@@ -10036,7 +10400,7 @@ class InterpretadorBase {
10036
10400
  async visitarExpressaoFormatacaoEscrita(declaracao) {
10037
10401
  let resultado = '';
10038
10402
  const conteudo = await this.avaliar(declaracao.expressao);
10039
- const valorConteudo = (conteudo === null || conteudo === void 0 ? void 0 : conteudo.hasOwnProperty('valor')) ? conteudo.valor : conteudo;
10403
+ const valorConteudo = this.resolverValor(conteudo);
10040
10404
  const tipoConteudo = conteudo.hasOwnProperty('tipo')
10041
10405
  ? conteudo.tipo
10042
10406
  : typeof conteudo;
@@ -10102,8 +10466,8 @@ class InterpretadorBase {
10102
10466
  async visitarExpressaoBinaria(expressao) {
10103
10467
  const esquerda = await this.avaliar(expressao.esquerda);
10104
10468
  const direita = await this.avaliar(expressao.direita);
10105
- const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
10106
- const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
10469
+ const valorEsquerdo = this.resolverValor(esquerda);
10470
+ const valorDireito = this.resolverValor(direita);
10107
10471
  const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
10108
10472
  ? esquerda.tipo
10109
10473
  : (0, inferenciador_1.inferirTipoVariavel)(esquerda);
@@ -10209,7 +10573,7 @@ class InterpretadorBase {
10209
10573
  const argumentosResolvidos = [];
10210
10574
  for (const argumento of expressao.argumentos) {
10211
10575
  const valorResolvido = await this.avaliar(argumento);
10212
- argumentosResolvidos.push((valorResolvido === null || valorResolvido === void 0 ? void 0 : valorResolvido.hasOwnProperty('valor')) ? valorResolvido.valor : valorResolvido);
10576
+ argumentosResolvidos.push(this.resolverValor(valorResolvido));
10213
10577
  }
10214
10578
  return await entidadeChamada.chamar(this, argumentosResolvidos);
10215
10579
  }
@@ -10239,9 +10603,7 @@ class InterpretadorBase {
10239
10603
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' +
10240
10604
  String(expressao.entidadeChamada), expressao.linha));
10241
10605
  }
10242
- const entidadeChamada = variavelEntidadeChamada.hasOwnProperty('valor')
10243
- ? variavelEntidadeChamada.valor
10244
- : variavelEntidadeChamada;
10606
+ const entidadeChamada = this.resolverValor(variavelEntidadeChamada);
10245
10607
  if (entidadeChamada instanceof estruturas_1.DeleguaModulo) {
10246
10608
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Entidade chamada é um módulo de Delégua. Provavelmente você quer chamar um de seus componentes?', expressao.linha));
10247
10609
  }
@@ -10264,9 +10626,7 @@ class InterpretadorBase {
10264
10626
  }
10265
10627
  if (entidadeChamada instanceof estruturas_1.FuncaoPadrao) {
10266
10628
  try {
10267
- return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && a.valor.hasOwnProperty('valor')
10268
- ? a.valor.valor
10269
- : a === null || a === void 0 ? void 0 : a.valor), expressao.entidadeChamada.simbolo);
10629
+ return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && this.resolverValor(a.valor)), expressao.entidadeChamada.simbolo);
10270
10630
  }
10271
10631
  catch (erro) {
10272
10632
  this.erros.push({
@@ -10300,7 +10660,7 @@ class InterpretadorBase {
10300
10660
  if (expressao.entidadeChamada.objeto) {
10301
10661
  objeto = await this.avaliar(expressao.entidadeChamada.objeto);
10302
10662
  }
10303
- return entidadeChamada.apply(objeto.hasOwnProperty('valor') ? objeto.valor : objeto, argumentos);
10663
+ return entidadeChamada.apply(this.resolverValor(objeto), argumentos);
10304
10664
  }
10305
10665
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Só pode chamar função ou classe.', expressao.linha));
10306
10666
  }
@@ -10319,7 +10679,7 @@ class InterpretadorBase {
10319
10679
  */
10320
10680
  async visitarExpressaoDeAtribuicao(expressao) {
10321
10681
  const valor = await this.avaliar(expressao.valor);
10322
- const valorResolvido = valor !== undefined && valor.hasOwnProperty('valor') ? valor.valor : valor;
10682
+ const valorResolvido = this.resolverValor(valor);
10323
10683
  let indice = null;
10324
10684
  if (expressao.indice) {
10325
10685
  indice = await this.avaliar(expressao.indice);
@@ -10333,9 +10693,7 @@ class InterpretadorBase {
10333
10693
  // Nunca será método aqui: apenas propriedade.
10334
10694
  const alvoPropriedade = expressao.alvo;
10335
10695
  const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
10336
- const objeto = variavelObjeto.hasOwnProperty('valor')
10337
- ? variavelObjeto.valor
10338
- : variavelObjeto;
10696
+ const objeto = this.resolverValor(variavelObjeto);
10339
10697
  const valor = await this.avaliar(expressao.valor);
10340
10698
  if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
10341
10699
  const objetoDeleguaClasse = objeto;
@@ -10417,22 +10775,33 @@ class InterpretadorBase {
10417
10775
  }
10418
10776
  return retornoExecucao;
10419
10777
  }
10778
+ // TODO: Descobrir se mais algum dialeto, fora Delégua e Pituguês, usam isso.
10420
10779
  async visitarDeclaracaoParaCada(declaracao) {
10421
10780
  let retornoExecucao;
10422
10781
  // Posição atual precisa ser reiniciada, pois pode estar dentro de outro
10423
10782
  // laço de repetição.
10424
10783
  declaracao.posicaoAtual = 0;
10425
10784
  const vetorResolvido = await this.avaliar(declaracao.vetor);
10426
- const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor')
10427
- ? vetorResolvido.valor
10428
- : vetorResolvido;
10785
+ let valorVetorResolvido = this.resolverValor(vetorResolvido);
10786
+ // Se até aqui vetor resolvido é um dicionário, converte dicionário
10787
+ // para vetor de duplas.
10788
+ if (declaracao.vetor.tipo === 'dicionário') {
10789
+ valorVetorResolvido = Object.entries(valorVetorResolvido).map(v => new construtos_1.Dupla(v[0], v[1]));
10790
+ }
10429
10791
  if (!Array.isArray(valorVetorResolvido)) {
10430
10792
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
10431
10793
  }
10432
10794
  while (!(retornoExecucao instanceof quebras_1.Quebra) &&
10433
10795
  declaracao.posicaoAtual < valorVetorResolvido.length) {
10434
10796
  try {
10435
- this.pilhaEscoposExecucao.definirVariavel(declaracao.nomeVariavelIteracao, valorVetorResolvido[declaracao.posicaoAtual]);
10797
+ if (declaracao.variavelIteracao instanceof construtos_1.Variavel) {
10798
+ this.pilhaEscoposExecucao.definirVariavel(declaracao.variavelIteracao.simbolo.lexema, valorVetorResolvido[declaracao.posicaoAtual]);
10799
+ }
10800
+ if (declaracao.variavelIteracao instanceof construtos_1.Dupla) {
10801
+ const valorComoDupla = valorVetorResolvido[declaracao.posicaoAtual];
10802
+ this.pilhaEscoposExecucao.definirVariavel(declaracao.variavelIteracao.primeiro.valor, valorComoDupla.primeiro);
10803
+ this.pilhaEscoposExecucao.definirVariavel(declaracao.variavelIteracao.segundo.valor, valorComoDupla.segundo);
10804
+ }
10436
10805
  retornoExecucao = await this.executar(declaracao.corpo);
10437
10806
  if (retornoExecucao instanceof quebras_1.SustarQuebra) {
10438
10807
  return null;
@@ -10500,9 +10869,7 @@ class InterpretadorBase {
10500
10869
  }
10501
10870
  async visitarDeclaracaoEscolha(declaracao) {
10502
10871
  const condicaoEscolha = await this.avaliar(declaracao.identificadorOuLiteral);
10503
- const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor')
10504
- ? condicaoEscolha.valor
10505
- : condicaoEscolha;
10872
+ const valorCondicaoEscolha = this.resolverValor(condicaoEscolha);
10506
10873
  const caminhos = declaracao.caminhos;
10507
10874
  const caminhoPadrao = declaracao.caminhoPadrao;
10508
10875
  let encontrado = false;
@@ -10604,9 +10971,7 @@ class InterpretadorBase {
10604
10971
  let formatoTexto = '';
10605
10972
  for (const argumento of argumentos) {
10606
10973
  const resultadoAvaliacao = await this.avaliar(argumento);
10607
- let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
10608
- ? resultadoAvaliacao.valor
10609
- : resultadoAvaliacao;
10974
+ let valor = this.resolverValor(resultadoAvaliacao);
10610
10975
  formatoTexto += `${this.paraTexto(valor)} `;
10611
10976
  }
10612
10977
  return formatoTexto.trimEnd();
@@ -10686,9 +11051,7 @@ class InterpretadorBase {
10686
11051
  }
10687
11052
  let valorFinal = null;
10688
11053
  if (valorOuOutraVariavel !== null && valorOuOutraVariavel !== undefined) {
10689
- valorFinal = valorOuOutraVariavel.hasOwnProperty('valor')
10690
- ? valorOuOutraVariavel.valor
10691
- : valorOuOutraVariavel;
11054
+ valorFinal = this.resolverValor(valorOuOutraVariavel);
10692
11055
  }
10693
11056
  return valorFinal;
10694
11057
  }
@@ -10742,8 +11105,8 @@ class InterpretadorBase {
10742
11105
  if (objeto.tipo === delegua_2.default.TUPLA) {
10743
11106
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.objeto.simbolo.lexema, 'Não é possível modificar uma tupla. As tuplas são estruturas de dados imutáveis.', expressao.linha));
10744
11107
  }
10745
- objeto = objeto.hasOwnProperty('valor') ? objeto.valor : objeto;
10746
- indice = indice.hasOwnProperty('valor') ? indice.valor : indice;
11108
+ objeto = this.resolverValor(objeto);
11109
+ indice = this.resolverValor(indice);
10747
11110
  if (Array.isArray(objeto)) {
10748
11111
  if (indice < 0 && objeto.length !== 0) {
10749
11112
  while (indice < 0) {
@@ -10763,7 +11126,7 @@ class InterpretadorBase {
10763
11126
  objeto[indice] = valor;
10764
11127
  }
10765
11128
  else {
10766
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.objeto.nome, 'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.', expressao.linha));
11129
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.objeto.nome, 'Somente listas, dicionários, classes e objetos podem ser mudados por índice.', expressao.linha));
10767
11130
  }
10768
11131
  }
10769
11132
  async visitarExpressaoAcessoIndiceVariavel(expressao) {
@@ -10773,10 +11136,8 @@ class InterpretadorBase {
10773
11136
  ]);
10774
11137
  const variavelObjeto = promises[0];
10775
11138
  const indice = promises[1];
10776
- const objeto = variavelObjeto.hasOwnProperty('valor')
10777
- ? variavelObjeto.valor
10778
- : variavelObjeto;
10779
- let valorIndice = indice.hasOwnProperty('valor') ? indice.valor : indice;
11139
+ const objeto = this.resolverValor(variavelObjeto);
11140
+ let valorIndice = this.resolverValor(indice);
10780
11141
  if (Array.isArray(objeto)) {
10781
11142
  if (!Number.isInteger(valorIndice)) {
10782
11143
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Somente inteiros podem ser usados para indexar um vetor.', expressao.linha));
@@ -10824,9 +11185,7 @@ class InterpretadorBase {
10824
11185
  }
10825
11186
  async visitarExpressaoDefinirValor(expressao) {
10826
11187
  const variavelObjeto = await this.avaliar(expressao.objeto);
10827
- const objeto = variavelObjeto.hasOwnProperty('valor')
10828
- ? variavelObjeto.valor
10829
- : variavelObjeto;
11188
+ const objeto = this.resolverValor(variavelObjeto);
10830
11189
  if (objeto.constructor.name !== 'ObjetoDeleguaClasse' && objeto.constructor !== Object) {
10831
11190
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.nome, 'Somente instâncias e dicionários podem possuir campos.', expressao.linha));
10832
11191
  }
@@ -10892,9 +11251,7 @@ class InterpretadorBase {
10892
11251
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
10893
11252
  variavelObjeto = variavelObjeto.valor;
10894
11253
  }
10895
- const objeto = variavelObjeto.hasOwnProperty('valor')
10896
- ? variavelObjeto.valor
10897
- : variavelObjeto;
11254
+ const objeto = this.resolverValor(variavelObjeto);
10898
11255
  // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
10899
11256
  // então testamos também o nome do construtor.
10900
11257
  if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
@@ -10910,7 +11267,7 @@ class InterpretadorBase {
10910
11267
  const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema].implementacao;
10911
11268
  return new metodo_primitiva_1.MetodoPrimitiva(objeto, metodoDePrimitivaDicionario);
10912
11269
  }
10913
- return objeto[expressao.simbolo.lexema] || null;
11270
+ return objeto[expressao.simbolo.lexema];
10914
11271
  }
10915
11272
  // Casos em que o objeto possui algum outro tipo que não o de objeto simples.
10916
11273
  // Normalmente executam quando uma biblioteca é importada, e estamos tentando
@@ -10953,9 +11310,7 @@ class InterpretadorBase {
10953
11310
  continue;
10954
11311
  }
10955
11312
  dicionario[promises[0]] =
10956
- promises[1] && promises[1].hasOwnProperty('valor')
10957
- ? promises[1].valor
10958
- : promises[1];
11313
+ this.resolverValor(promises[1]);
10959
11314
  }
10960
11315
  return dicionario;
10961
11316
  }
@@ -11199,6 +11554,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11199
11554
  if (objeto === null || objeto === undefined) {
11200
11555
  return objeto;
11201
11556
  }
11557
+ if (Array.isArray(objeto)) {
11558
+ const vetorResolvido = [];
11559
+ for (const elemento of objeto) {
11560
+ vetorResolvido.push(this.resolverValor(elemento));
11561
+ }
11562
+ return vetorResolvido;
11563
+ }
11202
11564
  if (objeto instanceof estruturas_1.ReferenciaMontao) {
11203
11565
  return this.resolverReferenciaMontao(objeto);
11204
11566
  }
@@ -11210,6 +11572,74 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11210
11572
  }
11211
11573
  return objeto;
11212
11574
  }
11575
+ paraTexto(objeto) {
11576
+ if (objeto === null || objeto === undefined)
11577
+ return delegua_1.default.NULO;
11578
+ if (typeof objeto === primitivos_1.default.BOOLEANO) {
11579
+ return objeto ? 'verdadeiro' : 'falso';
11580
+ }
11581
+ if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
11582
+ return objeto.valor.paraTexto();
11583
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
11584
+ objeto instanceof estruturas_1.DeleguaFuncao ||
11585
+ typeof objeto.paraTexto === 'function')
11586
+ return objeto.paraTexto();
11587
+ if (objeto instanceof quebras_1.RetornoQuebra) {
11588
+ if (typeof objeto.valor === 'boolean')
11589
+ return objeto.valor ? 'verdadeiro' : 'falso';
11590
+ }
11591
+ if (objeto instanceof Date) {
11592
+ const formato = Intl.DateTimeFormat('pt', {
11593
+ dateStyle: 'full',
11594
+ timeStyle: 'full',
11595
+ });
11596
+ return formato.format(objeto);
11597
+ }
11598
+ if (Array.isArray(objeto)) {
11599
+ let retornoVetor = '[';
11600
+ for (let elemento of objeto) {
11601
+ if (typeof elemento === 'object') {
11602
+ retornoVetor += `${JSON.stringify(elemento)}, `;
11603
+ continue;
11604
+ }
11605
+ retornoVetor +=
11606
+ typeof elemento === 'string'
11607
+ ? `'${elemento}', `
11608
+ : `${this.paraTexto(elemento)}, `;
11609
+ }
11610
+ if (retornoVetor.length > 1) {
11611
+ retornoVetor = retornoVetor.slice(0, -2);
11612
+ }
11613
+ retornoVetor += ']';
11614
+ return retornoVetor;
11615
+ }
11616
+ switch (objeto.constructor.name) {
11617
+ case 'Object':
11618
+ if ('tipo' in objeto) {
11619
+ switch (objeto.tipo) {
11620
+ case 'dicionário':
11621
+ return JSON.stringify(objeto.valor);
11622
+ default:
11623
+ return objeto.valor;
11624
+ }
11625
+ }
11626
+ }
11627
+ if (typeof objeto === primitivos_1.default.OBJETO) {
11628
+ const objetoEscrita = {};
11629
+ for (const propriedade in objeto) {
11630
+ let valor = objeto[propriedade];
11631
+ if (typeof valor === primitivos_1.default.BOOLEANO) {
11632
+ valor = valor ? 'verdadeiro' : 'falso';
11633
+ }
11634
+ if (valor instanceof estruturas_1.ReferenciaMontao) {
11635
+ valor = this.resolverValor(valor);
11636
+ }
11637
+ objetoEscrita[propriedade] = valor;
11638
+ }
11639
+ return JSON.stringify(objetoEscrita);
11640
+ }
11641
+ return objeto.toString();
11642
+ }
11213
11643
  async avaliacaoDeclaracaoVarOuConst(declaracao) {
11214
11644
  let valorOuOutraVariavel = null;
11215
11645
  if (declaracao.inicializador !== null) {
@@ -11392,7 +11822,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11392
11822
  const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema].implementacao;
11393
11823
  return new estruturas_1.MetodoPrimitiva(objeto, metodoDePrimitivaDicionario);
11394
11824
  }
11395
- return objeto[expressao.simbolo.lexema] || null;
11825
+ return objeto[expressao.simbolo.lexema];
11396
11826
  }
11397
11827
  // A partir daqui, presume-se que o objeto é uma das estruturas
11398
11828
  // de Delégua.
@@ -11436,7 +11866,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11436
11866
  break;
11437
11867
  }
11438
11868
  // Último caso válido: objeto de uma classe JavaScript que possua a propriedade.
11439
- // Exemplos: classes de LinConEs, como `RetornoComando, ou bibliotecas globais com objetos próprios`.
11869
+ // Exemplos: classes de LinConEs, como `RetornoComando`, ou bibliotecas globais com objetos próprios.
11440
11870
  if (objeto.hasOwnProperty(expressao.simbolo.lexema) ||
11441
11871
  typeof objeto[expressao.simbolo.lexema] !== 'undefined') {
11442
11872
  return objeto[expressao.simbolo.lexema];
@@ -11452,9 +11882,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11452
11882
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
11453
11883
  variavelObjeto = variavelObjeto.valor;
11454
11884
  }
11455
- const objeto = variavelObjeto.hasOwnProperty('valor')
11456
- ? variavelObjeto.valor
11457
- : variavelObjeto;
11885
+ const objeto = this.resolverValor(variavelObjeto);
11458
11886
  // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
11459
11887
  // então testamos também o nome do construtor.
11460
11888
  if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
@@ -11495,6 +11923,52 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11495
11923
  const deleguaFuncao = this.pilhaEscoposExecucao.obterVariavelPorNome(expressao.simboloFuncao.lexema);
11496
11924
  return deleguaFuncao;
11497
11925
  }
11926
+ async visitarExpressaoAtribuicaoPorIndice(expressao) {
11927
+ const promises = await Promise.all([
11928
+ this.avaliar(expressao.objeto),
11929
+ this.avaliar(expressao.indice),
11930
+ this.avaliar(expressao.valor),
11931
+ ]);
11932
+ let objeto = promises[0];
11933
+ let indice = promises[1];
11934
+ const valor = promises[2];
11935
+ if (objeto.tipo === delegua_1.default.TUPLA) {
11936
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.objeto.simbolo.lexema, 'Não é possível modificar uma tupla. As tuplas são estruturas de dados imutáveis.', expressao.linha));
11937
+ }
11938
+ objeto = this.resolverValor(objeto);
11939
+ indice = this.resolverValor(indice);
11940
+ // Se o valor é uma referência ao montão, e o índice que a recebe é
11941
+ // de uma variável/constante que vive num escopo superior, a referência
11942
+ // precisa ser transferida para o escopo correspondente.
11943
+ if (valor instanceof estruturas_1.ReferenciaMontao) {
11944
+ // TODO: Terminar
11945
+ const nomeVariavel = expressao.objeto.simbolo.lexema;
11946
+ if (this.pilhaEscoposExecucao.obterVariavelEm(1, nomeVariavel) === undefined) {
11947
+ this.pilhaEscoposExecucao.migrarReferenciaMontaoParaEscopoDeVariavel(nomeVariavel, valor.endereco);
11948
+ }
11949
+ }
11950
+ if (Array.isArray(objeto)) {
11951
+ if (indice < 0 && objeto.length !== 0) {
11952
+ while (indice < 0) {
11953
+ indice += objeto.length;
11954
+ }
11955
+ }
11956
+ while (objeto.length < indice) {
11957
+ objeto.push(null);
11958
+ }
11959
+ objeto[indice] = valor;
11960
+ }
11961
+ else if (objeto.constructor === Object ||
11962
+ objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
11963
+ objeto instanceof estruturas_1.DeleguaFuncao ||
11964
+ objeto instanceof estruturas_1.DescritorTipoClasse ||
11965
+ objeto instanceof estruturas_1.DeleguaModulo) {
11966
+ objeto[indice] = valor;
11967
+ }
11968
+ else {
11969
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.objeto.nome, 'Somente listas, dicionários, classes e objetos podem ser mudados por índice.', expressao.linha));
11970
+ }
11971
+ }
11498
11972
  /**
11499
11973
  * Execução de uma expressão de atribuição.
11500
11974
  * @param expressao A expressão.
@@ -11529,12 +12003,32 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11529
12003
  const objetoDeleguaClasse = objeto;
11530
12004
  objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor);
11531
12005
  }
12006
+ else {
12007
+ // Se cair aqui, provavelmente `objeto.constructor.name` é 'Object'.
12008
+ objeto[alvoPropriedade.simbolo.lexema] = valor;
12009
+ }
11532
12010
  break;
11533
12011
  default:
11534
12012
  throw new excecoes_1.ErroEmTempoDeExecucao(null, `Atribuição com caso faltante: ${expressao.alvo.constructor.name}.`);
11535
12013
  }
11536
12014
  return valorResolvido;
11537
12015
  }
12016
+ async visitarExpressaoDefinirValor(expressao) {
12017
+ const variavelObjeto = await this.avaliar(expressao.objeto);
12018
+ const objeto = this.resolverValor(variavelObjeto);
12019
+ if (objeto.constructor.name !== 'ObjetoDeleguaClasse' && objeto.constructor !== Object) {
12020
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.nome, 'Somente instâncias e dicionários podem possuir campos.', expressao.linha));
12021
+ }
12022
+ const valor = await this.avaliar(expressao.valor);
12023
+ const valorResolvido = this.resolverValor(valor);
12024
+ if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
12025
+ objeto.definir(expressao.nome, valorResolvido);
12026
+ return valorResolvido;
12027
+ }
12028
+ if (objeto.constructor === Object) {
12029
+ objeto[expressao.nome.lexema] = valorResolvido;
12030
+ }
12031
+ }
11538
12032
  /**
11539
12033
  * Dicionários em Delégua são passados por referência, portanto, são
11540
12034
  * armazenados no montão.
@@ -11551,9 +12045,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
11551
12045
  dicionario[chaveLogico] = promises[1];
11552
12046
  continue;
11553
12047
  }
11554
- dicionario[promises[0]] = promises[1].hasOwnProperty('valor')
11555
- ? promises[1].valor
11556
- : promises[1];
12048
+ dicionario[promises[0]] = this.resolverValor(promises[1]);
11557
12049
  }
11558
12050
  const enderecoDicionarioMontao = this.montao.adicionarReferencia(dicionario);
11559
12051
  this.pilhaEscoposExecucao.registrarReferenciaMontao(enderecoDicionarioMontao);
@@ -12004,6 +12496,20 @@ class PilhaEscoposExecucao {
12004
12496
  const espacoMemoria = this.pilha[this.pilha.length - 1].espacoMemoria;
12005
12497
  espacoMemoria.enderecosMontao.add(endereco);
12006
12498
  }
12499
+ migrarReferenciaMontaoParaEscopoDeVariavel(nomeVariavel, enderecoMontao) {
12500
+ // TODO: Normalmente uma referência a ser migrada está sempre no último escopo.
12501
+ // Conferir se é sempre este o caso.
12502
+ const ultimoEspacoMemoria = this.pilha[this.pilha.length - 1].espacoMemoria;
12503
+ ultimoEspacoMemoria.enderecosMontao.delete(enderecoMontao);
12504
+ for (let i = 1; i <= this.pilha.length; i++) {
12505
+ const espacoMemoria = this.pilha[this.pilha.length - i].espacoMemoria;
12506
+ if (espacoMemoria.valores[nomeVariavel] !== undefined) {
12507
+ espacoMemoria.enderecosMontao.add(enderecoMontao);
12508
+ break;
12509
+ }
12510
+ }
12511
+ // TODO: Devemos emitir erro em algum momento?
12512
+ }
12007
12513
  }
12008
12514
  exports.PilhaEscoposExecucao = PilhaEscoposExecucao;
12009
12515
 
@@ -28078,7 +28584,7 @@ class TradutorAssemblyScript {
28078
28584
  return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
28079
28585
  }
28080
28586
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
28081
- let resultado = `for (let ${declaracaoParaCada.nomeVariavelIteracao} of `;
28587
+ let resultado = `for (let ${declaracaoParaCada.variavelIteracao} of `;
28082
28588
  resultado +=
28083
28589
  this.dicionarioConstrutos[declaracaoParaCada.vetor.constructor.name](declaracaoParaCada.vetor) + ') ';
28084
28590
  resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);
@@ -28785,7 +29291,8 @@ class TradutorJavaScript {
28785
29291
  return `'leia() não é suportado por este padrão de JavaScript.'`;
28786
29292
  }
28787
29293
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
28788
- let resultado = `for (let ${declaracaoParaCada.nomeVariavelIteracao} of `;
29294
+ const variavelIteracao = this.dicionarioConstrutos[declaracaoParaCada.variavelIteracao.constructor.name](declaracaoParaCada.variavelIteracao);
29295
+ let resultado = `for (let ${variavelIteracao} of `;
28789
29296
  resultado +=
28790
29297
  this.dicionarioConstrutos[declaracaoParaCada.vetor.constructor.name](declaracaoParaCada.vetor) + ') ';
28791
29298
  resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);
@@ -29469,7 +29976,8 @@ class TradutorMermaidJs {
29469
29976
  return vertices;
29470
29977
  }
29471
29978
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
29472
- let texto = `Linha${declaracaoParaCada.linha}(para cada ${declaracaoParaCada.nomeVariavelIteracao} em `;
29979
+ const textoVariavelIteracao = this.dicionarioConstrutos[declaracaoParaCada.variavelIteracao.constructor.name](declaracaoParaCada.variavelIteracao);
29980
+ let texto = `Linha${declaracaoParaCada.linha}(para cada ${textoVariavelIteracao} em `;
29473
29981
  const textoVariavelIterada = this.dicionarioConstrutos[declaracaoParaCada.vetor.constructor.name](declaracaoParaCada.vetor);
29474
29982
  texto += textoVariavelIterada + ')';
29475
29983
  const aresta = new ArestaFluxograma(declaracaoParaCada, texto);
@@ -30141,7 +30649,8 @@ class TradutorPython {
30141
30649
  return resultado;
30142
30650
  }
30143
30651
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
30144
- let resultado = `for ${declaracaoParaCada.nomeVariavelIteracao} in `;
30652
+ const variavelIteracao = this.dicionarioConstrutos[declaracaoParaCada.variavelIteracao.constructor.name](declaracaoParaCada.variavelIteracao);
30653
+ let resultado = `for ${variavelIteracao} in `;
30145
30654
  resultado +=
30146
30655
  this.dicionarioConstrutos[declaracaoParaCada.vetor.constructor.name](declaracaoParaCada.vetor) + ':\n';
30147
30656
  resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);
@@ -31065,7 +31574,8 @@ class TradutorReversoTenda {
31065
31574
  return `leia("${declaracaoLeia.argumentos[0].valor}")'`;
31066
31575
  }
31067
31576
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
31068
- let resultado = `para cada ${declaracaoParaCada.nomeVariavelIteracao} em `;
31577
+ const variavelIteracao = this.dicionarioConstrutos[declaracaoParaCada.variavelIteracao.constructor.name](declaracaoParaCada.variavelIteracao);
31578
+ let resultado = `para cada ${variavelIteracao} em `;
31069
31579
  resultado +=
31070
31580
  this.dicionarioConstrutos[declaracaoParaCada.vetor.constructor.name](declaracaoParaCada.vetor) + ' ';
31071
31581
  resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);