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