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