@designliquido/delegua 1.7.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/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 +59 -28
- 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 +652 -81
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, [
|
|
@@ -5247,26 +5250,27 @@ class AvaliadorSintaticoPitugues {
|
|
|
5247
5250
|
expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
|
|
5248
5251
|
}
|
|
5249
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;
|
|
5250
5256
|
let ehFatiamento = false;
|
|
5251
|
-
let
|
|
5252
|
-
let
|
|
5253
|
-
if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)) {
|
|
5254
|
-
indiceInicio = await this.expressao();
|
|
5255
|
-
}
|
|
5257
|
+
let fim = null;
|
|
5258
|
+
let passo = null;
|
|
5256
5259
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)) {
|
|
5257
5260
|
ehFatiamento = true;
|
|
5258
|
-
|
|
5259
|
-
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
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();
|
|
5263
5267
|
}
|
|
5264
5268
|
const simboloFechamento = this.consumir(pitugues_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
5265
5269
|
if (ehFatiamento) {
|
|
5266
|
-
expressao = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressao,
|
|
5270
|
+
expressao = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressao, inicio, fim, passo, simboloFechamento);
|
|
5267
5271
|
}
|
|
5268
5272
|
else {
|
|
5269
|
-
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao,
|
|
5273
|
+
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, inicio, simboloFechamento);
|
|
5270
5274
|
}
|
|
5271
5275
|
}
|
|
5272
5276
|
else {
|
|
@@ -5623,34 +5627,61 @@ class AvaliadorSintaticoPitugues {
|
|
|
5623
5627
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
|
|
5624
5628
|
}
|
|
5625
5629
|
async declaracaoPara() {
|
|
5630
|
+
const simboloPara = this.simboloAnterior();
|
|
5631
|
+
this.blocos += 1;
|
|
5626
5632
|
try {
|
|
5627
|
-
const simboloPara = this.simboloAnterior();
|
|
5628
|
-
this.blocos += 1;
|
|
5629
5633
|
this.consumir(pitugues_2.default.CADA, `Esperado palavra reservada 'cada' após 'para'. Atual: ${this.simbolos[this.atual].lexema}.`);
|
|
5630
|
-
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
|
+
}
|
|
5631
5648
|
if (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DE, pitugues_2.default.EM)) {
|
|
5632
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'.");
|
|
5633
5650
|
}
|
|
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}.`);
|
|
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'));
|
|
5641
5656
|
}
|
|
5642
|
-
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
|
|
5643
5657
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
5644
5658
|
const corpo = await this.resolverDeclaracao();
|
|
5645
|
-
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha),
|
|
5646
|
-
}
|
|
5647
|
-
catch (erro) {
|
|
5648
|
-
throw erro;
|
|
5659
|
+
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, alvoIteracao, corpo);
|
|
5649
5660
|
}
|
|
5650
5661
|
finally {
|
|
5651
5662
|
this.blocos -= 1;
|
|
5652
5663
|
}
|
|
5653
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
|
+
}
|
|
5654
5685
|
async declaracaoSe() {
|
|
5655
5686
|
const condicao = await this.expressao();
|
|
5656
5687
|
const caminhoEntao = await this.resolverDeclaracao();
|
|
@@ -6159,8 +6190,11 @@ class AvaliadorSintaticoPitugues {
|
|
|
6159
6190
|
this.pilhaEscopos.definirInformacoesVariavel('tipo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tipo', 'qualquer', true, [
|
|
6160
6191
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('elemento', 'qualquer'),
|
|
6161
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
|
+
]));
|
|
6162
6196
|
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
|
|
6163
|
-
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('
|
|
6197
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
|
|
6164
6198
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
|
|
6165
6199
|
]));
|
|
6166
6200
|
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
|
|
@@ -8952,6 +8986,7 @@ exports.reduzir = reduzir;
|
|
|
8952
8986
|
exports.somar = somar;
|
|
8953
8987
|
exports.tamanho = tamanho;
|
|
8954
8988
|
exports.texto = texto;
|
|
8989
|
+
exports.todos = todos;
|
|
8955
8990
|
exports.todosEmCondicao = todosEmCondicao;
|
|
8956
8991
|
exports.tupla = tupla;
|
|
8957
8992
|
exports.vetor = vetor;
|
|
@@ -9949,40 +9984,68 @@ async function tamanho(interpretador, objeto) {
|
|
|
9949
9984
|
async function texto(interpretador, valorParaConverter) {
|
|
9950
9985
|
return Promise.resolve(`${valorParaConverter.hasOwnProperty('valor') ? valorParaConverter.valor : valorParaConverter}`);
|
|
9951
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
|
+
}
|
|
9952
10011
|
/**
|
|
9953
10012
|
* Retorna verdadeiro se todos os elementos do primeiro parâmetro retornam verdadeiro ao
|
|
9954
10013
|
* serem aplicados como argumentos da função passada como segundo parâmetro.
|
|
9955
10014
|
* @param {InterpretadorInterface} interpretador A instância do interpretador.
|
|
9956
|
-
* @param {VariavelInterface | any}
|
|
10015
|
+
* @param {VariavelInterface | any} iteravel O primeiro parâmetro, qualquer dado que seja iterável (vetores, tuplas, dicionários etc.).
|
|
9957
10016
|
* @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
|
|
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
|
|
9960
10019
|
* por parâmetro devolver verdadeiro, ou falso em caso contrário.
|
|
9961
10020
|
*/
|
|
9962
|
-
async function todosEmCondicao(interpretador,
|
|
9963
|
-
|
|
9964
|
-
|
|
9965
|
-
|
|
9966
|
-
|
|
9967
|
-
|
|
9968
|
-
const
|
|
9969
|
-
const
|
|
9970
|
-
|
|
9971
|
-
: funcaoCondicional;
|
|
9972
|
-
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) {
|
|
9973
10030
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9974
10031
|
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9975
10032
|
linha: interpretador.linhaDeclaracaoAtual,
|
|
9976
|
-
}, 'Parâmetro inválido. O primeiro parâmetro
|
|
10033
|
+
}, 'Parâmetro inválido. O primeiro parâmetro deve ser um iterável.'));
|
|
9977
10034
|
}
|
|
9978
|
-
|
|
10035
|
+
const valorFuncao = interpretador.resolverValor(funcaoCondicional);
|
|
10036
|
+
const ehFuncaoValida = valorFuncao instanceof estruturas_1.DeleguaFuncao ||
|
|
10037
|
+
valorFuncao instanceof funcao_padrao_1.FuncaoPadrao;
|
|
10038
|
+
if (!ehFuncaoValida) {
|
|
9979
10039
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9980
10040
|
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9981
10041
|
linha: interpretador.linhaDeclaracaoAtual,
|
|
9982
|
-
}, 'Parâmetro inválido. O segundo parâmetro
|
|
10042
|
+
}, 'Parâmetro inválido. O segundo parâmetro deve ser uma função.'));
|
|
9983
10043
|
}
|
|
9984
|
-
|
|
9985
|
-
|
|
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))
|
|
9986
10049
|
return false;
|
|
9987
10050
|
}
|
|
9988
10051
|
return true;
|
|
@@ -11015,16 +11078,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
11015
11078
|
exports.AcessoIntervaloVariavel = void 0;
|
|
11016
11079
|
/**
|
|
11017
11080
|
* Construto para acesso de intervalos (fatiamento/slicing) em vetores.
|
|
11018
|
-
* 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[:]
|
|
11019
11082
|
*/
|
|
11020
11083
|
class AcessoIntervaloVariavel {
|
|
11021
|
-
constructor(hashArquivo, entidadeChamada, indiceInicio, indiceFim, simboloFechamento, tipo = 'qualquer') {
|
|
11084
|
+
constructor(hashArquivo, entidadeChamada, indiceInicio, indiceFim, indicePasso, simboloFechamento, tipo = 'qualquer') {
|
|
11022
11085
|
this.tipo = 'qualquer';
|
|
11023
11086
|
this.linha = entidadeChamada.linha;
|
|
11024
11087
|
this.hashArquivo = hashArquivo;
|
|
11025
11088
|
this.entidadeChamada = entidadeChamada;
|
|
11026
11089
|
this.indiceInicio = indiceInicio;
|
|
11027
11090
|
this.indiceFim = indiceFim;
|
|
11091
|
+
this.indicePasso = indicePasso;
|
|
11028
11092
|
this.simboloFechamento = simboloFechamento;
|
|
11029
11093
|
this.tipo = tipo;
|
|
11030
11094
|
}
|
|
@@ -11034,9 +11098,11 @@ class AcessoIntervaloVariavel {
|
|
|
11034
11098
|
paraTexto() {
|
|
11035
11099
|
const inicio = this.indiceInicio ? this.indiceInicio.paraTexto() : 'sem-início';
|
|
11036
11100
|
const fim = this.indiceFim ? this.indiceFim.paraTexto() : 'sem-fim';
|
|
11101
|
+
const passo = this.indicePasso ? this.indicePasso.paraTexto() : 'sem-passo';
|
|
11037
11102
|
return (`<acesso-índice-variável entidadeChamada=${this.entidadeChamada.paraTexto()} ` +
|
|
11038
11103
|
`inicio=${inicio} ` +
|
|
11039
11104
|
`fim=${fim}` +
|
|
11105
|
+
`passo=${passo}` +
|
|
11040
11106
|
`/>`);
|
|
11041
11107
|
}
|
|
11042
11108
|
paraTextoSaida() {
|
|
@@ -15775,7 +15841,7 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
|
|
|
15775
15841
|
pilhaEscoposExecucao.definirVariavel('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
|
|
15776
15842
|
pilhaEscoposExecucao.definirVariavel('tamanho', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tamanho));
|
|
15777
15843
|
pilhaEscoposExecucao.definirVariavel('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
|
|
15778
|
-
pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(
|
|
15844
|
+
pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
|
|
15779
15845
|
pilhaEscoposExecucao.definirVariavel('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
|
|
15780
15846
|
pilhaEscoposExecucao.definirVariavel('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
|
|
15781
15847
|
pilhaEscoposExecucao.definirVariavel('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
|
|
@@ -39287,7 +39353,9 @@ class TradutorAssemblyScript {
|
|
|
39287
39353
|
this.indentacao = 0;
|
|
39288
39354
|
this.dicionarioConstrutos = {
|
|
39289
39355
|
AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
|
|
39356
|
+
AcessoMetodo: this.traduzirConstrutoAcessoMetodo.bind(this),
|
|
39290
39357
|
AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodo.bind(this),
|
|
39358
|
+
AcessoPropriedade: this.traduzirConstrutoAcessoPropriedade.bind(this),
|
|
39291
39359
|
Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
|
|
39292
39360
|
ArgumentoReferenciaFuncao: this.traduzirConstrutoArgumentoReferenciaFuncao.bind(this),
|
|
39293
39361
|
AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
|
|
@@ -39295,19 +39363,34 @@ class TradutorAssemblyScript {
|
|
|
39295
39363
|
Binario: this.traduzirConstrutoBinario.bind(this),
|
|
39296
39364
|
Chamada: this.traduzirConstrutoChamada.bind(this),
|
|
39297
39365
|
ComentarioComoConstruto: this.traduzirConstrutoComentario.bind(this),
|
|
39366
|
+
Deceto: this.traduzirConstrutoDeceto.bind(this),
|
|
39298
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),
|
|
39299
39372
|
FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
|
|
39300
39373
|
Isto: () => 'this',
|
|
39301
39374
|
Literal: this.traduzirConstrutoLiteral.bind(this),
|
|
39302
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),
|
|
39303
39380
|
ReferenciaFuncao: this.traduzirConstrutoReferenciaFuncao.bind(this),
|
|
39304
39381
|
Separador: this.traduzirConstrutoSeparador.bind(this),
|
|
39382
|
+
SeTernario: this.traduzirConstrutoSeTernario.bind(this),
|
|
39383
|
+
Sexteto: this.traduzirConstrutoSexteto.bind(this),
|
|
39384
|
+
Septeto: this.traduzirConstrutoSepteto.bind(this),
|
|
39305
39385
|
TipoDe: this.traduzirConstrutoTipoDe.bind(this),
|
|
39386
|
+
Trio: this.traduzirConstrutoTrio.bind(this),
|
|
39387
|
+
TuplaN: this.traduzirConstrutoTuplaN.bind(this),
|
|
39306
39388
|
Unario: this.traduzirConstrutoUnario.bind(this),
|
|
39307
39389
|
Variavel: this.traduzirConstrutoVariavel.bind(this),
|
|
39308
39390
|
Vetor: this.traduzirConstrutoVetor.bind(this),
|
|
39309
39391
|
};
|
|
39310
39392
|
this.dicionarioDeclaracoes = {
|
|
39393
|
+
Ajuda: this.traduzirDeclaracaoAjuda.bind(this),
|
|
39311
39394
|
Bloco: this.traduzirDeclaracaoBloco.bind(this),
|
|
39312
39395
|
Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
|
|
39313
39396
|
Comentario: this.traduzirConstrutoComentario.bind(this),
|
|
@@ -39327,8 +39410,13 @@ class TradutorAssemblyScript {
|
|
|
39327
39410
|
Classe: this.traduzirDeclaracaoClasse.bind(this),
|
|
39328
39411
|
Tente: this.traduzirDeclaracaoTente.bind(this),
|
|
39329
39412
|
Const: this.traduzirDeclaracaoConst.bind(this),
|
|
39413
|
+
ConstMultiplo: this.traduzirDeclaracaoConstMultiplo.bind(this),
|
|
39330
39414
|
Var: this.traduzirDeclaracaoVar.bind(this),
|
|
39415
|
+
VarMultiplo: this.traduzirDeclaracaoVarMultiplo.bind(this),
|
|
39331
39416
|
Escreva: this.traduzirDeclaracaoEscreva.bind(this),
|
|
39417
|
+
EscrevaMesmaLinha: this.traduzirDeclaracaoEscrevaMesmaLinha.bind(this),
|
|
39418
|
+
TendoComo: this.traduzirDeclaracaoTendoComo.bind(this),
|
|
39419
|
+
TextoDocumentacao: this.traduzirDeclaracaoTextoDocumentacao.bind(this),
|
|
39332
39420
|
};
|
|
39333
39421
|
}
|
|
39334
39422
|
traduzirSimboloOperador(operador) {
|
|
@@ -39344,7 +39432,7 @@ class TradutorAssemblyScript {
|
|
|
39344
39432
|
case delegua_1.default.BIT_NOT:
|
|
39345
39433
|
return '~';
|
|
39346
39434
|
case delegua_1.default.DIFERENTE:
|
|
39347
|
-
return '
|
|
39435
|
+
return '!=';
|
|
39348
39436
|
case delegua_1.default.DIVISAO:
|
|
39349
39437
|
return '/';
|
|
39350
39438
|
case delegua_1.default.E:
|
|
@@ -39354,7 +39442,7 @@ class TradutorAssemblyScript {
|
|
|
39354
39442
|
case delegua_1.default.IGUAL:
|
|
39355
39443
|
return '=';
|
|
39356
39444
|
case delegua_1.default.IGUAL_IGUAL:
|
|
39357
|
-
return '
|
|
39445
|
+
return '==';
|
|
39358
39446
|
case delegua_1.default.MAIOR:
|
|
39359
39447
|
return '>';
|
|
39360
39448
|
case delegua_1.default.MAIOR_IGUAL:
|
|
@@ -39375,6 +39463,7 @@ class TradutorAssemblyScript {
|
|
|
39375
39463
|
}
|
|
39376
39464
|
traduzirFuncoesNativas(metodo) {
|
|
39377
39465
|
switch (metodo.toLowerCase()) {
|
|
39466
|
+
// Array methods
|
|
39378
39467
|
case 'adicionar':
|
|
39379
39468
|
case 'empilhar':
|
|
39380
39469
|
return 'push';
|
|
@@ -39383,6 +39472,7 @@ class TradutorAssemblyScript {
|
|
|
39383
39472
|
case 'fatiar':
|
|
39384
39473
|
return 'slice';
|
|
39385
39474
|
case 'inclui':
|
|
39475
|
+
case 'incluido':
|
|
39386
39476
|
return 'includes';
|
|
39387
39477
|
case 'inverter':
|
|
39388
39478
|
return 'reverse';
|
|
@@ -39396,16 +39486,126 @@ class TradutorAssemblyScript {
|
|
|
39396
39486
|
return 'pop';
|
|
39397
39487
|
case 'tamanho':
|
|
39398
39488
|
return 'length';
|
|
39489
|
+
case 'indice':
|
|
39490
|
+
case 'indiceode':
|
|
39491
|
+
return 'indexOf';
|
|
39492
|
+
// String methods
|
|
39399
39493
|
case 'maiusculo':
|
|
39400
39494
|
return 'toUpperCase';
|
|
39401
39495
|
case 'minusculo':
|
|
39402
39496
|
return 'toLowerCase';
|
|
39403
39497
|
case 'substituir':
|
|
39404
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';
|
|
39405
39550
|
default:
|
|
39406
39551
|
return metodo;
|
|
39407
39552
|
}
|
|
39408
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
|
+
}
|
|
39409
39609
|
traduzirConstrutoArgumentoReferenciaFuncao(argumentoReferenciaFuncao, argumentos) {
|
|
39410
39610
|
const argumentosResolvidos = [];
|
|
39411
39611
|
for (const argumento of argumentos) {
|
|
@@ -39430,7 +39630,7 @@ class TradutorAssemblyScript {
|
|
|
39430
39630
|
return `${separador.conteudo} `;
|
|
39431
39631
|
}
|
|
39432
39632
|
traduzirDeclaracaoEscreva(declaracaoEscreva) {
|
|
39433
|
-
let resultado = '
|
|
39633
|
+
let resultado = 'trace(';
|
|
39434
39634
|
for (const argumento of declaracaoEscreva.argumentos) {
|
|
39435
39635
|
const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
39436
39636
|
resultado += valor + ', ';
|
|
@@ -39441,7 +39641,7 @@ class TradutorAssemblyScript {
|
|
|
39441
39641
|
}
|
|
39442
39642
|
traduzirConstrutoLiteral(literal) {
|
|
39443
39643
|
if (typeof literal.valor === 'string')
|
|
39444
|
-
return `
|
|
39644
|
+
return `"${literal.valor}"`;
|
|
39445
39645
|
return String(literal.valor);
|
|
39446
39646
|
}
|
|
39447
39647
|
resolveTipoDeclaracaoVarEContante(tipo) {
|
|
@@ -39449,25 +39649,67 @@ class TradutorAssemblyScript {
|
|
|
39449
39649
|
case 'texto':
|
|
39450
39650
|
return ': string';
|
|
39451
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';
|
|
39452
39660
|
case 'numero':
|
|
39453
39661
|
case 'número':
|
|
39454
39662
|
case 'real':
|
|
39455
39663
|
return ': f64';
|
|
39664
|
+
case 'real_curto':
|
|
39665
|
+
case 'realCurto':
|
|
39666
|
+
return ': f32';
|
|
39456
39667
|
case 'logico':
|
|
39457
39668
|
case 'lógico':
|
|
39458
39669
|
return ': bool';
|
|
39670
|
+
case 'vazio':
|
|
39671
|
+
case 'nada':
|
|
39672
|
+
return ': void';
|
|
39459
39673
|
case 'nulo':
|
|
39460
|
-
|
|
39674
|
+
throw new Error(`Tipo 'nulo' não é válido no AssemblyScript. Use 'Type | null' para tipos anuláveis.`);
|
|
39461
39675
|
case 'inteiro[]':
|
|
39676
|
+
return ': i32[]';
|
|
39677
|
+
case 'longo[]':
|
|
39678
|
+
return ': i64[]';
|
|
39462
39679
|
case 'real[]':
|
|
39680
|
+
case 'numero[]':
|
|
39681
|
+
case 'número[]':
|
|
39463
39682
|
return ': f64[]';
|
|
39464
39683
|
case 'texto[]':
|
|
39465
39684
|
return ': string[]';
|
|
39466
39685
|
case 'logico[]':
|
|
39467
39686
|
case 'lógico[]':
|
|
39468
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[]';
|
|
39469
39711
|
default:
|
|
39470
|
-
|
|
39712
|
+
throw new Error(`Tipo não reconhecido ou não suportado no AssemblyScript: '${tipo}'. AssemblyScript requer anotações de tipo explícitas.`);
|
|
39471
39713
|
}
|
|
39472
39714
|
}
|
|
39473
39715
|
traduzirDeclaracaoVar(declaracaoVar) {
|
|
@@ -39507,7 +39749,8 @@ class TradutorAssemblyScript {
|
|
|
39507
39749
|
return resultado;
|
|
39508
39750
|
}
|
|
39509
39751
|
traduzirDeclaracaoTente(declaracaoTente) {
|
|
39510
|
-
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';
|
|
39511
39754
|
this.indentacao += 4;
|
|
39512
39755
|
resultado += ' '.repeat(this.indentacao);
|
|
39513
39756
|
for (let condicao of declaracaoTente.caminhoTente) {
|
|
@@ -39543,6 +39786,81 @@ class TradutorAssemblyScript {
|
|
|
39543
39786
|
}
|
|
39544
39787
|
return resultado;
|
|
39545
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
|
+
}
|
|
39546
39864
|
logicaComumBlocoEscopo(declaracoes) {
|
|
39547
39865
|
let resultado = '{\n';
|
|
39548
39866
|
this.indentacao += 4;
|
|
@@ -39626,10 +39944,38 @@ class TradutorAssemblyScript {
|
|
|
39626
39944
|
return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
|
|
39627
39945
|
}
|
|
39628
39946
|
traduzirDeclaracaoParaCada(declaracaoParaCada) {
|
|
39629
|
-
|
|
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} = `;
|
|
39630
39954
|
resultado +=
|
|
39631
|
-
this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + '
|
|
39632
|
-
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;
|
|
39633
39979
|
return resultado;
|
|
39634
39980
|
}
|
|
39635
39981
|
traduzirDeclaracaoPara(declaracaoPara) {
|
|
@@ -39658,19 +40004,89 @@ class TradutorAssemblyScript {
|
|
|
39658
40004
|
}
|
|
39659
40005
|
traduzirDeclaracaoFuncao(declaracaoFuncao) {
|
|
39660
40006
|
let resultado = 'function ';
|
|
39661
|
-
resultado += declaracaoFuncao.simbolo.lexema + '
|
|
40007
|
+
resultado += declaracaoFuncao.simbolo.lexema + '(';
|
|
40008
|
+
// Adiciona parâmetros com tipos
|
|
39662
40009
|
for (const parametro of declaracaoFuncao.funcao.parametros) {
|
|
39663
|
-
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 += ', ';
|
|
39664
40026
|
}
|
|
39665
40027
|
if (declaracaoFuncao.funcao.parametros.length > 0) {
|
|
39666
40028
|
resultado = resultado.slice(0, -2);
|
|
39667
40029
|
}
|
|
39668
|
-
resultado += ')
|
|
40030
|
+
resultado += ')';
|
|
40031
|
+
// Adiciona tipo de retorno
|
|
40032
|
+
const tipoRetorno = this.inferirTipoRetornoFuncao(declaracaoFuncao.funcao);
|
|
40033
|
+
resultado += tipoRetorno;
|
|
40034
|
+
resultado += ' ';
|
|
39669
40035
|
resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
|
|
39670
40036
|
return resultado;
|
|
39671
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
|
+
}
|
|
39672
40088
|
traduzirDeclaracaoFalhar(falhar) {
|
|
39673
|
-
return `
|
|
40089
|
+
return `abort('${falhar.explicacao.valor}')`;
|
|
39674
40090
|
}
|
|
39675
40091
|
traduzirDeclaracaoFazer(declaracaoFazer) {
|
|
39676
40092
|
let resultado = 'do ';
|
|
@@ -39749,6 +40165,146 @@ class TradutorAssemblyScript {
|
|
|
39749
40165
|
resultado += ']';
|
|
39750
40166
|
return resultado;
|
|
39751
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
|
+
}
|
|
39752
40308
|
traduzirConstrutoVariavel(variavel) {
|
|
39753
40309
|
return variavel.simbolo.lexema;
|
|
39754
40310
|
}
|
|
@@ -39766,20 +40322,13 @@ class TradutorAssemblyScript {
|
|
|
39766
40322
|
return resultado;
|
|
39767
40323
|
}
|
|
39768
40324
|
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;
|
|
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.');
|
|
39777
40326
|
}
|
|
39778
40327
|
traduzirConstrutoLogico(logico) {
|
|
39779
|
-
let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
|
|
39780
|
-
let operador = this.traduzirSimboloOperador(logico.operador);
|
|
39781
40328
|
let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
39782
|
-
|
|
40329
|
+
let operador = this.traduzirSimboloOperador(logico.operador);
|
|
40330
|
+
let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
|
|
40331
|
+
return `${esquerda} ${operador} ${direita}`;
|
|
39783
40332
|
}
|
|
39784
40333
|
traduzirFuncaoConstruto(funcaoConstruto) {
|
|
39785
40334
|
let resultado = 'function(';
|
|
@@ -39804,6 +40353,15 @@ class TradutorAssemblyScript {
|
|
|
39804
40353
|
}
|
|
39805
40354
|
traduzirConstrutoChamada(chamada) {
|
|
39806
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
|
+
}
|
|
39807
40365
|
const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
|
|
39808
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; });
|
|
39809
40367
|
if (instanciaClasse) {
|
|
@@ -39839,6 +40397,12 @@ class TradutorAssemblyScript {
|
|
|
39839
40397
|
return resultado;
|
|
39840
40398
|
}
|
|
39841
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
|
+
}
|
|
39842
40406
|
let resultado = '';
|
|
39843
40407
|
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
39844
40408
|
resultado +=
|
|
@@ -39864,16 +40428,23 @@ class TradutorAssemblyScript {
|
|
|
39864
40428
|
' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
39865
40429
|
return resultado;
|
|
39866
40430
|
}
|
|
39867
|
-
// TODO: Eliminar o soft cast para `any`.
|
|
39868
40431
|
traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
|
|
39869
|
-
var _a;
|
|
39870
40432
|
let resultado = '';
|
|
39871
|
-
|
|
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 += '[';
|
|
39872
40442
|
resultado +=
|
|
39873
40443
|
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
|
|
39874
40444
|
resultado += ' = ';
|
|
39875
|
-
|
|
39876
|
-
|
|
40445
|
+
// Traduz o valor a ser atribuído
|
|
40446
|
+
if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
|
|
40447
|
+
resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
|
|
39877
40448
|
}
|
|
39878
40449
|
else {
|
|
39879
40450
|
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);
|