@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.
- package/avaliador-sintatico/avaliador-sintatico.d.ts +2 -0
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +37 -4
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +31 -10
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js +27 -0
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +125 -11
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +173 -12
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/declaracoes/para-cada.d.ts +3 -3
- package/declaracoes/para-cada.d.ts.map +1 -1
- package/declaracoes/para-cada.js +2 -2
- package/declaracoes/para-cada.js.map +1 -1
- package/formatadores/formatador-delegua.js +1 -1
- package/formatadores/formatador-delegua.js.map +1 -1
- package/informacao-variavel-ou-constante.d.ts +2 -2
- package/informacao-variavel-ou-constante.d.ts.map +1 -1
- package/informacao-variavel-ou-constante.js +2 -1
- package/informacao-variavel-ou-constante.js.map +1 -1
- package/interfaces/pilha-escopos-execucao-interface.d.ts +1 -0
- package/interfaces/pilha-escopos-execucao-interface.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -0
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +19 -65
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -0
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +14 -11
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +1 -0
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +48 -50
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +5 -2
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +145 -8
- package/interpretador/interpretador.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts +1 -0
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js +14 -0
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-assembly-x64.js +13 -13
- package/tradutores/tradutor-assemblyscript.js +1 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +2 -1
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
- package/tradutores/tradutor-mermaidjs.js +2 -1
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +2 -1
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-tenda.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-tenda.js +2 -1
- package/tradutores/tradutor-reverso-tenda.js.map +1 -1
- 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
|
-
|
|
1074
|
-
|
|
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),
|
|
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),
|
|
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),
|
|
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
|
-
|
|
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('
|
|
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: [
|
|
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('
|
|
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', '
|
|
5941
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', '
|
|
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: '
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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', '
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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,
|
|
7894
|
+
constructor(hashArquivo, linha, variavelIteracao, vetor, corpo) {
|
|
7539
7895
|
super(linha, hashArquivo);
|
|
7540
|
-
this.
|
|
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.
|
|
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
|
|
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 = (
|
|
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 =
|
|
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
|
|
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
|
|
10106
|
-
const valorDireito = (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
|
|
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 =
|
|
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.
|
|
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(
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
10427
|
-
|
|
10428
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
10746
|
-
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
|
|
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 =
|
|
10777
|
-
|
|
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 =
|
|
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 =
|
|
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]
|
|
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]
|
|
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]
|
|
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
|
|
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 =
|
|
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]
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|