@designliquido/delegua 1.10.0 → 1.11.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/analisador-semantico-base.d.ts +2 -2
- package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico-base.js +14 -6
- package/analisador-semantico/analisador-semantico-base.js.map +1 -1
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +56 -28
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +41 -18
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/analisador-semantico/funcao-hipotetica-interface.d.ts +1 -1
- package/analisador-semantico/gerenciador-escopos.d.ts +1 -1
- package/analisador-semantico/pilha-variaveis.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +149 -42
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/comum.d.ts.map +1 -1
- package/avaliador-sintatico/comum.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +60 -50
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +5 -5
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/erro-avaliador-sintatico.d.ts +18 -0
- package/avaliador-sintatico/erro-avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/erro-avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +93 -31
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +12 -8
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.js +3 -4
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +9 -11
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +1 -1
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +70 -1
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-tupla.d.ts.map +1 -1
- package/bibliotecas/primitivas-tupla.js +34 -14
- package/bibliotecas/primitivas-tupla.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +19 -1
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/ajuda-como-construto.d.ts +2 -2
- package/construtos/ajuda-como-construto.js +1 -1
- package/construtos/atribuir.d.ts.map +1 -1
- package/construtos/atribuir.js +5 -2
- package/construtos/atribuir.js.map +1 -1
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js +1 -2
- package/construtos/binario.js.map +1 -1
- package/construtos/comentario-como-construto.d.ts.map +1 -1
- package/construtos/comentario-como-construto.js.map +1 -1
- package/construtos/decorador.d.ts.map +1 -1
- package/construtos/decorador.js +3 -1
- package/construtos/decorador.js.map +1 -1
- package/construtos/dicionario.d.ts.map +1 -1
- package/construtos/dicionario.js.map +1 -1
- package/construtos/tupla-n.d.ts +3 -3
- package/construtos/tupla-n.d.ts.map +1 -1
- package/construtos/tupla-n.js +4 -2
- package/construtos/tupla-n.js.map +1 -1
- package/declaracoes/ajuda.d.ts +3 -3
- package/declaracoes/classe.d.ts +5 -2
- package/declaracoes/classe.d.ts.map +1 -1
- package/declaracoes/classe.js +13 -4
- package/declaracoes/classe.js.map +1 -1
- package/declaracoes/interface.d.ts.map +1 -1
- package/declaracoes/interface.js.map +1 -1
- package/declaracoes/texto-documentacao.d.ts.map +1 -1
- package/declaracoes/texto-documentacao.js.map +1 -1
- package/estilizador/estilizador-delegua.d.ts.map +1 -1
- package/estilizador/estilizador-delegua.js +5 -1
- package/estilizador/estilizador-delegua.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js.map +1 -1
- package/formatadores/formatador-pitugues.d.ts.map +1 -1
- package/formatadores/formatador-pitugues.js +74 -29
- package/formatadores/formatador-pitugues.js.map +1 -1
- package/geracao-identificadores/index.js +2 -2
- package/geracao-identificadores/index.js.map +1 -1
- package/interfaces/componente-modulo-classe-interface.d.ts.map +1 -1
- package/interfaces/componente-modulo-funcao-interface.d.ts.map +1 -1
- package/interfaces/interpretador-com-depuracao-interface.d.ts.map +1 -1
- package/interfaces/modulo-interface.d.ts +2 -2
- package/interfaces/modulo-interface.d.ts.map +1 -1
- package/interfaces/visitante-comum-interface.d.ts.map +1 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js +65 -55
- package/interpretador/comum.js.map +1 -1
- package/interpretador/depuracao/avaliador-expressao-depuracao.d.ts.map +1 -1
- package/interpretador/depuracao/avaliador-expressao-depuracao.js.map +1 -1
- package/interpretador/depuracao/comum.d.ts.map +1 -1
- package/interpretador/depuracao/comum.js +8 -4
- package/interpretador/depuracao/comum.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -3
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/dialetos/pitugues/comum.d.ts +2 -2
- package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/comum.js +2 -3
- package/interpretador/dialetos/pitugues/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.d.ts +2 -2
- package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.js +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +3 -3
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +3 -2
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/estruturas/classe-de-modulo.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +3 -1
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.d.ts +14 -4
- package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.js +95 -35
- package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
- package/interpretador/estruturas/metodo-polimorfico.d.ts.map +1 -1
- package/interpretador/estruturas/metodo-polimorfico.js +13 -9
- package/interpretador/estruturas/metodo-polimorfico.js.map +1 -1
- package/interpretador/estruturas/metodo-primitiva.d.ts.map +1 -1
- package/interpretador/estruturas/metodo-primitiva.js.map +1 -1
- package/interpretador/estruturas/objeto-base.d.ts.map +1 -1
- package/interpretador/estruturas/objeto-base.js +8 -4
- package/interpretador/estruturas/objeto-base.js.map +1 -1
- package/interpretador/estruturas/objeto-delegua-classe.d.ts +1 -0
- package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
- package/interpretador/estruturas/objeto-delegua-classe.js +41 -23
- package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +4 -4
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +175 -62
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +14 -13
- package/interpretador/interpretador.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/lexador/dialetos/lexador-calango.d.ts.map +1 -1
- package/lexador/dialetos/lexador-calango.js.map +1 -1
- package/lexador/dialetos/lexador-egua-classico.d.ts.map +1 -1
- package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.js +3 -1
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/lexador/dialetos/lexador-portugol-ipt.d.ts.map +1 -1
- package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
- package/lexador/dialetos/lexador-prisma.d.ts.map +1 -1
- package/lexador/dialetos/lexador-prisma.js +25 -3
- package/lexador/dialetos/lexador-prisma.js.map +1 -1
- package/lexador/dialetos/lexador-tenda.d.ts.map +1 -1
- package/lexador/dialetos/lexador-tenda.js.map +1 -1
- package/lexador/filtro-paradigma.d.ts.map +1 -1
- package/lexador/filtro-paradigma.js.map +1 -1
- package/lexador/lexador-base-linha-unica.d.ts.map +1 -1
- package/lexador/lexador-base-linha-unica.js.map +1 -1
- package/lexador/lexador-base.d.ts.map +1 -1
- package/lexador/lexador-base.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js.map +1 -1
- package/lexador/mapeamento-paradigmas.d.ts.map +1 -1
- package/lexador/mapeamento-paradigmas.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts +1 -0
- package/lexador/palavras-reservadas.d.ts.map +1 -1
- package/lexador/palavras-reservadas.js +3 -2
- package/lexador/palavras-reservadas.js.map +1 -1
- package/lexador/simbolo.d.ts.map +1 -1
- package/lexador/simbolo.js.map +1 -1
- package/lexador/traducao/lexador-javascript.d.ts.map +1 -1
- package/package.json +1 -1
- package/tipos-de-simbolos/delegua.d.ts +1 -0
- package/tipos-de-simbolos/delegua.d.ts.map +1 -1
- package/tipos-de-simbolos/delegua.js +1 -0
- package/tipos-de-simbolos/delegua.js.map +1 -1
- package/tradutores/mermaid/aresta-fluxograma.d.ts +1 -1
- package/tradutores/mermaid/subgrafo-classe.d.ts +3 -3
- package/tradutores/mermaid/subgrafo-funcao.d.ts +2 -2
- package/tradutores/mermaid/subgrafo-funcao.d.ts.map +1 -1
- package/tradutores/mermaid/subgrafo-funcao.js.map +1 -1
- package/tradutores/mermaid/subgrafo-metodo.d.ts +2 -2
- package/tradutores/mermaid/vertice-fluxograma.d.ts +1 -1
- package/tradutores/tradutor-assembly-arm.d.ts.map +1 -1
- package/tradutores/tradutor-assembly-arm.js +164 -156
- package/tradutores/tradutor-assembly-arm.js.map +1 -1
- package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
- package/tradutores/tradutor-assembly-x64.js +136 -127
- package/tradutores/tradutor-assembly-x64.js.map +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +10 -6
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-calango.d.ts.map +1 -1
- package/tradutores/tradutor-calango.js.map +1 -1
- package/tradutores/tradutor-elixir.d.ts.map +1 -1
- package/tradutores/tradutor-elixir.js +9 -7
- package/tradutores/tradutor-elixir.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +2 -1
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
- package/tradutores/tradutor-mermaidjs.js +4 -8
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
- package/tradutores/tradutor-portugol-ipt.js.map +1 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +1 -1
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-ruby.d.ts.map +1 -1
- package/tradutores/tradutor-ruby.js +1 -1
- package/tradutores/tradutor-ruby.js.map +1 -1
- package/umd/delegua.js +1353 -730
package/umd/delegua.js
CHANGED
|
@@ -12,7 +12,7 @@ const interfaces_1 = require("../interfaces");
|
|
|
12
12
|
*/
|
|
13
13
|
class AnalisadorSemanticoBase {
|
|
14
14
|
diagnosticoJaExiste(simbolo, mensagem) {
|
|
15
|
-
return this.diagnosticos.some(d => d.linha === simbolo.linha &&
|
|
15
|
+
return this.diagnosticos.some((d) => d.linha === simbolo.linha &&
|
|
16
16
|
d.mensagem === mensagem &&
|
|
17
17
|
d.simbolo.lexema === simbolo.lexema);
|
|
18
18
|
}
|
|
@@ -63,7 +63,7 @@ class AnalisadorSemanticoBase {
|
|
|
63
63
|
for (let [indice, parametro] of parametros.entries()) {
|
|
64
64
|
const argumento = argumentos[indice];
|
|
65
65
|
if (argumento) {
|
|
66
|
-
// Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
|
|
66
|
+
// Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
|
|
67
67
|
// independentemente de ser um `Literal` (tipo já resolvido), `Variavel` (tipo inferido do
|
|
68
68
|
// escopo), `Binario`, `Agrupamento`, ou qualquer outro construto (retorna `null` quando
|
|
69
69
|
// o tipo não pode ser determinado em tempo de compilação).
|
|
@@ -119,7 +119,14 @@ class AnalisadorSemanticoBase {
|
|
|
119
119
|
*/
|
|
120
120
|
inferirTipoBinario(binario) {
|
|
121
121
|
const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
|
|
122
|
-
const operadoresComparacao = [
|
|
122
|
+
const operadoresComparacao = [
|
|
123
|
+
'MAIOR',
|
|
124
|
+
'MAIOR_IGUAL',
|
|
125
|
+
'MENOR',
|
|
126
|
+
'MENOR_IGUAL',
|
|
127
|
+
'IGUAL',
|
|
128
|
+
'DIFERENTE',
|
|
129
|
+
];
|
|
123
130
|
// Operadores de comparação sempre retornam lógico
|
|
124
131
|
if (operadoresComparacao.includes(binario.operador.tipo)) {
|
|
125
132
|
return 'lógico';
|
|
@@ -146,8 +153,8 @@ class AnalisadorSemanticoBase {
|
|
|
146
153
|
return 'qualquer';
|
|
147
154
|
}
|
|
148
155
|
/**
|
|
149
|
-
|
|
150
|
-
|
|
156
|
+
* Marca as variáveis usadas em uma expressão.
|
|
157
|
+
*/
|
|
151
158
|
marcarVariaveisUsadasEmExpressao(expressao) {
|
|
152
159
|
if (expressao instanceof construtos_1.Variavel) {
|
|
153
160
|
this.gerenciadorEscopos.marcarComoUsada(expressao.simbolo.lexema);
|
|
@@ -233,7 +240,8 @@ class AnalisadorSemanticoBase {
|
|
|
233
240
|
if (!caminhoSenaoResolvido || ((_a = caminhoSenaoResolvido.declaracoes) === null || _a === void 0 ? void 0 : _a.length) === 0) {
|
|
234
241
|
return false;
|
|
235
242
|
}
|
|
236
|
-
if (caminhoSenaoResolvido instanceof declaracoes_1.Se &&
|
|
243
|
+
if (caminhoSenaoResolvido instanceof declaracoes_1.Se &&
|
|
244
|
+
((_b = caminhoSenaoResolvido.caminhoEntao.declaracoes) === null || _b === void 0 ? void 0 : _b.length) === 1) {
|
|
237
245
|
const senaoSeRetorna = this.verificarSeRetorna(caminhoSenaoResolvido);
|
|
238
246
|
return entaoRetorna && senaoSeRetorna;
|
|
239
247
|
}
|
|
@@ -592,7 +600,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
592
600
|
}
|
|
593
601
|
visitarChamadaPorVariavel(entidadeChamadaVariavel, argumentos) {
|
|
594
602
|
const variavel = entidadeChamadaVariavel;
|
|
595
|
-
const funcaoChamada = this.gerenciadorEscopos.buscar(variavel.simbolo.lexema) ||
|
|
603
|
+
const funcaoChamada = this.gerenciadorEscopos.buscar(variavel.simbolo.lexema) ||
|
|
604
|
+
this.funcoes[variavel.simbolo.lexema];
|
|
596
605
|
if (!funcaoChamada) {
|
|
597
606
|
this.erro(entidadeChamadaVariavel.simbolo, `Chamada da função '${entidadeChamadaVariavel.simbolo.lexema}' não existe.`);
|
|
598
607
|
return Promise.resolve();
|
|
@@ -889,15 +898,18 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
889
898
|
// Verifica se a expressão problemática é um Leia ou uma variável inicializada com Leia
|
|
890
899
|
let mensagemAdicional = '';
|
|
891
900
|
if (expressaoProblematica instanceof construtos_1.Leia) {
|
|
892
|
-
mensagemAdicional =
|
|
901
|
+
mensagemAdicional =
|
|
902
|
+
" Função 'leia()' retorna texto. Use 'inteiro(leia(...))' ou 'real(leia(...))' para converter.";
|
|
893
903
|
}
|
|
894
904
|
else if (expressaoProblematica instanceof construtos_1.Variavel) {
|
|
895
905
|
const variavel = this.gerenciadorEscopos.buscar(expressaoProblematica.simbolo.lexema);
|
|
896
906
|
if (variavel && variavel.valor instanceof construtos_1.Leia) {
|
|
897
|
-
mensagemAdicional =
|
|
907
|
+
mensagemAdicional =
|
|
908
|
+
" A variável foi inicializada com 'leia()' que retorna texto. Use 'inteiro(leia(...))' ou 'real(leia(...))' para converter.";
|
|
898
909
|
}
|
|
899
910
|
else {
|
|
900
|
-
mensagemAdicional =
|
|
911
|
+
mensagemAdicional =
|
|
912
|
+
" Use 'inteiro(...)' ou 'real(...)' para converter texto em número.";
|
|
901
913
|
}
|
|
902
914
|
}
|
|
903
915
|
this.erro(binario.operador, `Operação aritmética com tipo incompatível: operando ${ladoProblematico} é do tipo 'texto', mas a operação requer número.${mensagemAdicional}`);
|
|
@@ -906,8 +918,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
906
918
|
}
|
|
907
919
|
if (tipoEsquerda && tipoDireita && tipoEsquerda !== tipoDireita) {
|
|
908
920
|
// Verificar se são tipos numéricos compatíveis
|
|
909
|
-
const ambosNumericos = tiposNumericos.includes(tipoEsquerda) &&
|
|
910
|
-
tiposNumericos.includes(tipoDireita);
|
|
921
|
+
const ambosNumericos = tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita);
|
|
911
922
|
if (!ambosNumericos) {
|
|
912
923
|
this.aviso(binario.operador, `Operação entre tipos diferentes: tipo esquerdo '${tipoEsquerda}' e tipo direito '${tipoDireita}'. O resultado será resolvido implicitamente.`);
|
|
913
924
|
}
|
|
@@ -1015,7 +1026,15 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1015
1026
|
let entidadeChamadaVariavel = chamada.entidadeChamada;
|
|
1016
1027
|
const nomeFuncao = entidadeChamadaVariavel.simbolo.lexema;
|
|
1017
1028
|
// Lista de funções built-in que não precisam ser declaradas
|
|
1018
|
-
const funcoesBuiltIn = [
|
|
1029
|
+
const funcoesBuiltIn = [
|
|
1030
|
+
'inteiro',
|
|
1031
|
+
'real',
|
|
1032
|
+
'número',
|
|
1033
|
+
'texto',
|
|
1034
|
+
'leia',
|
|
1035
|
+
'escreva',
|
|
1036
|
+
'tipo',
|
|
1037
|
+
];
|
|
1019
1038
|
// Classes/construtores geralmente começam com letra maiúscula
|
|
1020
1039
|
const pareceSerClasse = nomeFuncao[0] === nomeFuncao[0].toUpperCase();
|
|
1021
1040
|
// Só verifica se a função existe se não for built-in e não parecer ser classe
|
|
@@ -1070,7 +1089,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1070
1089
|
tipo: 'IDENTIFICADOR',
|
|
1071
1090
|
linha: literal.linha,
|
|
1072
1091
|
hashArquivo: literal.hashArquivo,
|
|
1073
|
-
literal: null
|
|
1092
|
+
literal: null,
|
|
1074
1093
|
}, `Variável ou função '${nomeVariavel}' usada em interpolação não existe.`);
|
|
1075
1094
|
}
|
|
1076
1095
|
else if (variavel) {
|
|
@@ -1083,7 +1102,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1083
1102
|
tipo: 'IDENTIFICADOR',
|
|
1084
1103
|
linha: literal.linha,
|
|
1085
1104
|
hashArquivo: literal.hashArquivo,
|
|
1086
|
-
literal: null
|
|
1105
|
+
literal: null,
|
|
1087
1106
|
}, `Variável '${nomeVariavel}' usada em interpolação pode não ter sido inicializada.`);
|
|
1088
1107
|
}
|
|
1089
1108
|
}
|
|
@@ -1146,7 +1165,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1146
1165
|
inicializada: true,
|
|
1147
1166
|
usada: false,
|
|
1148
1167
|
hashArquivo: declaracao.simbolo.hashArquivo,
|
|
1149
|
-
linha: declaracao.simbolo.linha
|
|
1168
|
+
linha: declaracao.simbolo.linha,
|
|
1150
1169
|
});
|
|
1151
1170
|
// TODO: Verificar inicializador.
|
|
1152
1171
|
return Promise.resolve();
|
|
@@ -1178,7 +1197,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1178
1197
|
if (tipoValor === 'string' && tipoRetornoFuncao !== 'texto') {
|
|
1179
1198
|
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
1180
1199
|
}
|
|
1181
|
-
if (tipoValor === 'number' &&
|
|
1200
|
+
if (tipoValor === 'number' &&
|
|
1201
|
+
!['inteiro', 'real', 'número'].includes(tipoRetornoFuncao)) {
|
|
1182
1202
|
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
1183
1203
|
}
|
|
1184
1204
|
}
|
|
@@ -1203,17 +1223,21 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1203
1223
|
tipoInferido = this.obterTipoExpressao(declaracao.inicializador);
|
|
1204
1224
|
}
|
|
1205
1225
|
// Sugestão de tipo melhor quando 'qualquer' é usado explicitamente
|
|
1206
|
-
if (declaracao.tipoExplicito &&
|
|
1226
|
+
if (declaracao.tipoExplicito &&
|
|
1227
|
+
declaracao.tipoOriginal === 'qualquer' &&
|
|
1228
|
+
declaracao.inicializador) {
|
|
1207
1229
|
const tipoMelhor = this.obterTipoExpressao(declaracao.inicializador);
|
|
1208
1230
|
if (tipoMelhor && tipoMelhor !== 'qualquer') {
|
|
1209
|
-
this.sugestao(declaracao.simbolo, 'Um tipo melhor pode ser inferido.', [
|
|
1231
|
+
this.sugestao(declaracao.simbolo, 'Um tipo melhor pode ser inferido.', [
|
|
1232
|
+
{
|
|
1210
1233
|
titulo: `Alterar tipo para '${tipoMelhor}'`,
|
|
1211
1234
|
textoOriginal: 'qualquer',
|
|
1212
1235
|
textoSubstituto: tipoMelhor,
|
|
1213
1236
|
linha: declaracao.simbolo.linha,
|
|
1214
1237
|
colunaInicio: declaracao.simbolo.colunaInicio,
|
|
1215
1238
|
colunaFim: declaracao.simbolo.colunaFim,
|
|
1216
|
-
}
|
|
1239
|
+
},
|
|
1240
|
+
]);
|
|
1217
1241
|
}
|
|
1218
1242
|
}
|
|
1219
1243
|
const variavel = {
|
|
@@ -1224,7 +1248,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1224
1248
|
inicializada: declaracao.inicializador !== null && declaracao.inicializador !== undefined,
|
|
1225
1249
|
usada: false,
|
|
1226
1250
|
hashArquivo: declaracao.simbolo.hashArquivo,
|
|
1227
|
-
linha: declaracao.simbolo.linha
|
|
1251
|
+
linha: declaracao.simbolo.linha,
|
|
1228
1252
|
};
|
|
1229
1253
|
const declaradaComSucesso = this.gerenciadorEscopos.declarar(declaracao.simbolo.lexema, variavel);
|
|
1230
1254
|
if (!declaradaComSucesso) {
|
|
@@ -1282,13 +1306,22 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1282
1306
|
}
|
|
1283
1307
|
estaEmClasseOuSubclasse(nomeClasse) {
|
|
1284
1308
|
var _a;
|
|
1285
|
-
|
|
1286
|
-
|
|
1309
|
+
const visitados = new Set();
|
|
1310
|
+
const pilha = [this.classeAtualEmAnalise];
|
|
1311
|
+
while (pilha.length > 0) {
|
|
1312
|
+
const atual = pilha.pop();
|
|
1313
|
+
if (!atual)
|
|
1314
|
+
continue;
|
|
1315
|
+
if (visitados.has(atual.simbolo.lexema))
|
|
1316
|
+
continue;
|
|
1317
|
+
visitados.add(atual.simbolo.lexema);
|
|
1287
1318
|
if (atual.simbolo.lexema === nomeClasse)
|
|
1288
1319
|
return true;
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1320
|
+
for (const sc of atual.superClasses) {
|
|
1321
|
+
const pai = (_a = this.classesRegistradas.get(sc.simbolo.lexema)) !== null && _a !== void 0 ? _a : null;
|
|
1322
|
+
if (pai)
|
|
1323
|
+
pilha.push(pai);
|
|
1324
|
+
}
|
|
1292
1325
|
}
|
|
1293
1326
|
return false;
|
|
1294
1327
|
}
|
|
@@ -1316,13 +1349,13 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1316
1349
|
}
|
|
1317
1350
|
}
|
|
1318
1351
|
async visitarDeclaracaoClasse(declaracao) {
|
|
1319
|
-
|
|
1320
|
-
const nomeSuperclasse =
|
|
1352
|
+
for (const superClasseVariavel of declaracao.superClasses) {
|
|
1353
|
+
const nomeSuperclasse = superClasseVariavel.simbolo.lexema;
|
|
1321
1354
|
if (nomeSuperclasse === declaracao.simbolo.lexema) {
|
|
1322
|
-
this.erro(
|
|
1355
|
+
this.erro(superClasseVariavel.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
|
|
1323
1356
|
}
|
|
1324
1357
|
else if (!this.classesDeclararadas.has(nomeSuperclasse)) {
|
|
1325
|
-
this.erro(
|
|
1358
|
+
this.erro(superClasseVariavel.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
|
|
1326
1359
|
}
|
|
1327
1360
|
}
|
|
1328
1361
|
this.classesDeclararadas.add(declaracao.simbolo.lexema);
|
|
@@ -1360,7 +1393,9 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1360
1393
|
retorno.tipo === 'qualquer');
|
|
1361
1394
|
// Se a função é 'vazio' e há retornos com tipo indeterminado,
|
|
1362
1395
|
// tenta inferir o tipo e fornece mensagem útil ao desenvolvedor
|
|
1363
|
-
if (tipoRetornoFuncao === 'vazio' &&
|
|
1396
|
+
if (tipoRetornoFuncao === 'vazio' &&
|
|
1397
|
+
declaracao.funcao.tipoExplicito &&
|
|
1398
|
+
retornosComTipoIndeterminado.length > 0) {
|
|
1364
1399
|
const retornoComValor = retornosComTipoIndeterminado[0];
|
|
1365
1400
|
const tipoInferido = this.obterTipoExpressao(retornoComValor.valor);
|
|
1366
1401
|
if (tipoInferido && tipoInferido !== 'qualquer') {
|
|
@@ -1379,7 +1414,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1379
1414
|
if (tipoValor === 'string' && tipoRetornoFuncao !== 'texto') {
|
|
1380
1415
|
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
1381
1416
|
}
|
|
1382
|
-
if (tipoValor === 'number' &&
|
|
1417
|
+
if (tipoValor === 'number' &&
|
|
1418
|
+
!['inteiro', 'real', 'número'].includes(tipoRetornoFuncao)) {
|
|
1383
1419
|
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
1384
1420
|
}
|
|
1385
1421
|
}
|
|
@@ -1395,7 +1431,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1395
1431
|
const naoUsadas = this.gerenciadorEscopos.obterVariaveisNaoUsadas();
|
|
1396
1432
|
for (let variavel of naoUsadas) {
|
|
1397
1433
|
// Verifica se já existe um erro associado à variável.
|
|
1398
|
-
const temErro = this.diagnosticos.some(d => d.severidade === erros_1.DiagnosticoSeveridade.ERRO &&
|
|
1434
|
+
const temErro = this.diagnosticos.some((d) => d.severidade === erros_1.DiagnosticoSeveridade.ERRO &&
|
|
1399
1435
|
d.simbolo.lexema === variavel.nome);
|
|
1400
1436
|
// Se a variável já tem um erro associado, não emitir aviso de não usada.
|
|
1401
1437
|
if (temErro) {
|
|
@@ -1405,7 +1441,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1405
1441
|
lexema: variavel.nome,
|
|
1406
1442
|
linha: variavel.linha,
|
|
1407
1443
|
tipo: variavel.tipo,
|
|
1408
|
-
hashArquivo: variavel.hashArquivo
|
|
1444
|
+
hashArquivo: variavel.hashArquivo,
|
|
1409
1445
|
}, `Variável '${variavel.nome}' foi declarada mas nunca usada.`);
|
|
1410
1446
|
}
|
|
1411
1447
|
}
|
|
@@ -1914,6 +1950,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1914
1950
|
if (this.simbolos[this.atual].lexema in this.tiposDefinidosEmCodigo) {
|
|
1915
1951
|
return this.simbolos[this.atual].lexema;
|
|
1916
1952
|
}
|
|
1953
|
+
if (this.simbolos[this.atual].lexema in this.interfacesDeclaradas) {
|
|
1954
|
+
return this.simbolos[this.atual].lexema;
|
|
1955
|
+
}
|
|
1917
1956
|
const lexemaElementar = this.simbolos[this.atual].lexema.toLowerCase();
|
|
1918
1957
|
const tipoElementarResolvido = tipos.find((tipo) => tipo === lexemaElementar);
|
|
1919
1958
|
if (!tipoElementarResolvido) {
|
|
@@ -1940,7 +1979,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1940
1979
|
}
|
|
1941
1980
|
async construtoAjuda() {
|
|
1942
1981
|
const simboloAjuda = this.avancarEDevolverAnterior();
|
|
1943
|
-
if (this.estaNoFinal() ||
|
|
1982
|
+
if (this.estaNoFinal() ||
|
|
1983
|
+
this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
|
|
1944
1984
|
return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
|
|
1945
1985
|
}
|
|
1946
1986
|
this.avancarEDevolverAnterior(); // parêntese esquerdo
|
|
@@ -2367,7 +2407,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2367
2407
|
// o analisador semântico emitir o diagnóstico quando apropriado.
|
|
2368
2408
|
tipoIdentificadorCorrespondente = 'qualquer';
|
|
2369
2409
|
}
|
|
2370
|
-
if (!tipoIdentificadorCorrespondente.endsWith('[]') &&
|
|
2410
|
+
if (!tipoIdentificadorCorrespondente.endsWith('[]') &&
|
|
2411
|
+
!['dicionário', 'qualquer', 'texto', 'tupla', 'vetor'].includes(tipoIdentificadorCorrespondente)) {
|
|
2371
2412
|
throw this.erro(this.simbolos[this.atual], `Tipo ${tipoIdentificadorCorrespondente} não suporta acesso por índice.`);
|
|
2372
2413
|
}
|
|
2373
2414
|
let tipoAcesso = 'qualquer';
|
|
@@ -2441,8 +2482,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2441
2482
|
if (expressaoAnterior.tipo === 'dicionário' &&
|
|
2442
2483
|
expressaoAnterior.constructor !== construtos_1.Dicionario) {
|
|
2443
2484
|
const elementoMontaoTipos = this.resolverElementoMontao(expressaoAnterior);
|
|
2444
|
-
if (elementoMontaoTipos &&
|
|
2445
|
-
nome.lexema in elementoMontaoTipos.subElementos) {
|
|
2485
|
+
if (elementoMontaoTipos && nome.lexema in elementoMontaoTipos.subElementos) {
|
|
2446
2486
|
tipoInferido = elementoMontaoTipos.subElementos[nome.lexema].tipo;
|
|
2447
2487
|
}
|
|
2448
2488
|
}
|
|
@@ -2699,7 +2739,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2699
2739
|
if (construto instanceof construtos_1.Unario) {
|
|
2700
2740
|
const operando = construto.operando;
|
|
2701
2741
|
// Verifica se o operando é um vetor
|
|
2702
|
-
if (operando instanceof construtos_1.Vetor ||
|
|
2742
|
+
if (operando instanceof construtos_1.Vetor ||
|
|
2743
|
+
operando.tipo === 'vetor' ||
|
|
2744
|
+
operando.tipo.endsWith('[]')) {
|
|
2703
2745
|
return true;
|
|
2704
2746
|
}
|
|
2705
2747
|
// Verifica recursivamente para casos como !![]
|
|
@@ -3310,7 +3352,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3310
3352
|
}
|
|
3311
3353
|
async declaracaoSe() {
|
|
3312
3354
|
const condicao = await this.expressao();
|
|
3313
|
-
const caminhoEntao = await this.resolverDeclaracao();
|
|
3355
|
+
const caminhoEntao = (await this.resolverDeclaracao());
|
|
3314
3356
|
let caminhoSenao = null;
|
|
3315
3357
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
|
|
3316
3358
|
caminhoSenao = await this.resolverDeclaracao();
|
|
@@ -3441,20 +3483,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3441
3483
|
// Uma delas é a variável/constante ser uma classe padrão.
|
|
3442
3484
|
// Isso ocorre quando a importação é feita de uma biblioteca Node.js.
|
|
3443
3485
|
// Nesse caso, o tipo de `entidadeChamada.objeto` começa com uma letra maiúscula.
|
|
3444
|
-
if (entidadeChamada.objeto.tipo &&
|
|
3445
|
-
entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
|
|
3486
|
+
if (entidadeChamada.objeto.tipo && entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
|
|
3446
3487
|
const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[entidadeChamada.objeto.tipo];
|
|
3447
3488
|
if (!tipoCorrespondente) {
|
|
3448
3489
|
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${entidadeChamada.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
|
|
3449
3490
|
}
|
|
3450
|
-
if (!(entidadeChamada.simbolo.lexema in
|
|
3451
|
-
tipoCorrespondente.
|
|
3452
|
-
!(entidadeChamada.simbolo.lexema in
|
|
3453
|
-
tipoCorrespondente.propriedades)) {
|
|
3491
|
+
if (!(entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) &&
|
|
3492
|
+
!(entidadeChamada.simbolo.lexema in tipoCorrespondente.propriedades)) {
|
|
3454
3493
|
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Membro '${entidadeChamada.simbolo.lexema}' não existe no tipo '${entidadeChamada.objeto.tipo}'.`);
|
|
3455
3494
|
}
|
|
3456
|
-
if (entidadeChamada.simbolo.lexema in
|
|
3457
|
-
tipoCorrespondente.metodos) {
|
|
3495
|
+
if (entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) {
|
|
3458
3496
|
const metodoCorrespondente = tipoCorrespondente.metodos[entidadeChamada.simbolo.lexema];
|
|
3459
3497
|
return metodoCorrespondente.tipoRetorno || 'qualquer';
|
|
3460
3498
|
}
|
|
@@ -3807,7 +3845,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3807
3845
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo da interface.");
|
|
3808
3846
|
const metodos = [];
|
|
3809
3847
|
const propriedades = [];
|
|
3810
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
3848
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
3849
|
+
!this.estaNoFinal()) {
|
|
3811
3850
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
3812
3851
|
if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA))
|
|
3813
3852
|
break;
|
|
@@ -3858,13 +3897,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3858
3897
|
const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
3859
3898
|
// Pré-registro para permitir auto-referência no corpo da própria classe,
|
|
3860
3899
|
// como em `MinhaClasse.propriedadeEstatica` dentro de métodos.
|
|
3861
|
-
this.tiposDefinidosEmCodigo[simbolo.lexema] =
|
|
3900
|
+
this.tiposDefinidosEmCodigo[simbolo.lexema] =
|
|
3901
|
+
(_a = this.tiposDefinidosEmCodigo[simbolo.lexema]) !== null && _a !== void 0 ? _a : {};
|
|
3862
3902
|
const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
|
|
3863
|
-
|
|
3903
|
+
// Verificar `herda SuperclasseA, SuperclasseB`
|
|
3904
|
+
const superClasses = [];
|
|
3864
3905
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3906
|
+
do {
|
|
3907
|
+
const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
|
|
3908
|
+
if (superClasses.length === 0) {
|
|
3909
|
+
this.superclasseAtual = simboloSuperclasse.lexema;
|
|
3910
|
+
}
|
|
3911
|
+
superClasses.push(new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema));
|
|
3912
|
+
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
3868
3913
|
}
|
|
3869
3914
|
// Verificar `implementa InterfaceA, InterfaceB`
|
|
3870
3915
|
const implementaInterfaces = [];
|
|
@@ -3873,6 +3918,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3873
3918
|
implementaInterfaces.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome de interface após "implementa".'));
|
|
3874
3919
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
3875
3920
|
}
|
|
3921
|
+
// Verificar `mescla MisturávelA, MisturávelB`
|
|
3922
|
+
const mesclas = [];
|
|
3923
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MESCLA)) {
|
|
3924
|
+
do {
|
|
3925
|
+
const simboloMisturavel = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome de classe após "mescla".');
|
|
3926
|
+
mesclas.push(new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloMisturavel.lexema));
|
|
3927
|
+
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
3928
|
+
}
|
|
3876
3929
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
|
|
3877
3930
|
this.pilhaDecoradores = [];
|
|
3878
3931
|
const metodos = [];
|
|
@@ -3883,7 +3936,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3883
3936
|
*/
|
|
3884
3937
|
const compreenderMembros = async (acessoPadrao, ehEstaticoPadrao, ehAbstratoPadrao = false) => {
|
|
3885
3938
|
var _a;
|
|
3886
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
3939
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
3940
|
+
!this.estaNoFinal()) {
|
|
3887
3941
|
// Pular comentários normais dentro do corpo da classe.
|
|
3888
3942
|
if (this.simbolos[this.atual].tipo === delegua_2.default.COMENTARIO ||
|
|
3889
3943
|
this.simbolos[this.atual].tipo === delegua_2.default.LINHA_COMENTARIO) {
|
|
@@ -3904,12 +3958,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3904
3958
|
// Detecção de bloco de contexto: modificador seguido de '{'
|
|
3905
3959
|
const tipoAtual = this.simbolos[this.atual].tipo;
|
|
3906
3960
|
const tipoProximo = (_a = this.simbolos[this.atual + 1]) === null || _a === void 0 ? void 0 : _a.tipo;
|
|
3907
|
-
const ehBlocoAcesso = [delegua_2.default.PRIVADO, delegua_2.default.PROTEGIDO].includes(tipoAtual)
|
|
3908
|
-
|
|
3909
|
-
const ehBlocoEstatico = tipoAtual === delegua_2.default.ESTATICO
|
|
3910
|
-
|
|
3911
|
-
const ehBlocoAbstrato = tipoAtual === delegua_2.default.ABSTRATO
|
|
3912
|
-
|
|
3961
|
+
const ehBlocoAcesso = [delegua_2.default.PRIVADO, delegua_2.default.PROTEGIDO].includes(tipoAtual) &&
|
|
3962
|
+
tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
|
|
3963
|
+
const ehBlocoEstatico = tipoAtual === delegua_2.default.ESTATICO &&
|
|
3964
|
+
tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
|
|
3965
|
+
const ehBlocoAbstrato = tipoAtual === delegua_2.default.ABSTRATO &&
|
|
3966
|
+
tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
|
|
3913
3967
|
if (ehBlocoAcesso) {
|
|
3914
3968
|
const novoAcesso = tipoAtual === delegua_2.default.PRIVADO ? 'privado' : 'protegido';
|
|
3915
3969
|
this.avancarEDevolverAnterior(); // consume modificador de acesso
|
|
@@ -4006,14 +4060,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4006
4060
|
for (const declaracao of corpo) {
|
|
4007
4061
|
expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
|
|
4008
4062
|
}
|
|
4009
|
-
const tiposRetornos = new Set(expressoesRetorna
|
|
4063
|
+
const tiposRetornos = new Set(expressoesRetorna
|
|
4064
|
+
.filter((e) => e.tipo !== 'qualquer')
|
|
4065
|
+
.map((e) => e.tipo));
|
|
4010
4066
|
const retornaChamadoExplicitamente = tiposRetornos.size > 0;
|
|
4011
4067
|
tiposRetornos.delete('qualquer');
|
|
4012
4068
|
if (tipoRetorno === 'qualquer') {
|
|
4013
4069
|
if (tiposRetornos.size > 0) {
|
|
4014
4070
|
tipoRetorno = tiposRetornos.values().next().value;
|
|
4015
4071
|
}
|
|
4016
|
-
else if (!retornaChamadoExplicitamente &&
|
|
4072
|
+
else if (!retornaChamadoExplicitamente &&
|
|
4073
|
+
!definicaoExplicitaDeTipo) {
|
|
4017
4074
|
tipoRetorno = 'vazio';
|
|
4018
4075
|
}
|
|
4019
4076
|
}
|
|
@@ -4035,7 +4092,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4035
4092
|
const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
|
|
4036
4093
|
this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
|
|
4037
4094
|
const tipoPropriedade = this.avancarEDevolverAnterior();
|
|
4038
|
-
|
|
4095
|
+
let nomeTipoPropriedade = tipoPropriedade.lexema;
|
|
4096
|
+
if (this.verificarTipoSimboloAtual(delegua_2.default.COLCHETE_ESQUERDO)) {
|
|
4097
|
+
this.avancarEDevolverAnterior(); // consume '['
|
|
4098
|
+
this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após '[' na definição do tipo de propriedade.");
|
|
4099
|
+
nomeTipoPropriedade = `${nomeTipoPropriedade}[]`;
|
|
4100
|
+
}
|
|
4101
|
+
const prop = new declaracoes_1.PropriedadeClasse(nomePropriedade, nomeTipoPropriedade, Array.from(this.pilhaDecoradores), modificadorAcesso, ehEstatico);
|
|
4039
4102
|
prop.documentacao = docAtual;
|
|
4040
4103
|
// Auto-propriedade: `nome: tipo { obter; definir; }`
|
|
4041
4104
|
// Ou corpo personalizado: `nome: tipo { obter() { ... } definir(valor) { ... } }`
|
|
@@ -4063,13 +4126,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4063
4126
|
let tipoAcessor = 'qualquer';
|
|
4064
4127
|
let expressoesRetornaAcessor = [];
|
|
4065
4128
|
for (const declaracao of corpoAcessor) {
|
|
4066
|
-
expressoesRetornaAcessor =
|
|
4129
|
+
expressoesRetornaAcessor =
|
|
4130
|
+
expressoesRetornaAcessor.concat((0, comum_1.buscarRetornos)(declaracao));
|
|
4067
4131
|
}
|
|
4068
|
-
const tiposRetornosAcessor = new Set(expressoesRetornaAcessor
|
|
4132
|
+
const tiposRetornosAcessor = new Set(expressoesRetornaAcessor
|
|
4133
|
+
.filter((e) => e.tipo !== 'qualquer')
|
|
4134
|
+
.map((e) => e.tipo));
|
|
4069
4135
|
const retornaExplicitamenteAcessor = tiposRetornosAcessor.size > 0;
|
|
4070
4136
|
tiposRetornosAcessor.delete('qualquer');
|
|
4071
4137
|
if (tiposRetornosAcessor.size > 0) {
|
|
4072
|
-
tipoAcessor = tiposRetornosAcessor
|
|
4138
|
+
tipoAcessor = tiposRetornosAcessor
|
|
4139
|
+
.values()
|
|
4140
|
+
.next().value;
|
|
4073
4141
|
}
|
|
4074
4142
|
else if (!retornaExplicitamenteAcessor) {
|
|
4075
4143
|
tipoAcessor = 'vazio';
|
|
@@ -4121,28 +4189,59 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4121
4189
|
await compreenderMembros('publico', false);
|
|
4122
4190
|
this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
|
|
4123
4191
|
// Verificação em tempo de análise: classe deve implementar todos os contratos das interfaces.
|
|
4192
|
+
const linhaFinalClasse = this.simbolos[this.atual - 1].linha;
|
|
4124
4193
|
for (const nomeInterface of implementaInterfaces) {
|
|
4125
4194
|
const interfaceDecl = this.interfacesDeclaradas[nomeInterface.lexema];
|
|
4126
4195
|
if (!interfaceDecl) {
|
|
4127
4196
|
this.erros.push(this.erro(nomeInterface, `Interface '${nomeInterface.lexema}' não foi declarada antes da classe '${simbolo.lexema}'.`));
|
|
4128
4197
|
continue;
|
|
4129
4198
|
}
|
|
4199
|
+
const membrosFaltando = [];
|
|
4130
4200
|
for (const assinatura of interfaceDecl.metodos) {
|
|
4131
4201
|
const nomeMetodo = assinatura.nome.lexema;
|
|
4132
4202
|
const implementado = metodos.some((m) => m.simbolo.lexema === nomeMetodo);
|
|
4133
4203
|
if (!implementado) {
|
|
4134
|
-
|
|
4204
|
+
membrosFaltando.push({
|
|
4205
|
+
tipo: 'metodo',
|
|
4206
|
+
nome: nomeMetodo,
|
|
4207
|
+
parametros: assinatura.parametros.map((p) => ({
|
|
4208
|
+
nome: p.nome.lexema,
|
|
4209
|
+
tipoDado: p.tipoDado,
|
|
4210
|
+
})),
|
|
4211
|
+
tipoRetorno: assinatura.tipoRetorno,
|
|
4212
|
+
});
|
|
4135
4213
|
}
|
|
4136
4214
|
}
|
|
4137
4215
|
for (const prop of interfaceDecl.propriedades) {
|
|
4138
4216
|
const nomeProp = prop.nome.lexema;
|
|
4139
4217
|
const implementada = propriedades.some((p) => p.nome.lexema === nomeProp);
|
|
4140
4218
|
if (!implementada) {
|
|
4141
|
-
|
|
4219
|
+
membrosFaltando.push({
|
|
4220
|
+
tipo: 'propriedade',
|
|
4221
|
+
nome: nomeProp,
|
|
4222
|
+
tipoPropriedade: prop.tipo,
|
|
4223
|
+
});
|
|
4224
|
+
}
|
|
4225
|
+
}
|
|
4226
|
+
if (membrosFaltando.length > 0) {
|
|
4227
|
+
const correcaoSugerida = {
|
|
4228
|
+
tipo: 'implementar-interface',
|
|
4229
|
+
nomeInterface: nomeInterface.lexema,
|
|
4230
|
+
nomeClasse: simbolo.lexema,
|
|
4231
|
+
membrosFaltando,
|
|
4232
|
+
linhaFinalClasse,
|
|
4233
|
+
};
|
|
4234
|
+
for (const membro of membrosFaltando) {
|
|
4235
|
+
const mensagem = membro.tipo === 'metodo'
|
|
4236
|
+
? `Classe '${simbolo.lexema}' não implementa o método '${membro.nome}' exigido pela interface '${nomeInterface.lexema}'.`
|
|
4237
|
+
: `Classe '${simbolo.lexema}' não declara a propriedade '${membro.nome}' exigida pela interface '${nomeInterface.lexema}'.`;
|
|
4238
|
+
const erro = this.erro(simbolo, mensagem);
|
|
4239
|
+
erro.correcaoSugerida = correcaoSugerida;
|
|
4240
|
+
this.erros.push(erro);
|
|
4142
4241
|
}
|
|
4143
4242
|
}
|
|
4144
4243
|
}
|
|
4145
|
-
const definicaoClasse = new declaracoes_1.Classe(simbolo,
|
|
4244
|
+
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstatica, implementaInterfaces, mesclas);
|
|
4146
4245
|
this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
|
|
4147
4246
|
this.superclasseAtual = undefined;
|
|
4148
4247
|
return definicaoClasse;
|
|
@@ -4166,7 +4265,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4166
4265
|
if (!this.primitivasConhecidas[nomeTipo]) {
|
|
4167
4266
|
this.primitivasConhecidas[nomeTipo] = {};
|
|
4168
4267
|
}
|
|
4169
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
4268
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
4269
|
+
!this.estaNoFinal()) {
|
|
4170
4270
|
// Pular comentários dentro do corpo da extensão.
|
|
4171
4271
|
if (this.simbolos[this.atual].tipo === delegua_2.default.COMENTARIO ||
|
|
4172
4272
|
this.simbolos[this.atual].tipo === delegua_2.default.LINHA_COMENTARIO) {
|
|
@@ -4214,7 +4314,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4214
4314
|
const metodo = new declaracoes_1.FuncaoDeclaracao(nomeMetodo, corpoFuncao, tipoDaFuncao);
|
|
4215
4315
|
metodos.push(metodo);
|
|
4216
4316
|
const argumentos = params.map((parametro) => new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer', parametro.valorPadrao === undefined));
|
|
4217
|
-
this.primitivasConhecidas[nomeTipo][nomeMetodo.lexema] =
|
|
4317
|
+
this.primitivasConhecidas[nomeTipo][nomeMetodo.lexema] =
|
|
4318
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeMetodo.lexema, tipoRetorno, true, argumentos);
|
|
4218
4319
|
}
|
|
4219
4320
|
this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' ao final da extensão.");
|
|
4220
4321
|
return new declaracoes_1.Extensao(simboloTipo, metodos, ehGlobal, this.hashArquivo);
|
|
@@ -4246,7 +4347,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4246
4347
|
this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
|
|
4247
4348
|
this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
|
|
4248
4349
|
this.avancarEDevolverAnterior();
|
|
4249
|
-
const declaracaoFuncao = await this.funcao('funcao');
|
|
4350
|
+
const declaracaoFuncao = (await this.funcao('funcao'));
|
|
4250
4351
|
declaracaoFuncao.documentacao = docTopLevel;
|
|
4251
4352
|
return declaracaoFuncao;
|
|
4252
4353
|
}
|
|
@@ -4320,7 +4421,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4320
4421
|
this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
|
|
4321
4422
|
this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
|
|
4322
4423
|
this.avancarEDevolverAnterior();
|
|
4323
|
-
const declaracaoFuncao = await this.funcao('funcao');
|
|
4424
|
+
const declaracaoFuncao = (await this.funcao('funcao'));
|
|
4324
4425
|
declaracaoFuncao.documentacao = new construtos_1.ComentarioComoConstruto(simboloDoc);
|
|
4325
4426
|
return declaracaoFuncao;
|
|
4326
4427
|
}
|
|
@@ -4390,7 +4491,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4390
4491
|
}
|
|
4391
4492
|
async declaracaoAjuda() {
|
|
4392
4493
|
const simboloAjuda = this.avancarEDevolverAnterior();
|
|
4393
|
-
if (this.estaNoFinal() ||
|
|
4494
|
+
if (this.estaNoFinal() ||
|
|
4495
|
+
this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
|
|
4394
4496
|
return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
|
|
4395
4497
|
}
|
|
4396
4498
|
this.avancarEDevolverAnterior(); // parêntese esquerdo
|
|
@@ -4412,10 +4514,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4412
4514
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
4413
4515
|
// Funções nativas de Delégua
|
|
4414
4516
|
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'número'));
|
|
4517
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatório', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatório', 'número'));
|
|
4415
4518
|
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorioEntre', 'número', true, [
|
|
4416
4519
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
|
|
4417
4520
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
|
|
4418
4521
|
]));
|
|
4522
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatórioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatórioEntre', 'número', true, [
|
|
4523
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
|
|
4524
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
|
|
4525
|
+
]));
|
|
4419
4526
|
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('algum', 'lógico', true, [
|
|
4420
4527
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4421
4528
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
@@ -4431,14 +4538,26 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4431
4538
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4432
4539
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
4433
4540
|
]));
|
|
4541
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarÍndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÍndice', 'inteiro', true, [
|
|
4542
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4543
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
4544
|
+
]));
|
|
4434
4545
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimo', 'inteiro', true, [
|
|
4435
4546
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4436
4547
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
4437
4548
|
]));
|
|
4549
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarÚltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÚltimo', 'inteiro', true, [
|
|
4550
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4551
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
4552
|
+
]));
|
|
4438
4553
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimoIndice', 'inteiro', true, [
|
|
4439
4554
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4440
4555
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
4441
4556
|
]));
|
|
4557
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarÚltimoÍndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÚltimoÍndice', 'inteiro', true, [
|
|
4558
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4559
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
4560
|
+
]));
|
|
4442
4561
|
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrarPor', 'qualquer[]', true, [
|
|
4443
4562
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4444
4563
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
|
|
@@ -4447,6 +4566,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4447
4566
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4448
4567
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
4449
4568
|
]));
|
|
4569
|
+
this.pilhaEscopos.definirInformacoesVariavel('incluído', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('incluído', 'lógico', true, [
|
|
4570
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4571
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
4572
|
+
]));
|
|
4450
4573
|
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('inteiro', 'inteiro', true, [
|
|
4451
4574
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
4452
4575
|
]));
|
|
@@ -4462,6 +4585,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4462
4585
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4463
4586
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoMapeamento', 'função'),
|
|
4464
4587
|
]));
|
|
4588
|
+
this.pilhaEscopos.definirInformacoesVariavel('maximo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'qualquer', true, [
|
|
4589
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4590
|
+
]));
|
|
4591
|
+
this.pilhaEscopos.definirInformacoesVariavel('máximo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('máximo', 'qualquer', true, [
|
|
4592
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4593
|
+
]));
|
|
4594
|
+
this.pilhaEscopos.definirInformacoesVariavel('minimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'qualquer', true, [
|
|
4595
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4596
|
+
]));
|
|
4597
|
+
this.pilhaEscopos.definirInformacoesVariavel('mínimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('mínimo', 'qualquer', true, [
|
|
4598
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4599
|
+
]));
|
|
4465
4600
|
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
|
|
4466
4601
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
4467
4602
|
]));
|
|
@@ -4480,6 +4615,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4480
4615
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4481
4616
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
|
|
4482
4617
|
]));
|
|
4618
|
+
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondição', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiroEmCondição', 'qualquer', true, [
|
|
4619
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4620
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
|
|
4621
|
+
]));
|
|
4483
4622
|
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('real', 'número', true, [
|
|
4484
4623
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
4485
4624
|
]));
|
|
@@ -4495,12 +4634,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4495
4634
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
4496
4635
|
]));
|
|
4497
4636
|
this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
|
|
4498
|
-
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer')
|
|
4637
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
|
|
4499
4638
|
]));
|
|
4500
4639
|
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
|
|
4501
4640
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
|
|
4502
4641
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
|
|
4503
4642
|
]));
|
|
4643
|
+
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondição', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondição', 'lógico', true, [
|
|
4644
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
|
|
4645
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
|
|
4646
|
+
]));
|
|
4504
4647
|
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
|
|
4505
4648
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
4506
4649
|
]));
|
|
@@ -5276,7 +5419,7 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
5276
5419
|
}
|
|
5277
5420
|
this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
|
|
5278
5421
|
this.superclasseAtual = undefined;
|
|
5279
|
-
return new declaracoes_1.Classe(nome, superClasse, metodos);
|
|
5422
|
+
return new declaracoes_1.Classe(nome, superClasse ? [superClasse] : [], metodos);
|
|
5280
5423
|
}
|
|
5281
5424
|
resolverDeclaracaoForaDeBloco() {
|
|
5282
5425
|
try {
|
|
@@ -5370,20 +5513,16 @@ class AvaliadorSintaticoPitugues {
|
|
|
5370
5513
|
// Uma delas é a variável/constante ser uma classe padrão.
|
|
5371
5514
|
// Isso ocorre quando a importação é feita de uma biblioteca Node.js.
|
|
5372
5515
|
// Nesse caso, o tipo de `entidadeChamada.objeto` começa com uma letra maiúscula.
|
|
5373
|
-
if (entidadeChamada.objeto.tipo &&
|
|
5374
|
-
entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
|
|
5516
|
+
if (entidadeChamada.objeto.tipo && entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
|
|
5375
5517
|
const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[entidadeChamada.objeto.tipo];
|
|
5376
5518
|
if (!tipoCorrespondente) {
|
|
5377
5519
|
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${entidadeChamada.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
|
|
5378
5520
|
}
|
|
5379
|
-
if (!(entidadeChamada.simbolo.lexema in
|
|
5380
|
-
tipoCorrespondente.
|
|
5381
|
-
!(entidadeChamada.simbolo.lexema in
|
|
5382
|
-
tipoCorrespondente.propriedades)) {
|
|
5521
|
+
if (!(entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) &&
|
|
5522
|
+
!(entidadeChamada.simbolo.lexema in tipoCorrespondente.propriedades)) {
|
|
5383
5523
|
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Membro '${entidadeChamada.simbolo.lexema}' não existe no tipo '${entidadeChamada.objeto.tipo}'.`);
|
|
5384
5524
|
}
|
|
5385
|
-
if (entidadeChamada.simbolo.lexema in
|
|
5386
|
-
tipoCorrespondente.metodos) {
|
|
5525
|
+
if (entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) {
|
|
5387
5526
|
const metodoCorrespondente = tipoCorrespondente.metodos[entidadeChamada.simbolo.lexema];
|
|
5388
5527
|
return metodoCorrespondente.tipoRetorno || 'qualquer';
|
|
5389
5528
|
}
|
|
@@ -5516,7 +5655,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
5516
5655
|
pos++;
|
|
5517
5656
|
}
|
|
5518
5657
|
// Verifica se há um identificador obrigatório
|
|
5519
|
-
if (pos >= this.simbolos.length ||
|
|
5658
|
+
if (pos >= this.simbolos.length ||
|
|
5659
|
+
this.simbolos[pos].tipo !== pitugues_2.default.IDENTIFICADOR) {
|
|
5520
5660
|
return false;
|
|
5521
5661
|
}
|
|
5522
5662
|
pos++;
|
|
@@ -5539,7 +5679,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
5539
5679
|
}
|
|
5540
5680
|
temPadraoVarComoPalavraChave() {
|
|
5541
5681
|
// Verifica padrão: var identificador = ...
|
|
5542
|
-
if (this.simbolos[this.atual].lexema !==
|
|
5682
|
+
if (this.simbolos[this.atual].lexema !== 'var') {
|
|
5543
5683
|
return false;
|
|
5544
5684
|
}
|
|
5545
5685
|
const proximo = this.simbolos[this.atual + 1];
|
|
@@ -5572,7 +5712,9 @@ class AvaliadorSintaticoPitugues {
|
|
|
5572
5712
|
this.consumir(pitugues_2.default.MULTIPLICACAO, '');
|
|
5573
5713
|
ehRestoAtual = true;
|
|
5574
5714
|
}
|
|
5575
|
-
const identificador = this.consumir(pitugues_2.default.IDENTIFICADOR, ehRestoAtual
|
|
5715
|
+
const identificador = this.consumir(pitugues_2.default.IDENTIFICADOR, ehRestoAtual
|
|
5716
|
+
? 'Esperado nome de variável após operador *.'
|
|
5717
|
+
: 'Esperado nome de variável.');
|
|
5576
5718
|
// Verifica * no nome da variável
|
|
5577
5719
|
if (identificador.lexema.startsWith('*')) {
|
|
5578
5720
|
ehRestoAtual = true;
|
|
@@ -5600,10 +5742,10 @@ class AvaliadorSintaticoPitugues {
|
|
|
5600
5742
|
}
|
|
5601
5743
|
construirValidacaoDesempacotamento(identificador, origem, qtdEsperada) {
|
|
5602
5744
|
const linha = identificador.linha;
|
|
5603
|
-
const chamadaTamanho = new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(pitugues_2.default.IDENTIFICADOR,
|
|
5604
|
-
const condicaoErro = new construtos_1.Binario(this.hashArquivo, chamadaTamanho, new lexador_1.Simbolo(pitugues_2.default.DIFERENTE,
|
|
5745
|
+
const chamadaTamanho = new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(pitugues_2.default.IDENTIFICADOR, 'tamanho', null, linha, -1)), [origem]);
|
|
5746
|
+
const condicaoErro = new construtos_1.Binario(this.hashArquivo, chamadaTamanho, new lexador_1.Simbolo(pitugues_2.default.DIFERENTE, '!=', null, linha, -1), new construtos_1.Literal(this.hashArquivo, linha, qtdEsperada, 'número'));
|
|
5605
5747
|
const mensagem = `Erro de execução: Você tentou desempacotar em ${qtdEsperada} variáveis, mas o vetor possui tamanho diferente.`;
|
|
5606
|
-
const falha = new declaracoes_1.Falhar(new lexador_1.Simbolo(pitugues_2.default.FALHAR,
|
|
5748
|
+
const falha = new declaracoes_1.Falhar(new lexador_1.Simbolo(pitugues_2.default.FALHAR, 'falhar', null, linha, -1), new construtos_1.Literal(this.hashArquivo, linha, mensagem, 'texto'));
|
|
5607
5749
|
return new declaracoes_1.Se(condicaoErro, new declaracoes_1.Bloco(this.hashArquivo, linha, [falha]), [], null);
|
|
5608
5750
|
}
|
|
5609
5751
|
async declaracaoDeVariaveis() {
|
|
@@ -5615,7 +5757,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
5615
5757
|
const ehDesempacotamento = qtdIdentificadores > 1 && qtdValores === 1;
|
|
5616
5758
|
if (indexResto > -1) {
|
|
5617
5759
|
if (qtdValores < qtdIdentificadores - 1) {
|
|
5618
|
-
if (!ehDesempacotamento ||
|
|
5760
|
+
if (!ehDesempacotamento ||
|
|
5761
|
+
(ehDesempacotamento && inicializadores[0] instanceof construtos_1.Literal)) {
|
|
5619
5762
|
throw this.erro(this.simboloAnterior(), 'Quantidade insuficiente de valores para desempacotamento com operador de resto.');
|
|
5620
5763
|
}
|
|
5621
5764
|
}
|
|
@@ -5651,7 +5794,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
5651
5794
|
for (let i = 0; i < identificadores.length; i++) {
|
|
5652
5795
|
const identificador = identificadores[i];
|
|
5653
5796
|
let inicializador;
|
|
5654
|
-
let tipo =
|
|
5797
|
+
let tipo = 'qualquer';
|
|
5655
5798
|
if (i === indexResto) {
|
|
5656
5799
|
const valoresResto = inicializadores.slice(cursorValores, cursorValores + qtdParaResto);
|
|
5657
5800
|
let tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(valoresResto);
|
|
@@ -5858,17 +6001,19 @@ class AvaliadorSintaticoPitugues {
|
|
|
5858
6001
|
case pitugues_2.default.INTERPOLACAO:
|
|
5859
6002
|
const simboloInterpolacao = this.avancarEDevolverAnterior();
|
|
5860
6003
|
const conteudoOriginal = simboloInterpolacao.literal;
|
|
5861
|
-
const codigoTransformado = '"' +
|
|
5862
|
-
|
|
5863
|
-
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
5867
|
-
|
|
6004
|
+
const codigoTransformado = '"' +
|
|
6005
|
+
conteudoOriginal.replace(/\{(.*?)\}/g, (_, miolo) => {
|
|
6006
|
+
// 'miolo' é o texto que estava dentro das chaves. Ex: "valor" ou "valor:.2f"
|
|
6007
|
+
if (miolo.includes(':')) {
|
|
6008
|
+
const [variavel, formato] = miolo.split(':').map((s) => s.trim());
|
|
6009
|
+
if (variavel !== '') {
|
|
6010
|
+
// Transforma {valor:.2f} em "{:.2f}".formatar(valor)
|
|
6011
|
+
return '" + "{:' + formato + '}".formatar(' + variavel + ') + "';
|
|
6012
|
+
}
|
|
5868
6013
|
}
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
|
|
6014
|
+
return '" + (' + miolo.trim() + ') + "';
|
|
6015
|
+
}) +
|
|
6016
|
+
'"';
|
|
5872
6017
|
const microLexador = new micro_lexador_pitugues_1.MicroLexadorPitugues();
|
|
5873
6018
|
const retornoMicroLexador = microLexador.mapear(codigoTransformado);
|
|
5874
6019
|
const microAvaliadorSintatico = new micro_avaliador_sintatico_pitugues_1.MicroAvaliadorSintaticoPitugues();
|
|
@@ -5881,7 +6026,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
5881
6026
|
}
|
|
5882
6027
|
catch (erro) {
|
|
5883
6028
|
this.erros.push(erro);
|
|
5884
|
-
return new construtos_1.Literal(this.hashArquivo, simboloInterpolacao.linha,
|
|
6029
|
+
return new construtos_1.Literal(this.hashArquivo, simboloInterpolacao.linha, '');
|
|
5885
6030
|
}
|
|
5886
6031
|
const declaracao = retornoMicroAvaliador.declaracoes[0];
|
|
5887
6032
|
return declaracao.expressao;
|
|
@@ -5939,11 +6084,11 @@ class AvaliadorSintaticoPitugues {
|
|
|
5939
6084
|
let passo = null;
|
|
5940
6085
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)) {
|
|
5941
6086
|
ehFatiamento = true;
|
|
5942
|
-
if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)
|
|
5943
|
-
|
|
6087
|
+
if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS) &&
|
|
6088
|
+
!this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
|
|
5944
6089
|
fim = await this.expressao();
|
|
5945
|
-
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)
|
|
5946
|
-
|
|
6090
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS) &&
|
|
6091
|
+
!this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
|
|
5947
6092
|
passo = await this.expressao();
|
|
5948
6093
|
}
|
|
5949
6094
|
const simboloFechamento = this.consumir(pitugues_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
@@ -6075,11 +6220,13 @@ class AvaliadorSintaticoPitugues {
|
|
|
6075
6220
|
}
|
|
6076
6221
|
async seTernario() {
|
|
6077
6222
|
let expressaoEntao = await this.ou();
|
|
6078
|
-
if (this.simbolos[this.atual] &&
|
|
6223
|
+
if (this.simbolos[this.atual] &&
|
|
6224
|
+
this.simbolos[this.atual].tipo === pitugues_2.default.SE &&
|
|
6225
|
+
expressaoEntao.linha === this.simbolos[this.atual].linha) {
|
|
6079
6226
|
while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
|
|
6080
6227
|
const operador = this.simbolos[this.atual - 1];
|
|
6081
6228
|
const expressaoOuCondicao = await this.seTernario();
|
|
6082
|
-
this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
|
|
6229
|
+
this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
|
|
6083
6230
|
${this.simbolos[this.atual].lexema}.`);
|
|
6084
6231
|
const expressaoSenao = await this.seTernario();
|
|
6085
6232
|
expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
|
|
@@ -6224,7 +6371,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
6224
6371
|
simboloAtual = this.simboloAtual();
|
|
6225
6372
|
if (!simboloAtual)
|
|
6226
6373
|
break;
|
|
6227
|
-
espacosIndentacaoLinhaAtual =
|
|
6374
|
+
espacosIndentacaoLinhaAtual =
|
|
6375
|
+
this.localizacoes[simboloAtual.linha].espacosIndentacao;
|
|
6228
6376
|
}
|
|
6229
6377
|
}
|
|
6230
6378
|
this.pilhaEscopos.removerUltimo();
|
|
@@ -6234,7 +6382,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6234
6382
|
try {
|
|
6235
6383
|
this.blocos += 1;
|
|
6236
6384
|
const condicao = await this.expressao();
|
|
6237
|
-
const bloco = await this.resolverDeclaracao();
|
|
6385
|
+
const bloco = (await this.resolverDeclaracao());
|
|
6238
6386
|
return new declaracoes_1.Enquanto(condicao, bloco);
|
|
6239
6387
|
}
|
|
6240
6388
|
finally {
|
|
@@ -6308,7 +6456,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6308
6456
|
}
|
|
6309
6457
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
|
|
6310
6458
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
6311
|
-
const corpo = await this.resolverDeclaracao();
|
|
6459
|
+
const corpo = (await this.resolverDeclaracao());
|
|
6312
6460
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
|
|
6313
6461
|
}
|
|
6314
6462
|
async declaracaoPara() {
|
|
@@ -6340,7 +6488,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6340
6488
|
this.pilhaEscopos.definirInformacoesVariavel(simboloSegundaVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloSegundaVariavel.lexema, 'qualquer'));
|
|
6341
6489
|
}
|
|
6342
6490
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
6343
|
-
const corpo = await this.resolverDeclaracao();
|
|
6491
|
+
const corpo = (await this.resolverDeclaracao());
|
|
6344
6492
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, alvoIteracao, corpo);
|
|
6345
6493
|
}
|
|
6346
6494
|
finally {
|
|
@@ -6369,7 +6517,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6369
6517
|
}
|
|
6370
6518
|
async declaracaoSe() {
|
|
6371
6519
|
const condicao = await this.expressao();
|
|
6372
|
-
const caminhoEntao = await this.resolverDeclaracao();
|
|
6520
|
+
const caminhoEntao = (await this.resolverDeclaracao());
|
|
6373
6521
|
let caminhoSenao = null;
|
|
6374
6522
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SENAO, pitugues_2.default.SENÃO)) {
|
|
6375
6523
|
caminhoSenao = await this.resolverDeclaracao();
|
|
@@ -6447,11 +6595,13 @@ class AvaliadorSintaticoPitugues {
|
|
|
6447
6595
|
this.consumir(pitugues_2.default.DOIS_PONTOS, `Esperado ':' antes do escopo do bloco 'pegue'.`);
|
|
6448
6596
|
this.pilhaEscopos.definirInformacoesVariavel(variavelExcecao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(variavelExcecao.lexema, 'qualquer'));
|
|
6449
6597
|
const corpo = await this.blocoEscopo();
|
|
6450
|
-
blocoPegue = new construtos_1.FuncaoConstruto(this.hashArquivo, simboloTente.linha, [
|
|
6451
|
-
|
|
6598
|
+
blocoPegue = new construtos_1.FuncaoConstruto(this.hashArquivo, simboloTente.linha, [
|
|
6599
|
+
{
|
|
6600
|
+
abrangencia: 'padrao',
|
|
6452
6601
|
nome: variavelExcecao,
|
|
6453
|
-
tipoDado:
|
|
6454
|
-
}
|
|
6602
|
+
tipoDado: 'qualquer',
|
|
6603
|
+
},
|
|
6604
|
+
], corpo, 'vazio', false);
|
|
6455
6605
|
}
|
|
6456
6606
|
else {
|
|
6457
6607
|
// Caso 2: sem parâmetro de erro.
|
|
@@ -6476,7 +6626,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6476
6626
|
const simboloFazer = this.simboloAnterior();
|
|
6477
6627
|
try {
|
|
6478
6628
|
this.blocos += 1;
|
|
6479
|
-
const declaracaoOuBlocoFazer = await this.resolverDeclaracao();
|
|
6629
|
+
const declaracaoOuBlocoFazer = (await this.resolverDeclaracao());
|
|
6480
6630
|
this.consumir(pitugues_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo da declaração 'fazer'.");
|
|
6481
6631
|
const condicaoEnquanto = await this.expressao();
|
|
6482
6632
|
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), declaracaoOuBlocoFazer, condicaoEnquanto);
|
|
@@ -6642,7 +6792,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6642
6792
|
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
6643
6793
|
if (simboloAnterior.tipo === pitugues_2.default.IDENTIFICADOR) {
|
|
6644
6794
|
this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' antes do escopo da classe.");
|
|
6645
|
-
const tipoPropriedade = this.consumir(pitugues_2.default.IDENTIFICADOR,
|
|
6795
|
+
const tipoPropriedade = this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado tipo de propriedade após dois-pontos, em declaração de classe.');
|
|
6646
6796
|
const propriedade = new declaracoes_1.PropriedadeClasse(simboloAnterior, tipoPropriedade.lexema, []);
|
|
6647
6797
|
propriedades.push(propriedade);
|
|
6648
6798
|
}
|
|
@@ -6651,7 +6801,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6651
6801
|
}
|
|
6652
6802
|
}
|
|
6653
6803
|
this.superclasseAtual = undefined;
|
|
6654
|
-
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades);
|
|
6804
|
+
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos, propriedades);
|
|
6655
6805
|
if (possivelDocumentacao) {
|
|
6656
6806
|
definicaoClasse.documentacao = possivelDocumentacao;
|
|
6657
6807
|
}
|
|
@@ -6797,8 +6947,10 @@ class AvaliadorSintaticoPitugues {
|
|
|
6797
6947
|
case pitugues_2.default.DE: {
|
|
6798
6948
|
const proximo = this.simbolos[this.atual + 1];
|
|
6799
6949
|
const aposProximo = this.simbolos[this.atual + 2];
|
|
6800
|
-
if (proximo &&
|
|
6801
|
-
|
|
6950
|
+
if (proximo &&
|
|
6951
|
+
proximo.tipo === pitugues_2.default.IDENTIFICADOR &&
|
|
6952
|
+
aposProximo &&
|
|
6953
|
+
aposProximo.tipo === pitugues_2.default.IMPORTAR) {
|
|
6802
6954
|
this.avancarEDevolverAnterior();
|
|
6803
6955
|
return this.declaracaoImportarDe();
|
|
6804
6956
|
}
|
|
@@ -6913,7 +7065,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6913
7065
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('elemento', 'qualquer'),
|
|
6914
7066
|
]));
|
|
6915
7067
|
this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
|
|
6916
|
-
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer')
|
|
7068
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
|
|
6917
7069
|
]));
|
|
6918
7070
|
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
|
|
6919
7071
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
|
|
@@ -6923,7 +7075,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6923
7075
|
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
6924
7076
|
]));
|
|
6925
7077
|
this.pilhaEscopos.definirInformacoesVariavel('vetor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'vetor', true, [
|
|
6926
|
-
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'qualquer')
|
|
7078
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'qualquer'),
|
|
6927
7079
|
]));
|
|
6928
7080
|
}
|
|
6929
7081
|
async analisar(retornoLexador, hashArquivo) {
|
|
@@ -6950,7 +7102,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
6950
7102
|
else {
|
|
6951
7103
|
declaracoes.push(retornoDeclaracao);
|
|
6952
7104
|
}
|
|
6953
|
-
if (!this.estaNoFinal() &&
|
|
7105
|
+
if (!this.estaNoFinal() &&
|
|
7106
|
+
this.verificarTipoSimboloAtual(pitugues_2.default.PONTO_E_VIRGULA)) {
|
|
6954
7107
|
// Verificar se este ; está na mesma linha da declaração anterior
|
|
6955
7108
|
const declaracaoAnterior = declaracoes[declaracoes.length - 1];
|
|
6956
7109
|
const linhaDeclaraoAnterior = declaracaoAnterior.linha || 0;
|
|
@@ -7336,12 +7489,12 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7336
7489
|
*/
|
|
7337
7490
|
construtoTextoMultilinhas() {
|
|
7338
7491
|
const segundoColchete = this.consumir(prisma_1.default.COLCHETE_ESQUERDO, "Esperado '[' antes do texto multilinhas.");
|
|
7339
|
-
let texto =
|
|
7492
|
+
let texto = '';
|
|
7340
7493
|
let linha = segundoColchete.linha;
|
|
7341
7494
|
while (!this.verificarSeSimboloAtualEIgualA(prisma_1.default.COLCHETE_DIREITO)) {
|
|
7342
|
-
texto += this.simbolos[this.atual].lexema +
|
|
7495
|
+
texto += this.simbolos[this.atual].lexema + ' ';
|
|
7343
7496
|
if (this.simbolos[this.atual].linha !== linha) {
|
|
7344
|
-
texto +=
|
|
7497
|
+
texto += '\n';
|
|
7345
7498
|
linha = this.simbolos[this.atual].linha;
|
|
7346
7499
|
}
|
|
7347
7500
|
this.avancarEDevolverAnterior();
|
|
@@ -7573,7 +7726,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7573
7726
|
try {
|
|
7574
7727
|
this.blocos += 1;
|
|
7575
7728
|
const condicao = await this.expressao();
|
|
7576
|
-
const bloco = await this.resolverDeclaracao();
|
|
7729
|
+
const bloco = (await this.resolverDeclaracao());
|
|
7577
7730
|
return new declaracoes_1.Enquanto(condicao, bloco);
|
|
7578
7731
|
}
|
|
7579
7732
|
finally {
|
|
@@ -7829,7 +7982,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7829
7982
|
}
|
|
7830
7983
|
this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após métodos da classe.");
|
|
7831
7984
|
this.superclasseAtual = undefined;
|
|
7832
|
-
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos);
|
|
7985
|
+
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos);
|
|
7833
7986
|
this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
|
|
7834
7987
|
return definicaoClasse;
|
|
7835
7988
|
}
|
|
@@ -8599,7 +8752,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
|
|
|
8599
8752
|
async declaracaoSe() {
|
|
8600
8753
|
const condicao = await this.expressao();
|
|
8601
8754
|
this.consumir(tenda_1.default.ENTÃO, "Esperado 'então' após a condição.");
|
|
8602
|
-
const caminhoEntao = await this.resolverDeclaracao();
|
|
8755
|
+
const caminhoEntao = (await this.resolverDeclaracao());
|
|
8603
8756
|
let caminhoSenao = null;
|
|
8604
8757
|
if (this.verificarSeSimboloAtualEIgualA(tenda_1.default.SENÃO)) {
|
|
8605
8758
|
caminhoSenao = await this.resolverDeclaracao();
|
|
@@ -9710,15 +9863,51 @@ const estruturas_1 = require("../interpretador/estruturas");
|
|
|
9710
9863
|
const construtos_1 = require("../construtos");
|
|
9711
9864
|
const quebras_1 = require("../quebras");
|
|
9712
9865
|
const configTuplas = {
|
|
9713
|
-
|
|
9714
|
-
|
|
9715
|
-
|
|
9716
|
-
|
|
9717
|
-
|
|
9718
|
-
|
|
9719
|
-
|
|
9720
|
-
|
|
9721
|
-
|
|
9866
|
+
Dupla: { Classe: construtos_1.Dupla, props: ['primeiro', 'segundo'] },
|
|
9867
|
+
Trio: { Classe: construtos_1.Trio, props: ['primeiro', 'segundo', 'terceiro'] },
|
|
9868
|
+
Quarteto: { Classe: construtos_1.Quarteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto'] },
|
|
9869
|
+
Quinteto: { Classe: construtos_1.Quinteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'] },
|
|
9870
|
+
Sexteto: {
|
|
9871
|
+
Classe: construtos_1.Sexteto,
|
|
9872
|
+
props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'],
|
|
9873
|
+
},
|
|
9874
|
+
Septeto: {
|
|
9875
|
+
Classe: construtos_1.Septeto,
|
|
9876
|
+
props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'],
|
|
9877
|
+
},
|
|
9878
|
+
Octeto: {
|
|
9879
|
+
Classe: construtos_1.Octeto,
|
|
9880
|
+
props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'],
|
|
9881
|
+
},
|
|
9882
|
+
Noneto: {
|
|
9883
|
+
Classe: construtos_1.Noneto,
|
|
9884
|
+
props: [
|
|
9885
|
+
'primeiro',
|
|
9886
|
+
'segundo',
|
|
9887
|
+
'terceiro',
|
|
9888
|
+
'quarto',
|
|
9889
|
+
'quinto',
|
|
9890
|
+
'sexto',
|
|
9891
|
+
'setimo',
|
|
9892
|
+
'oitavo',
|
|
9893
|
+
'nono',
|
|
9894
|
+
],
|
|
9895
|
+
},
|
|
9896
|
+
Deceto: {
|
|
9897
|
+
Classe: construtos_1.Deceto,
|
|
9898
|
+
props: [
|
|
9899
|
+
'primeiro',
|
|
9900
|
+
'segundo',
|
|
9901
|
+
'terceiro',
|
|
9902
|
+
'quarto',
|
|
9903
|
+
'quinto',
|
|
9904
|
+
'sexto',
|
|
9905
|
+
'setimo',
|
|
9906
|
+
'oitavo',
|
|
9907
|
+
'nono',
|
|
9908
|
+
'decimo',
|
|
9909
|
+
],
|
|
9910
|
+
},
|
|
9722
9911
|
};
|
|
9723
9912
|
const mapaConstrutoresTupla = {
|
|
9724
9913
|
2: construtos_1.Dupla,
|
|
@@ -9729,18 +9918,39 @@ const mapaConstrutoresTupla = {
|
|
|
9729
9918
|
7: construtos_1.Septeto,
|
|
9730
9919
|
8: construtos_1.Octeto,
|
|
9731
9920
|
9: construtos_1.Noneto,
|
|
9732
|
-
10: construtos_1.Deceto
|
|
9921
|
+
10: construtos_1.Deceto,
|
|
9733
9922
|
};
|
|
9734
9923
|
const mapaPropriedadesTuplas = {
|
|
9735
|
-
|
|
9736
|
-
|
|
9737
|
-
|
|
9738
|
-
|
|
9739
|
-
|
|
9740
|
-
|
|
9741
|
-
|
|
9742
|
-
|
|
9743
|
-
|
|
9924
|
+
Dupla: ['primeiro', 'segundo'],
|
|
9925
|
+
Trio: ['primeiro', 'segundo', 'terceiro'],
|
|
9926
|
+
Quarteto: ['primeiro', 'segundo', 'terceiro', 'quarto'],
|
|
9927
|
+
Quinteto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'],
|
|
9928
|
+
Sexteto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'],
|
|
9929
|
+
Septeto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'],
|
|
9930
|
+
Octeto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'],
|
|
9931
|
+
Noneto: [
|
|
9932
|
+
'primeiro',
|
|
9933
|
+
'segundo',
|
|
9934
|
+
'terceiro',
|
|
9935
|
+
'quarto',
|
|
9936
|
+
'quinto',
|
|
9937
|
+
'sexto',
|
|
9938
|
+
'setimo',
|
|
9939
|
+
'oitavo',
|
|
9940
|
+
'nono',
|
|
9941
|
+
],
|
|
9942
|
+
Deceto: [
|
|
9943
|
+
'primeiro',
|
|
9944
|
+
'segundo',
|
|
9945
|
+
'terceiro',
|
|
9946
|
+
'quarto',
|
|
9947
|
+
'quinto',
|
|
9948
|
+
'sexto',
|
|
9949
|
+
'setimo',
|
|
9950
|
+
'oitavo',
|
|
9951
|
+
'nono',
|
|
9952
|
+
'decimo',
|
|
9953
|
+
],
|
|
9744
9954
|
};
|
|
9745
9955
|
/**
|
|
9746
9956
|
* Compara dois valores (números ou vetores).
|
|
@@ -9858,16 +10068,15 @@ async function arredondar(interpretador, numero, casasDecimais) {
|
|
|
9858
10068
|
const valorNumero = interpretador.resolverValor(numero);
|
|
9859
10069
|
const valorCasas = interpretador.resolverValor(casasDecimais);
|
|
9860
10070
|
if (numero == undefined || numero == null) {
|
|
9861
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null,
|
|
10071
|
+
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, 'Erro: arredondar() deve receber um número.', interpretador.linhaDeclaracaoAtual));
|
|
9862
10072
|
}
|
|
9863
|
-
if (typeof numero !==
|
|
10073
|
+
if (typeof numero !== 'number') {
|
|
9864
10074
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `Erro de Tipo: arredondar() espera um número, mas recebeu '${typeof valorNumero}'.`, interpretador.linhaDeclaracaoAtual));
|
|
9865
10075
|
}
|
|
9866
10076
|
const fator = Math.pow(10, valorCasas);
|
|
9867
10077
|
const resultado = Math.round(valorNumero * fator) / fator;
|
|
9868
10078
|
return Promise.resolve(resultado);
|
|
9869
10079
|
}
|
|
9870
|
-
;
|
|
9871
10080
|
/**
|
|
9872
10081
|
* Clona profundamente uma variável ou constante em Delégua.
|
|
9873
10082
|
* @param {InterpretadorInterface} interpretador A instância do interpretador.
|
|
@@ -10256,8 +10465,10 @@ async function intervalo(interpretador, valorInicial, valorFinal, valorPasso) {
|
|
|
10256
10465
|
}
|
|
10257
10466
|
// intervalo(inicio, parada) ou intervalo(inicio, parada, passo)
|
|
10258
10467
|
else {
|
|
10259
|
-
if (typeof primeiroParam !== 'number' ||
|
|
10260
|
-
|
|
10468
|
+
if (typeof primeiroParam !== 'number' ||
|
|
10469
|
+
isNaN(primeiroParam) ||
|
|
10470
|
+
typeof segundoParam !== 'number' ||
|
|
10471
|
+
isNaN(segundoParam)) {
|
|
10261
10472
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
10262
10473
|
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
10263
10474
|
linha: interpretador.linhaDeclaracaoAtual,
|
|
@@ -10640,14 +10851,18 @@ async function tamanho(interpretador, objeto) {
|
|
|
10640
10851
|
const metodos = valorObjeto.metodos;
|
|
10641
10852
|
let tamanho = 0;
|
|
10642
10853
|
const metodoInicializacao = metodos.inicializacao;
|
|
10643
|
-
if (metodoInicializacao &&
|
|
10854
|
+
if (metodoInicializacao &&
|
|
10855
|
+
!Array.isArray(metodoInicializacao) &&
|
|
10856
|
+
metodoInicializacao.eInicializador) {
|
|
10644
10857
|
tamanho = metodoInicializacao.declaracao.parametros.length;
|
|
10645
10858
|
}
|
|
10646
10859
|
else if (Array.isArray(metodoInicializacao)) {
|
|
10647
10860
|
// Em caso de construtores sobrecarregados, `metodos.inicializacao` pode ser um array.
|
|
10648
10861
|
// Usamos o maior número de parâmetros entre as sobrecargas que são inicializadores.
|
|
10649
10862
|
for (const inicializador of metodoInicializacao) {
|
|
10650
|
-
if (inicializador &&
|
|
10863
|
+
if (inicializador &&
|
|
10864
|
+
inicializador.eInicializador &&
|
|
10865
|
+
((_a = inicializador.declaracao) === null || _a === void 0 ? void 0 : _a.parametros)) {
|
|
10651
10866
|
const aridade = inicializador.declaracao.parametros.length;
|
|
10652
10867
|
if (aridade > tamanho) {
|
|
10653
10868
|
tamanho = aridade;
|
|
@@ -10717,8 +10932,7 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
|
|
|
10717
10932
|
}, 'Parâmetro inválido. O primeiro parâmetro deve ser um iterável.'));
|
|
10718
10933
|
}
|
|
10719
10934
|
const valorFuncao = interpretador.resolverValor(funcaoCondicional);
|
|
10720
|
-
const ehFuncaoValida = valorFuncao instanceof estruturas_1.DeleguaFuncao ||
|
|
10721
|
-
valorFuncao instanceof funcao_padrao_1.FuncaoPadrao;
|
|
10935
|
+
const ehFuncaoValida = valorFuncao instanceof estruturas_1.DeleguaFuncao || valorFuncao instanceof funcao_padrao_1.FuncaoPadrao;
|
|
10722
10936
|
if (!ehFuncaoValida) {
|
|
10723
10937
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
10724
10938
|
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
@@ -10743,7 +10957,7 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
|
|
|
10743
10957
|
*/
|
|
10744
10958
|
async function tupla(interpretador, vetor) {
|
|
10745
10959
|
const valorVetor = interpretador.resolverValor(vetor);
|
|
10746
|
-
const elementos = valorVetor.map(item => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
|
|
10960
|
+
const elementos = valorVetor.map((item) => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
|
|
10747
10961
|
return new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
|
|
10748
10962
|
}
|
|
10749
10963
|
async function vetor(interpretador, tupla) {
|
|
@@ -10762,9 +10976,10 @@ async function vetor(interpretador, tupla) {
|
|
|
10762
10976
|
const nomeClasse = objetoTupla.constructor.name;
|
|
10763
10977
|
const props = mapaPropriedadesTuplas[nomeClasse];
|
|
10764
10978
|
if (props) {
|
|
10765
|
-
resultado = props.map(prop => objetoTupla[prop]);
|
|
10979
|
+
resultado = props.map((prop) => objetoTupla[prop]);
|
|
10766
10980
|
}
|
|
10767
|
-
else if (objetoTupla.elementos &&
|
|
10981
|
+
else if (objetoTupla.elementos &&
|
|
10982
|
+
Array.isArray(objetoTupla.elementos)) {
|
|
10768
10983
|
resultado = objetoTupla.elementos;
|
|
10769
10984
|
}
|
|
10770
10985
|
}
|
|
@@ -10790,14 +11005,13 @@ exports.default = {
|
|
|
10790
11005
|
if (!(objetoTupla instanceof construtos_1.TuplaN)) {
|
|
10791
11006
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `A função "paraVetor" só pode ser chamada em tuplas.`, interpretador.linhaDeclaracaoAtual));
|
|
10792
11007
|
}
|
|
10793
|
-
const valoresPuros = objetoTupla.elementos.map(elemento => interpretador.resolverValor(elemento));
|
|
11008
|
+
const valoresPuros = objetoTupla.elementos.map((elemento) => interpretador.resolverValor(elemento));
|
|
10794
11009
|
return Promise.resolve(valoresPuros);
|
|
10795
11010
|
},
|
|
10796
11011
|
assinaturaFormato: 'tupla.paraVetor()',
|
|
10797
|
-
documentacao: '# `tupla.paraVetor()` \n \n' +
|
|
10798
|
-
'Converte a tupla atual em um array.',
|
|
11012
|
+
documentacao: '# `tupla.paraVetor()` \n \n' + 'Converte a tupla atual em um array.',
|
|
10799
11013
|
exemploCodigo: 'tupla.paraVetor()',
|
|
10800
|
-
}
|
|
11014
|
+
},
|
|
10801
11015
|
};
|
|
10802
11016
|
|
|
10803
11017
|
},{"../../../construtos":62,"../../../excecoes":131}],29:[function(require,module,exports){
|
|
@@ -10879,7 +11093,7 @@ exports.default = {
|
|
|
10879
11093
|
implementacao: (interpretador, valor) => {
|
|
10880
11094
|
return Promise.resolve(Object.values(valor));
|
|
10881
11095
|
},
|
|
10882
|
-
}
|
|
11096
|
+
},
|
|
10883
11097
|
};
|
|
10884
11098
|
|
|
10885
11099
|
},{"../construtos":62,"../informacao-elemento-sintatico":138}],30:[function(require,module,exports){
|
|
@@ -11000,7 +11214,7 @@ const implementacaoParticao = (interpretador, texto, separador, ...args) => {
|
|
|
11000
11214
|
const depois = texto.substring(indice + separador.length);
|
|
11001
11215
|
partes = [antes, separador, depois];
|
|
11002
11216
|
}
|
|
11003
|
-
const elementos = partes.map(p => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, p, 'texto'));
|
|
11217
|
+
const elementos = partes.map((p) => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, p, 'texto'));
|
|
11004
11218
|
const tupla = new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
|
|
11005
11219
|
return Promise.resolve(tupla);
|
|
11006
11220
|
};
|
|
@@ -11295,6 +11509,75 @@ exports.default = {
|
|
|
11295
11509
|
'\n\n ### Formas de uso \n',
|
|
11296
11510
|
exemploCodigo: 'texto.tudoMinusculo()',
|
|
11297
11511
|
},
|
|
11512
|
+
apararInício: {
|
|
11513
|
+
tipoRetorno: 'texto',
|
|
11514
|
+
argumentos: [],
|
|
11515
|
+
implementacao: (interpretador, texto) => Promise.resolve(texto.trimStart()),
|
|
11516
|
+
assinaturaFormato: 'texto.apararInício()',
|
|
11517
|
+
documentacao: '# `texto.apararInício()` \n \n' +
|
|
11518
|
+
'Remover espaços em branco no início e no fim de um texto.' +
|
|
11519
|
+
'\n\n ## Exemplo de Código\n' +
|
|
11520
|
+
'\n\n```delegua\nvar t = " meu texto com espaços no início e no fim "\n' +
|
|
11521
|
+
'escreva("|" + t.apararInício() + "|") // "|meu texto com espaços no início e no fim |"\n```' +
|
|
11522
|
+
'\n\n ### Formas de uso \n',
|
|
11523
|
+
exemploCodigo: 'texto.apararInício()',
|
|
11524
|
+
},
|
|
11525
|
+
maiúsculo: {
|
|
11526
|
+
tipoRetorno: 'texto',
|
|
11527
|
+
argumentos: [],
|
|
11528
|
+
implementacao: (interpretador, texto) => Promise.resolve(texto.toUpperCase()),
|
|
11529
|
+
assinaturaFormato: 'texto.maiúsculo()',
|
|
11530
|
+
documentacao: '# `texto.maiúsculo()` \n \n' +
|
|
11531
|
+
'Converte todos os caracteres alfabéticos para suas respectivas formas em maiúsculo.' +
|
|
11532
|
+
'\n\n ## Exemplo de Código\n' +
|
|
11533
|
+
'\n\n```delegua\nvar t = "tudo em minúsculo"\n' +
|
|
11534
|
+
'escreva(t.maiúsculo()) // "TUDO EM MINÚSCULO"\n```' +
|
|
11535
|
+
'\n\n ### Formas de uso \n',
|
|
11536
|
+
exemploCodigo: 'texto.maiúsculo()',
|
|
11537
|
+
},
|
|
11538
|
+
minúsculo: {
|
|
11539
|
+
tipoRetorno: 'texto',
|
|
11540
|
+
argumentos: [],
|
|
11541
|
+
implementacao: (interpretador, texto) => Promise.resolve(texto.toLowerCase()),
|
|
11542
|
+
assinaturaFormato: 'texto.minúsculo()',
|
|
11543
|
+
documentacao: '# `texto.minúsculo()` \n \n' +
|
|
11544
|
+
'Converte todos os caracteres alfabéticos para suas respectivas formas em minúsculo.' +
|
|
11545
|
+
'\n\n ## Exemplo de Código\n' +
|
|
11546
|
+
'\n\n```delegua\nvar t = "TUDO EM MAIÚSCULO"\n' +
|
|
11547
|
+
'escreva(t.minúsculo()) // "tudo em maiúsculo"\n```' +
|
|
11548
|
+
'\n\n ### Formas de uso \n',
|
|
11549
|
+
exemploCodigo: 'texto.minúsculo()',
|
|
11550
|
+
},
|
|
11551
|
+
tudoMaiúsculo: {
|
|
11552
|
+
tipoRetorno: 'lógico',
|
|
11553
|
+
argumentos: [],
|
|
11554
|
+
implementacao: (interpretador, texto) => Promise.resolve(texto === texto.toUpperCase()),
|
|
11555
|
+
assinaturaFormato: 'texto.tudoMaiúsculo()',
|
|
11556
|
+
documentacao: '# `texto.tudoMaiúsculo()` \n\n' +
|
|
11557
|
+
'Devolve verdadeiro se todos os caracteres alfabéticos do texto estão em maiúsculo, e falso em caso contrário.' +
|
|
11558
|
+
'\n\n ## Exemplo de Código\n' +
|
|
11559
|
+
'\n\n```delegua\nvar t1 = "TUDO EM MAIÚSCULO"\n' +
|
|
11560
|
+
'var t2 = "Tudo em Maiúsculo"\n' +
|
|
11561
|
+
't1.tudoMaiúsculo() // verdadeiro\n' +
|
|
11562
|
+
't2.tudoMaiúsculo() // falso\n```' +
|
|
11563
|
+
'\n\n ### Formas de uso \n',
|
|
11564
|
+
exemploCodigo: 'texto.tudoMaiúsculo()',
|
|
11565
|
+
},
|
|
11566
|
+
tudoMinúsculo: {
|
|
11567
|
+
tipoRetorno: 'lógico',
|
|
11568
|
+
argumentos: [],
|
|
11569
|
+
implementacao: (interpretador, texto) => Promise.resolve(texto === texto.toLowerCase()),
|
|
11570
|
+
assinaturaFormato: 'texto.tudoMinúsculo()',
|
|
11571
|
+
documentacao: '# `texto.tudoMinúsculo()` \n\n' +
|
|
11572
|
+
'Devolve verdadeiro se todos os caracteres alfabéticos do texto estão em minúsculo, e falso em caso contrário.' +
|
|
11573
|
+
'\n\n ## Exemplo de Código\n' +
|
|
11574
|
+
'\n\n```delegua\nvar t1 = "tudo em minúsculo"\n' +
|
|
11575
|
+
'var t2 = "Tudo em Minúsculo"\n' +
|
|
11576
|
+
't1.tudoMinúsculo() // verdadeiro\n' +
|
|
11577
|
+
't2.tudoMinúsculo() // falso\n```' +
|
|
11578
|
+
'\n\n ### Formas de uso \n',
|
|
11579
|
+
exemploCodigo: 'texto.tudoMinúsculo()',
|
|
11580
|
+
},
|
|
11298
11581
|
};
|
|
11299
11582
|
|
|
11300
11583
|
},{"../construtos":62,"../excecoes":131,"../informacao-elemento-sintatico":138}],32:[function(require,module,exports){
|
|
@@ -11313,7 +11596,7 @@ const mapaConstrutoresTupla = {
|
|
|
11313
11596
|
7: construtos_1.Septeto,
|
|
11314
11597
|
8: construtos_1.Octeto,
|
|
11315
11598
|
9: construtos_1.Noneto,
|
|
11316
|
-
10: construtos_1.Deceto
|
|
11599
|
+
10: construtos_1.Deceto,
|
|
11317
11600
|
};
|
|
11318
11601
|
exports.default = {
|
|
11319
11602
|
adicionar: {
|
|
@@ -11660,6 +11943,24 @@ exports.default = {
|
|
|
11660
11943
|
'\n\n ### Formas de uso \n',
|
|
11661
11944
|
exemploCodigo: 'vetor.removerUltimo()',
|
|
11662
11945
|
},
|
|
11946
|
+
removerÚltimo: {
|
|
11947
|
+
tipoRetorno: 'qualquer',
|
|
11948
|
+
argumentos: [],
|
|
11949
|
+
implementacao: (interpretador, vetor) => {
|
|
11950
|
+
let elemento = vetor.pop();
|
|
11951
|
+
return Promise.resolve(elemento);
|
|
11952
|
+
},
|
|
11953
|
+
assinaturaFormato: 'vetor.removerÚltimo()',
|
|
11954
|
+
documentacao: '# `vetor.removerÚltimo()` \n \n' +
|
|
11955
|
+
'Remove o último elemento do vetor caso o elemento exista no vetor.\n' +
|
|
11956
|
+
'\n\n ## Exemplo de Código\n' +
|
|
11957
|
+
'\n\n```delegua\nvar vetor = [1, 2, 3]\n' +
|
|
11958
|
+
'var ultimoElemento = vetor.removerÚltimo()\n' +
|
|
11959
|
+
'escreva(ultimoElemento) // 3\n' +
|
|
11960
|
+
'escreva(vetor) // [1, 2]\n```' +
|
|
11961
|
+
'\n\n ### Formas de uso \n',
|
|
11962
|
+
exemploCodigo: 'vetor.removerÚltimo()',
|
|
11963
|
+
},
|
|
11663
11964
|
somar: {
|
|
11664
11965
|
tipoRetorno: 'qualquer',
|
|
11665
11966
|
argumentos: [],
|
|
@@ -11926,7 +12227,7 @@ class AjudaComoConstruto {
|
|
|
11926
12227
|
return retorno;
|
|
11927
12228
|
}
|
|
11928
12229
|
paraTextoSaida() {
|
|
11929
|
-
throw new Error(
|
|
12230
|
+
throw new Error('Method not implemented.');
|
|
11930
12231
|
}
|
|
11931
12232
|
}
|
|
11932
12233
|
exports.AjudaComoConstruto = AjudaComoConstruto;
|
|
@@ -12032,9 +12333,12 @@ class Atribuir {
|
|
|
12032
12333
|
const alvoComoVariavel = alvo;
|
|
12033
12334
|
const tipoAlvo = alvoComoVariavel === null || alvoComoVariavel === void 0 ? void 0 : alvoComoVariavel.tipo;
|
|
12034
12335
|
const alvoSuportaIndice = alvo instanceof variavel_1.Variavel &&
|
|
12035
|
-
(tipoAlvo === 'vetor' ||
|
|
12336
|
+
(tipoAlvo === 'vetor' ||
|
|
12337
|
+
tipoAlvo === 'dicionário' ||
|
|
12338
|
+
tipoAlvo === 'qualquer' ||
|
|
12339
|
+
(tipoAlvo === null || tipoAlvo === void 0 ? void 0 : tipoAlvo.endsWith('[]')));
|
|
12036
12340
|
if (!alvoSuportaIndice) {
|
|
12037
|
-
throw new Error(
|
|
12341
|
+
throw new Error('`indice` só pode ser informado quando o alvo for uma variável de vetor ou dicionário.');
|
|
12038
12342
|
}
|
|
12039
12343
|
this.indice = indice;
|
|
12040
12344
|
}
|
|
@@ -12103,8 +12407,7 @@ class Binario {
|
|
|
12103
12407
|
['logico', 'lógico'].includes(this.direita.tipo)) {
|
|
12104
12408
|
return 'lógico';
|
|
12105
12409
|
}
|
|
12106
|
-
if (this.esquerda.tipo === 'texto' ||
|
|
12107
|
-
this.direita.tipo === 'texto') {
|
|
12410
|
+
if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
|
|
12108
12411
|
return 'texto';
|
|
12109
12412
|
}
|
|
12110
12413
|
if (['numero', 'número'].includes(this.esquerda.tipo) ||
|
|
@@ -12270,7 +12573,9 @@ class Decorador {
|
|
|
12270
12573
|
continue;
|
|
12271
12574
|
}
|
|
12272
12575
|
const valor = this.atributos[chave];
|
|
12273
|
-
const valorTexto = valor && typeof valor === 'object' && typeof valor.paraTexto === 'function'
|
|
12576
|
+
const valorTexto = valor && typeof valor === 'object' && typeof valor.paraTexto === 'function'
|
|
12577
|
+
? valor.paraTexto()
|
|
12578
|
+
: valor;
|
|
12274
12579
|
atributos += `${chave}=${valorTexto} `;
|
|
12275
12580
|
}
|
|
12276
12581
|
if (atributos.length > 0) {
|
|
@@ -12971,11 +13276,13 @@ class TuplaN extends tupla_1.Tupla {
|
|
|
12971
13276
|
return await visitante.visitarExpressaoTuplaN(this);
|
|
12972
13277
|
}
|
|
12973
13278
|
paraTexto() {
|
|
12974
|
-
const elementosTexto = this.elementos.map(elemento => elemento.paraTexto()).join(', ');
|
|
13279
|
+
const elementosTexto = this.elementos.map((elemento) => elemento.paraTexto()).join(', ');
|
|
12975
13280
|
return `(${elementosTexto})`;
|
|
12976
13281
|
}
|
|
12977
13282
|
paraTextoSaida() {
|
|
12978
|
-
const elementosTexto = this.elementos
|
|
13283
|
+
const elementosTexto = this.elementos
|
|
13284
|
+
.map((elemento) => elemento.paraTextoSaida())
|
|
13285
|
+
.join(', ');
|
|
12979
13286
|
return `(${elementosTexto})`;
|
|
12980
13287
|
}
|
|
12981
13288
|
}
|
|
@@ -13522,10 +13829,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13522
13829
|
exports.Classe = void 0;
|
|
13523
13830
|
const declaracao_1 = require("./declaracao");
|
|
13524
13831
|
class Classe extends declaracao_1.Declaracao {
|
|
13525
|
-
|
|
13832
|
+
/** Compat com tradutores e analisador semântico que ainda usam .superClasse */
|
|
13833
|
+
get superClasse() {
|
|
13834
|
+
var _a;
|
|
13835
|
+
return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
|
|
13836
|
+
}
|
|
13837
|
+
constructor(simbolo, superClasses = [], metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = [], mesclas = []) {
|
|
13526
13838
|
super(Number(simbolo.linha), simbolo.hashArquivo);
|
|
13527
13839
|
this.simbolo = simbolo;
|
|
13528
|
-
this.
|
|
13840
|
+
this.superClasses = superClasses;
|
|
13841
|
+
this.mesclas = mesclas;
|
|
13529
13842
|
this.metodos = metodos;
|
|
13530
13843
|
this.propriedades = propriedades;
|
|
13531
13844
|
this.decoradores = decoradores;
|
|
@@ -13538,8 +13851,11 @@ class Classe extends declaracao_1.Declaracao {
|
|
|
13538
13851
|
}
|
|
13539
13852
|
paraTexto() {
|
|
13540
13853
|
let resultado = `<classe nome=${this.simbolo.lexema} `;
|
|
13541
|
-
if (this.
|
|
13542
|
-
resultado += `herda=${this.
|
|
13854
|
+
if (this.superClasses.length > 0) {
|
|
13855
|
+
resultado += `herda=${this.superClasses.map((s) => { var _a, _b; return (_b = (_a = s === null || s === void 0 ? void 0 : s.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : s; }).join(', ')} `;
|
|
13856
|
+
}
|
|
13857
|
+
if (this.mesclas.length > 0) {
|
|
13858
|
+
resultado += `mescla=${this.mesclas.map((m) => { var _a, _b; return (_b = (_a = m === null || m === void 0 ? void 0 : m.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : m; }).join(', ')} `;
|
|
13543
13859
|
}
|
|
13544
13860
|
resultado += '>';
|
|
13545
13861
|
for (const propriedade of this.propriedades) {
|
|
@@ -14507,7 +14823,11 @@ class EstilizadorDelegua {
|
|
|
14507
14823
|
* Verifica se um objeto é uma Declaração.
|
|
14508
14824
|
*/
|
|
14509
14825
|
ehDeclaracao(obj) {
|
|
14510
|
-
return obj &&
|
|
14826
|
+
return (obj &&
|
|
14827
|
+
typeof obj === 'object' &&
|
|
14828
|
+
'paraTexto' in obj &&
|
|
14829
|
+
'linha' in obj &&
|
|
14830
|
+
'hashArquivo' in obj);
|
|
14511
14831
|
}
|
|
14512
14832
|
/**
|
|
14513
14833
|
* Verifica se um objeto é um Construto.
|
|
@@ -15734,24 +16054,60 @@ class FormatadorPitugues {
|
|
|
15734
16054
|
this.nívelIndentação -= this.tamanhoIndentação;
|
|
15735
16055
|
}
|
|
15736
16056
|
// Métodos obrigatórios da interface, não usados no Pituguês.
|
|
15737
|
-
visitarDeclaracaoCabecalhoPrograma() {
|
|
15738
|
-
|
|
15739
|
-
|
|
15740
|
-
|
|
15741
|
-
|
|
15742
|
-
|
|
15743
|
-
|
|
15744
|
-
|
|
15745
|
-
|
|
15746
|
-
|
|
15747
|
-
|
|
15748
|
-
|
|
15749
|
-
|
|
15750
|
-
|
|
15751
|
-
|
|
15752
|
-
|
|
15753
|
-
|
|
15754
|
-
|
|
16057
|
+
visitarDeclaracaoCabecalhoPrograma() {
|
|
16058
|
+
return Promise.resolve();
|
|
16059
|
+
}
|
|
16060
|
+
visitarDeclaracaoConstMultiplo() {
|
|
16061
|
+
return Promise.resolve();
|
|
16062
|
+
}
|
|
16063
|
+
visitarDeclaracaoEscrevaMesmaLinha() {
|
|
16064
|
+
return Promise.resolve();
|
|
16065
|
+
}
|
|
16066
|
+
visitarDeclaracaoInicioAlgoritmo() {
|
|
16067
|
+
return Promise.resolve();
|
|
16068
|
+
}
|
|
16069
|
+
visitarDeclaracaoTendoComo() {
|
|
16070
|
+
return Promise.resolve();
|
|
16071
|
+
}
|
|
16072
|
+
visitarDeclaracaoVarMultiplo() {
|
|
16073
|
+
return Promise.resolve();
|
|
16074
|
+
}
|
|
16075
|
+
visitarExpressaoAcessoElementoMatriz() {
|
|
16076
|
+
return Promise.resolve();
|
|
16077
|
+
}
|
|
16078
|
+
visitarExpressaoAcessoMetodo() {
|
|
16079
|
+
return Promise.resolve();
|
|
16080
|
+
}
|
|
16081
|
+
visitarExpressaoAcessoPropriedade() {
|
|
16082
|
+
return Promise.resolve();
|
|
16083
|
+
}
|
|
16084
|
+
visitarExpressaoArgumentoReferenciaFuncao() {
|
|
16085
|
+
return Promise.resolve();
|
|
16086
|
+
}
|
|
16087
|
+
visitarExpressaoAtribuicaoPorIndicesMatriz() {
|
|
16088
|
+
return Promise.resolve();
|
|
16089
|
+
}
|
|
16090
|
+
visitarExpressaoComentario() {
|
|
16091
|
+
return Promise.resolve();
|
|
16092
|
+
}
|
|
16093
|
+
visitarExpressaoExpressaoRegular() {
|
|
16094
|
+
return Promise.resolve();
|
|
16095
|
+
}
|
|
16096
|
+
visitarExpressaoFimPara() {
|
|
16097
|
+
return Promise.resolve();
|
|
16098
|
+
}
|
|
16099
|
+
visitarExpressaoFormatacaoEscrita() {
|
|
16100
|
+
return Promise.resolve();
|
|
16101
|
+
}
|
|
16102
|
+
visitarExpressaoReferenciaFuncao() {
|
|
16103
|
+
return Promise.resolve();
|
|
16104
|
+
}
|
|
16105
|
+
visitarExpressaoSeparador() {
|
|
16106
|
+
return Promise.resolve();
|
|
16107
|
+
}
|
|
16108
|
+
visitarExpressaoTupla() {
|
|
16109
|
+
return Promise.resolve();
|
|
16110
|
+
}
|
|
15755
16111
|
async visitarExpressaoTuplaN(expressao) {
|
|
15756
16112
|
this.códigoFormatado += '(';
|
|
15757
16113
|
for (let i = 0; i < expressao.elementos.length; i++) {
|
|
@@ -15765,7 +16121,7 @@ class FormatadorPitugues {
|
|
|
15765
16121
|
}
|
|
15766
16122
|
async visitarDeclaracaoDeExpressao(declaracao) {
|
|
15767
16123
|
this.códigoFormatado += this.indentar();
|
|
15768
|
-
this.códigoFormatado += await declaracao.expressao.aceitar(this) + `\n`;
|
|
16124
|
+
this.códigoFormatado += (await declaracao.expressao.aceitar(this)) + `\n`;
|
|
15769
16125
|
}
|
|
15770
16126
|
async visitarDeclaracaoClasse(declaração) {
|
|
15771
16127
|
this.adicionarLinha(`classe ${declaração.simbolo.lexema}:`);
|
|
@@ -15920,7 +16276,9 @@ class FormatadorPitugues {
|
|
|
15920
16276
|
if (declaração.caminhoPegue) {
|
|
15921
16277
|
this.adicionarLinha('pegue como erro:');
|
|
15922
16278
|
this.aumentarIndentação();
|
|
15923
|
-
const declaracoes = declaração.caminhoPegue instanceof construtos_1.FuncaoConstruto
|
|
16279
|
+
const declaracoes = declaração.caminhoPegue instanceof construtos_1.FuncaoConstruto
|
|
16280
|
+
? declaração.caminhoPegue.corpo
|
|
16281
|
+
: declaração.caminhoPegue;
|
|
15924
16282
|
for (const instrução of declaracoes) {
|
|
15925
16283
|
await instrução.aceitar(this);
|
|
15926
16284
|
}
|
|
@@ -15935,7 +16293,9 @@ class FormatadorPitugues {
|
|
|
15935
16293
|
}
|
|
15936
16294
|
}
|
|
15937
16295
|
async visitarDeclaracaoEscreva(declaração) {
|
|
15938
|
-
this.códigoFormatado +=
|
|
16296
|
+
this.códigoFormatado +=
|
|
16297
|
+
this.indentar() +
|
|
16298
|
+
`${declaração.simboloEscreva ? declaração.simboloEscreva.lexema : 'imprima'}(`;
|
|
15939
16299
|
for (let i = 0; i < declaração.argumentos.length; i++) {
|
|
15940
16300
|
this.códigoFormatado += await declaração.argumentos[i].aceitar(this);
|
|
15941
16301
|
if (i < declaração.argumentos.length - 1)
|
|
@@ -16010,8 +16370,10 @@ class FormatadorPitugues {
|
|
|
16010
16370
|
return `(${await expressão.expressao.aceitar(this)})`;
|
|
16011
16371
|
}
|
|
16012
16372
|
async visitarExpressaoUnaria(expressão) {
|
|
16013
|
-
const operador = expressão.operador.tipo === pitugues_1.default.SUBTRACAO
|
|
16014
|
-
|
|
16373
|
+
const operador = expressão.operador.tipo === pitugues_1.default.SUBTRACAO
|
|
16374
|
+
? '-'
|
|
16375
|
+
: expressão.operador.tipo === pitugues_1.default.NEGACAO
|
|
16376
|
+
? 'não '
|
|
16015
16377
|
: '';
|
|
16016
16378
|
const operando = await expressão.operando.aceitar(this);
|
|
16017
16379
|
return expressão.incidenciaOperador === 'ANTES'
|
|
@@ -16020,7 +16382,7 @@ class FormatadorPitugues {
|
|
|
16020
16382
|
}
|
|
16021
16383
|
async visitarExpressaoDeChamada(expressão) {
|
|
16022
16384
|
const função = await expressão.entidadeChamada.aceitar(this);
|
|
16023
|
-
const argumentos = await Promise.all(expressão.argumentos.map(a => a.aceitar(this)));
|
|
16385
|
+
const argumentos = await Promise.all(expressão.argumentos.map((a) => a.aceitar(this)));
|
|
16024
16386
|
return `${função}(${argumentos.join(', ')})`;
|
|
16025
16387
|
}
|
|
16026
16388
|
visitarExpressaoIsto() {
|
|
@@ -16030,7 +16392,7 @@ class FormatadorPitugues {
|
|
|
16030
16392
|
return 'super()';
|
|
16031
16393
|
}
|
|
16032
16394
|
async visitarExpressaoVetor(expressão) {
|
|
16033
|
-
const valores = await Promise.all(expressão.valores.map(v => v.aceitar(this)));
|
|
16395
|
+
const valores = await Promise.all(expressão.valores.map((v) => v.aceitar(this)));
|
|
16034
16396
|
return `[${valores.join(', ')}]`;
|
|
16035
16397
|
}
|
|
16036
16398
|
async visitarExpressaoDicionario(expressão) {
|
|
@@ -16068,15 +16430,18 @@ class FormatadorPitugues {
|
|
|
16068
16430
|
return `${objeto}.${expressão.nome.lexema} = ${valor}`;
|
|
16069
16431
|
}
|
|
16070
16432
|
async visitarExpressaoFuncaoConstruto(expressão) {
|
|
16071
|
-
const parâmetros = expressão.parametros
|
|
16433
|
+
const parâmetros = expressão.parametros
|
|
16434
|
+
.map((p) => {
|
|
16072
16435
|
const tipo = p.tipoDado ? `: ${p.tipoDado}` : '';
|
|
16073
16436
|
return p.nome.lexema + tipo;
|
|
16074
|
-
})
|
|
16437
|
+
})
|
|
16438
|
+
.join(', ');
|
|
16075
16439
|
let funçãoStr = `função(${parâmetros || ''}):\n`;
|
|
16076
16440
|
this.aumentarIndentação();
|
|
16077
16441
|
for (const instrução of expressão.corpo) {
|
|
16078
16442
|
const linha = await instrução.aceitar(this);
|
|
16079
|
-
if (linha) {
|
|
16443
|
+
if (linha) {
|
|
16444
|
+
// Only add if it returns something
|
|
16080
16445
|
funçãoStr += this.indentar() + linha;
|
|
16081
16446
|
if (!linha.endsWith('\n'))
|
|
16082
16447
|
funçãoStr += '\n';
|
|
@@ -16086,7 +16451,7 @@ class FormatadorPitugues {
|
|
|
16086
16451
|
return funçãoStr.trimEnd();
|
|
16087
16452
|
}
|
|
16088
16453
|
async visitarExpressaoLeia(expressão) {
|
|
16089
|
-
const argumentos = await Promise.all(expressão.argumentos.map(a => a.aceitar(this)));
|
|
16454
|
+
const argumentos = await Promise.all(expressão.argumentos.map((a) => a.aceitar(this)));
|
|
16090
16455
|
return argumentos.length > 0 ? `input(${argumentos.join(', ')})` : 'input()';
|
|
16091
16456
|
}
|
|
16092
16457
|
async visitarExpressaoTipoDe(expressão) {
|
|
@@ -16172,12 +16537,12 @@ function uuidv4() {
|
|
|
16172
16537
|
let r = Math.random() * 16; // random number between 0 and 16
|
|
16173
16538
|
if (d > 0) {
|
|
16174
16539
|
// Use timestamp until depleted
|
|
16175
|
-
r = (d + r) % 16 | 0;
|
|
16540
|
+
r = ((d + r) % 16) | 0;
|
|
16176
16541
|
d = Math.floor(d / 16);
|
|
16177
16542
|
}
|
|
16178
16543
|
else {
|
|
16179
16544
|
// Use microseconds since page-load if supported
|
|
16180
|
-
r = (d2 + r) % 16 | 0;
|
|
16545
|
+
r = ((d2 + r) % 16) | 0;
|
|
16181
16546
|
d2 = Math.floor(d2 / 16);
|
|
16182
16547
|
}
|
|
16183
16548
|
return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
|
|
@@ -16606,27 +16971,36 @@ const bibliotecaGlobal = __importStar(require("../bibliotecas/biblioteca-global"
|
|
|
16606
16971
|
const construtos_1 = require("../construtos");
|
|
16607
16972
|
function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
|
|
16608
16973
|
pilhaEscoposExecucao.definirVariavel('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
|
|
16974
|
+
pilhaEscoposExecucao.definirVariavel('aleatório', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
|
|
16609
16975
|
pilhaEscoposExecucao.definirVariavel('aleatorioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
|
|
16976
|
+
pilhaEscoposExecucao.definirVariavel('aleatórioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
|
|
16610
16977
|
pilhaEscoposExecucao.definirVariavel('algum', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.algum));
|
|
16611
16978
|
pilhaEscoposExecucao.definirVariavel('arredondar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.arredondar));
|
|
16612
16979
|
pilhaEscoposExecucao.definirVariavel('clonar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.clonar));
|
|
16613
16980
|
pilhaEscoposExecucao.definirVariavel('encontrar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrar));
|
|
16614
16981
|
pilhaEscoposExecucao.definirVariavel('encontrarIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
|
|
16982
|
+
pilhaEscoposExecucao.definirVariavel('encontrarÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
|
|
16615
16983
|
pilhaEscoposExecucao.definirVariavel('encontrarUltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
|
|
16984
|
+
pilhaEscoposExecucao.definirVariavel('encontrarÚltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
|
|
16616
16985
|
pilhaEscoposExecucao.definirVariavel('encontrarUltimoIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
|
|
16986
|
+
pilhaEscoposExecucao.definirVariavel('encontrarÚltimoÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
|
|
16617
16987
|
pilhaEscoposExecucao.definirVariavel('filtrarPor', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.filtrarPor));
|
|
16618
16988
|
pilhaEscoposExecucao.definirVariavel('incluido', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
|
|
16989
|
+
pilhaEscoposExecucao.definirVariavel('incluído', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
|
|
16619
16990
|
pilhaEscoposExecucao.definirVariavel('inteiro', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.inteiro));
|
|
16620
16991
|
pilhaEscoposExecucao.definirVariavel('longo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.longo));
|
|
16621
16992
|
pilhaEscoposExecucao.definirVariavel('intervalo', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.intervalo));
|
|
16622
16993
|
pilhaEscoposExecucao.definirVariavel('mapear', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.mapear));
|
|
16623
16994
|
pilhaEscoposExecucao.definirVariavel('maximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
|
|
16995
|
+
pilhaEscoposExecucao.definirVariavel('máximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
|
|
16624
16996
|
pilhaEscoposExecucao.definirVariavel('minimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
|
|
16997
|
+
pilhaEscoposExecucao.definirVariavel('mínimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
|
|
16625
16998
|
pilhaEscoposExecucao.definirVariavel('numero', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero));
|
|
16626
16999
|
pilhaEscoposExecucao.definirVariavel('número', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero));
|
|
16627
17000
|
pilhaEscoposExecucao.definirVariavel('ordenar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.ordenar));
|
|
16628
17001
|
pilhaEscoposExecucao.definirVariavel('paraCada', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.paraCada));
|
|
16629
17002
|
pilhaEscoposExecucao.definirVariavel('primeiroEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
|
|
17003
|
+
pilhaEscoposExecucao.definirVariavel('primeiroEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
|
|
16630
17004
|
pilhaEscoposExecucao.definirVariavel('real', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.real));
|
|
16631
17005
|
pilhaEscoposExecucao.definirVariavel('reduzir', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.reduzir));
|
|
16632
17006
|
pilhaEscoposExecucao.definirVariavel('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
|
|
@@ -16634,28 +17008,29 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
|
|
|
16634
17008
|
pilhaEscoposExecucao.definirVariavel('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
|
|
16635
17009
|
pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
|
|
16636
17010
|
pilhaEscoposExecucao.definirVariavel('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
|
|
17011
|
+
pilhaEscoposExecucao.definirVariavel('todosEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
|
|
16637
17012
|
pilhaEscoposExecucao.definirVariavel('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
|
|
16638
17013
|
pilhaEscoposExecucao.definirVariavel('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
|
|
16639
17014
|
}
|
|
16640
17015
|
function pontoEntradaAjuda(funcao, topico) {
|
|
16641
17016
|
if (!funcao) {
|
|
16642
|
-
return
|
|
17017
|
+
return 'Para usar a ajuda, use como uma função: ajuda(objeto).';
|
|
16643
17018
|
}
|
|
16644
17019
|
if (!topico) {
|
|
16645
|
-
return
|
|
16646
|
-
|
|
16647
|
-
"Use ajuda('tópico') para obter informações sobre um tópico específico.\n\n";
|
|
17020
|
+
return ('Te damos as boas-vindas ao utilitário de ajuda de Delégua!\n\n' +
|
|
17021
|
+
'Use ajuda(objeto) para obter informações sobre um objeto, função, classe ou módulo.\n' +
|
|
17022
|
+
"Use ajuda('tópico') para obter informações sobre um tópico específico.\n\n");
|
|
16648
17023
|
}
|
|
16649
17024
|
return obterTopicoAjuda(topico);
|
|
16650
17025
|
}
|
|
16651
17026
|
function obterTopicoAjuda(topico) {
|
|
16652
17027
|
switch (topico.constructor) {
|
|
16653
17028
|
case construtos_1.Leia:
|
|
16654
|
-
return `A instrução 'leia' permite capturar a entrada do usuário durante a execução do programa. ` +
|
|
17029
|
+
return (`A instrução 'leia' permite capturar a entrada do usuário durante a execução do programa. ` +
|
|
16655
17030
|
`Você pode usar 'leia()' para ler uma linha de entrada do usuário e armazená-la em uma variável. ` +
|
|
16656
17031
|
`Exemplo de uso:\n\n` +
|
|
16657
17032
|
`\tvar minhaVariavel = leia()\n\n` +
|
|
16658
|
-
`Isto irá ler a entrada do usuário e atribuí-la à variável 'minhaVariavel'
|
|
17033
|
+
`Isto irá ler a entrada do usuário e atribuí-la à variável 'minhaVariavel'.`);
|
|
16659
17034
|
case funcao_padrao_1.FuncaoPadrao:
|
|
16660
17035
|
return obterAjudaFuncaoPadrao(topico);
|
|
16661
17036
|
case delegua_funcao_1.DeleguaFuncao:
|
|
@@ -16710,21 +17085,21 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16710
17085
|
const aridade = funcaoPadrao.valorAridade;
|
|
16711
17086
|
const implementacao = funcaoPadrao.funcao;
|
|
16712
17087
|
// Mapeamento de funções por nome
|
|
16713
|
-
const nomeFuncao = Object.keys(bibliotecaGlobal).find(key => bibliotecaGlobal[key] === implementacao);
|
|
17088
|
+
const nomeFuncao = Object.keys(bibliotecaGlobal).find((key) => bibliotecaGlobal[key] === implementacao);
|
|
16714
17089
|
if (!nomeFuncao) {
|
|
16715
17090
|
return 'Função não identificada. Não há documentação disponível.';
|
|
16716
17091
|
}
|
|
16717
17092
|
switch (nomeFuncao) {
|
|
16718
17093
|
case 'aleatorio':
|
|
16719
|
-
return `# aleatorio()\n\n` +
|
|
17094
|
+
return (`# aleatorio()\n\n` +
|
|
16720
17095
|
`Retorna um número aleatório entre 0 e 1.\n\n` +
|
|
16721
17096
|
`**Sintaxe:** aleatorio()\n\n` +
|
|
16722
17097
|
`**Retorno:** Número real entre 0 (inclusivo) e 1 (exclusivo).\n\n` +
|
|
16723
17098
|
`**Exemplo:**\n` +
|
|
16724
17099
|
`\tvar numeroSorteado = aleatorio()\n` +
|
|
16725
|
-
`\tescreva(numeroSorteado) // Pode retornar algo como 0.4829374657\n
|
|
17100
|
+
`\tescreva(numeroSorteado) // Pode retornar algo como 0.4829374657\n`);
|
|
16726
17101
|
case 'aleatorioEntre':
|
|
16727
|
-
return `# aleatorioEntre(minimo, maximo)\n\n` +
|
|
17102
|
+
return (`# aleatorioEntre(minimo, maximo)\n\n` +
|
|
16728
17103
|
`Retorna um número aleatório inteiro de acordo com os parâmetros passados.\n` +
|
|
16729
17104
|
`Mínimo (inclusivo) - Máximo (exclusivo).\n\n` +
|
|
16730
17105
|
`**Sintaxe:** aleatorioEntre(minimo: número, maximo: número)\n\n` +
|
|
@@ -16734,9 +17109,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16734
17109
|
`**Retorno:** Número inteiro entre minimo e maximo-1.\n\n` +
|
|
16735
17110
|
`**Exemplo:**\n` +
|
|
16736
17111
|
`\tvar dado = aleatorioEntre(1, 7)\n` +
|
|
16737
|
-
`\tescreva(dado) // Retorna um número entre 1 e 6\n
|
|
17112
|
+
`\tescreva(dado) // Retorna um número entre 1 e 6\n`);
|
|
16738
17113
|
case 'algum':
|
|
16739
|
-
return `# algum(vetor, funcaoPesquisa)\n\n` +
|
|
17114
|
+
return (`# algum(vetor, funcaoPesquisa)\n\n` +
|
|
16740
17115
|
`Verifica se algum dos elementos do vetor satisfaz a condição definida pela função de pesquisa.\n\n` +
|
|
16741
17116
|
`**Sintaxe:** algum(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
|
|
16742
17117
|
`**Parâmetros:**\n` +
|
|
@@ -16746,9 +17121,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16746
17121
|
`**Exemplo:**\n` +
|
|
16747
17122
|
`\tvar numeros = [1, 2, 3, 4, 5]\n` +
|
|
16748
17123
|
`\tvar temPar = algum(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
|
|
16749
|
-
`\tescreva(temPar) // verdadeiro\n
|
|
17124
|
+
`\tescreva(temPar) // verdadeiro\n`);
|
|
16750
17125
|
case 'clonar':
|
|
16751
|
-
return `# clonar(valor)\n\n` +
|
|
17126
|
+
return (`# clonar(valor)\n\n` +
|
|
16752
17127
|
`Clona profundamente uma variável ou constante em Delégua, criando uma cópia independente.\n\n` +
|
|
16753
17128
|
`**Sintaxe:** clonar(valor: qualquer)\n\n` +
|
|
16754
17129
|
`**Parâmetros:**\n` +
|
|
@@ -16759,9 +17134,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16759
17134
|
`\tvar copia = clonar(original)\n` +
|
|
16760
17135
|
`\tcopia[2][0] = 99\n` +
|
|
16761
17136
|
`\tescreva(original[2][0]) // 3 (não foi modificado)\n` +
|
|
16762
|
-
`\tescreva(copia[2][0]) // 99\n
|
|
17137
|
+
`\tescreva(copia[2][0]) // 99\n`);
|
|
16763
17138
|
case 'encontrar':
|
|
16764
|
-
return `# encontrar(vetor, funcaoPesquisa)\n\n` +
|
|
17139
|
+
return (`# encontrar(vetor, funcaoPesquisa)\n\n` +
|
|
16765
17140
|
`Encontra o primeiro elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
|
|
16766
17141
|
`**Sintaxe:** encontrar(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
|
|
16767
17142
|
`**Parâmetros:**\n` +
|
|
@@ -16771,9 +17146,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16771
17146
|
`**Exemplo:**\n` +
|
|
16772
17147
|
`\tvar numeros = [1, 3, 5, 8, 10]\n` +
|
|
16773
17148
|
`\tvar primeiroPar = encontrar(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
|
|
16774
|
-
`\tescreva(primeiroPar) // 8\n
|
|
17149
|
+
`\tescreva(primeiroPar) // 8\n`);
|
|
16775
17150
|
case 'encontrarIndice':
|
|
16776
|
-
return `# encontrarIndice(vetor, funcaoPesquisa)\n\n` +
|
|
17151
|
+
return (`# encontrarIndice(vetor, funcaoPesquisa)\n\n` +
|
|
16777
17152
|
`Encontra o índice do primeiro elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
|
|
16778
17153
|
`**Sintaxe:** encontrarIndice(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
|
|
16779
17154
|
`**Parâmetros:**\n` +
|
|
@@ -16783,9 +17158,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16783
17158
|
`**Exemplo:**\n` +
|
|
16784
17159
|
`\tvar frutas = ["maçã", "banana", "laranja"]\n` +
|
|
16785
17160
|
`\tvar indice = encontrarIndice(frutas, funcao(f) { retorna f == "banana" })\n` +
|
|
16786
|
-
`\tescreva(indice) // 1\n
|
|
17161
|
+
`\tescreva(indice) // 1\n`);
|
|
16787
17162
|
case 'encontrarUltimo':
|
|
16788
|
-
return `# encontrarUltimo(vetor, funcaoPesquisa)\n\n` +
|
|
17163
|
+
return (`# encontrarUltimo(vetor, funcaoPesquisa)\n\n` +
|
|
16789
17164
|
`Encontra o último elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
|
|
16790
17165
|
`**Sintaxe:** encontrarUltimo(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
|
|
16791
17166
|
`**Parâmetros:**\n` +
|
|
@@ -16795,9 +17170,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16795
17170
|
`**Exemplo:**\n` +
|
|
16796
17171
|
`\tvar numeros = [2, 4, 6, 7, 9]\n` +
|
|
16797
17172
|
`\tvar ultimoPar = encontrarUltimo(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
|
|
16798
|
-
`\tescreva(ultimoPar) // 6\n
|
|
17173
|
+
`\tescreva(ultimoPar) // 6\n`);
|
|
16799
17174
|
case 'encontrarUltimoIndice':
|
|
16800
|
-
return `# encontrarUltimoIndice(vetor, funcaoPesquisa)\n\n` +
|
|
17175
|
+
return (`# encontrarUltimoIndice(vetor, funcaoPesquisa)\n\n` +
|
|
16801
17176
|
`Encontra o índice do último elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
|
|
16802
17177
|
`**Sintaxe:** encontrarUltimoIndice(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
|
|
16803
17178
|
`**Parâmetros:**\n` +
|
|
@@ -16807,9 +17182,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16807
17182
|
`**Exemplo:**\n` +
|
|
16808
17183
|
`\tvar numeros = [2, 4, 6, 7, 9]\n` +
|
|
16809
17184
|
`\tvar indiceUltimoPar = encontrarUltimoIndice(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
|
|
16810
|
-
`\tescreva(indiceUltimoPar) // 2\n
|
|
17185
|
+
`\tescreva(indiceUltimoPar) // 2\n`);
|
|
16811
17186
|
case 'filtrarPor':
|
|
16812
|
-
return `# filtrarPor(vetor, funcaoFiltragem)\n\n` +
|
|
17187
|
+
return (`# filtrarPor(vetor, funcaoFiltragem)\n\n` +
|
|
16813
17188
|
`Cria um novo vetor com todos os elementos que passam no teste implementado pela função de filtragem.\n\n` +
|
|
16814
17189
|
`**Sintaxe:** filtrarPor(vetor: qualquer[], funcaoFiltragem: função)\n\n` +
|
|
16815
17190
|
`**Parâmetros:**\n` +
|
|
@@ -16819,9 +17194,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16819
17194
|
`**Exemplo:**\n` +
|
|
16820
17195
|
`\tvar numeros = [1, 2, 3, 4, 5, 6]\n` +
|
|
16821
17196
|
`\tvar pares = filtrarPor(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
|
|
16822
|
-
`\tescreva(pares) // [2, 4, 6]\n
|
|
17197
|
+
`\tescreva(pares) // [2, 4, 6]\n`);
|
|
16823
17198
|
case 'incluido':
|
|
16824
|
-
return `# incluido(vetor, valor)\n\n` +
|
|
17199
|
+
return (`# incluido(vetor, valor)\n\n` +
|
|
16825
17200
|
`Verifica se um valor está incluído em um vetor.\n\n` +
|
|
16826
17201
|
`**Sintaxe:** incluido(vetor: qualquer[], valor: qualquer)\n\n` +
|
|
16827
17202
|
`**Parâmetros:**\n` +
|
|
@@ -16831,9 +17206,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16831
17206
|
`**Exemplo:**\n` +
|
|
16832
17207
|
`\tvar frutas = ["maçã", "banana", "laranja"]\n` +
|
|
16833
17208
|
`\tescreva(incluido(frutas, "banana")) // verdadeiro\n` +
|
|
16834
|
-
`\tescreva(incluido(frutas, "uva")) // falso\n
|
|
17209
|
+
`\tescreva(incluido(frutas, "uva")) // falso\n`);
|
|
16835
17210
|
case 'inteiro':
|
|
16836
|
-
return `# inteiro(valor)\n\n` +
|
|
17211
|
+
return (`# inteiro(valor)\n\n` +
|
|
16837
17212
|
`Converte um valor em um número inteiro.\n\n` +
|
|
16838
17213
|
`**Sintaxe:** inteiro(valor: número | texto)\n\n` +
|
|
16839
17214
|
`**Parâmetros:**\n` +
|
|
@@ -16842,9 +17217,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16842
17217
|
`**Exemplo:**\n` +
|
|
16843
17218
|
`\tescreva(inteiro(3.14)) // 3\n` +
|
|
16844
17219
|
`\tescreva(inteiro("42")) // 42\n` +
|
|
16845
|
-
`\tescreva(inteiro("3.99")) // 3\n
|
|
17220
|
+
`\tescreva(inteiro("3.99")) // 3\n`);
|
|
16846
17221
|
case 'intervalo':
|
|
16847
|
-
return `# intervalo(valorInicial, valorFinal)\n\n` +
|
|
17222
|
+
return (`# intervalo(valorInicial, valorFinal)\n\n` +
|
|
16848
17223
|
`Cria um vetor com números inteiros no intervalo especificado.\n` +
|
|
16849
17224
|
`O valor inicial é inclusivo e o valor final é exclusivo.\n\n` +
|
|
16850
17225
|
`**Sintaxe:** intervalo(valorInicial: número, valorFinal: número)\n\n` +
|
|
@@ -16854,9 +17229,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16854
17229
|
`**Retorno:** Vetor com os números no intervalo especificado.\n\n` +
|
|
16855
17230
|
`**Exemplo:**\n` +
|
|
16856
17231
|
`\tvar numeros = intervalo(1, 6)\n` +
|
|
16857
|
-
`\tescreva(numeros) // [1, 2, 3, 4, 5]\n
|
|
17232
|
+
`\tescreva(numeros) // [1, 2, 3, 4, 5]\n`);
|
|
16858
17233
|
case 'mapear':
|
|
16859
|
-
return `# mapear(vetor, funcaoMapeamento)\n\n` +
|
|
17234
|
+
return (`# mapear(vetor, funcaoMapeamento)\n\n` +
|
|
16860
17235
|
`Cria um novo vetor com os resultados da aplicação de uma função a cada elemento do vetor original.\n\n` +
|
|
16861
17236
|
`**Sintaxe:** mapear(vetor: qualquer[], funcaoMapeamento: função)\n\n` +
|
|
16862
17237
|
`**Parâmetros:**\n` +
|
|
@@ -16866,13 +17241,13 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16866
17241
|
`**Exemplo:**\n` +
|
|
16867
17242
|
`\tvar numeros = [1, 2, 3, 4]\n` +
|
|
16868
17243
|
`\tvar quadrados = mapear(numeros, funcao(n) { retorna n * n })\n` +
|
|
16869
|
-
`\tescreva(quadrados) // [1, 4, 9, 16]\n
|
|
17244
|
+
`\tescreva(quadrados) // [1, 4, 9, 16]\n`);
|
|
16870
17245
|
case 'maximo':
|
|
16871
17246
|
return `# maximo(vetor)\n\nRetorna o maior valor encontrado em um vetor de números.`;
|
|
16872
17247
|
case 'minimo':
|
|
16873
17248
|
return `# minimo(vetor)\n\nRetorna o menor valor encontrado em um vetor de números.`;
|
|
16874
17249
|
case 'numero':
|
|
16875
|
-
return `# numero(valor)\n\n` +
|
|
17250
|
+
return (`# numero(valor)\n\n` +
|
|
16876
17251
|
`Converte um valor em um número (pode ter parte decimal).\n\n` +
|
|
16877
17252
|
`**Sintaxe:** numero(valor: número | texto)\n\n` +
|
|
16878
17253
|
`**Parâmetros:**\n` +
|
|
@@ -16881,9 +17256,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16881
17256
|
`**Exemplo:**\n` +
|
|
16882
17257
|
`\tescreva(numero("3.14")) // 3.14\n` +
|
|
16883
17258
|
`\tescreva(numero("42")) // 42\n` +
|
|
16884
|
-
`\tescreva(numero(5)) // 5\n
|
|
17259
|
+
`\tescreva(numero(5)) // 5\n`);
|
|
16885
17260
|
case 'ordenar':
|
|
16886
|
-
return `# ordenar(vetor)\n\n` +
|
|
17261
|
+
return (`# ordenar(vetor)\n\n` +
|
|
16887
17262
|
`Ordena os elementos de um vetor em ordem crescente (números) ou alfabética (textos).\n\n` +
|
|
16888
17263
|
`**Sintaxe:** ordenar(vetor: qualquer[])\n\n` +
|
|
16889
17264
|
`**Parâmetros:**\n` +
|
|
@@ -16892,9 +17267,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16892
17267
|
`**Exemplo:**\n` +
|
|
16893
17268
|
`\tvar numeros = [5, 2, 8, 1, 9]\n` +
|
|
16894
17269
|
`\tordenar(numeros)\n` +
|
|
16895
|
-
`\tescreva(numeros) // [1, 2, 5, 8, 9]\n
|
|
17270
|
+
`\tescreva(numeros) // [1, 2, 5, 8, 9]\n`);
|
|
16896
17271
|
case 'paraCada':
|
|
16897
|
-
return `# paraCada(vetor, funcao)\n\n` +
|
|
17272
|
+
return (`# paraCada(vetor, funcao)\n\n` +
|
|
16898
17273
|
`Executa uma função para cada elemento do vetor.\n\n` +
|
|
16899
17274
|
`**Sintaxe:** paraCada(vetor: qualquer[], funcao: função)\n\n` +
|
|
16900
17275
|
`**Parâmetros:**\n` +
|
|
@@ -16905,9 +17280,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16905
17280
|
`\tvar nomes = ["Ana", "Bruno", "Carlos"]\n` +
|
|
16906
17281
|
`\tparaCada(nomes, funcao(nome) {\n` +
|
|
16907
17282
|
`\t\tescreva("Olá, " + nome)\n` +
|
|
16908
|
-
`\t})\n
|
|
17283
|
+
`\t})\n`);
|
|
16909
17284
|
case 'primeiroEmCondicao':
|
|
16910
|
-
return `# primeiroEmCondicao(vetor, funcaoFiltragem)\n\n` +
|
|
17285
|
+
return (`# primeiroEmCondicao(vetor, funcaoFiltragem)\n\n` +
|
|
16911
17286
|
`Retorna o primeiro elemento que satisfaz a condição especificada pela função de filtragem.\n\n` +
|
|
16912
17287
|
`**Sintaxe:** primeiroEmCondicao(vetor: qualquer[], funcaoFiltragem: função)\n\n` +
|
|
16913
17288
|
`**Parâmetros:**\n` +
|
|
@@ -16917,9 +17292,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16917
17292
|
`**Exemplo:**\n` +
|
|
16918
17293
|
`\tvar numeros = [1, 3, 5, 8, 10]\n` +
|
|
16919
17294
|
`\tvar resultado = primeiroEmCondicao(numeros, funcao(n) { retorna n > 5 })\n` +
|
|
16920
|
-
`\tescreva(resultado) // 8\n
|
|
17295
|
+
`\tescreva(resultado) // 8\n`);
|
|
16921
17296
|
case 'real':
|
|
16922
|
-
return `# real(valor)\n\n` +
|
|
17297
|
+
return (`# real(valor)\n\n` +
|
|
16923
17298
|
`Converte um valor em um número real (ponto flutuante).\n\n` +
|
|
16924
17299
|
`**Sintaxe:** real(valor: número | texto)\n\n` +
|
|
16925
17300
|
`**Parâmetros:**\n` +
|
|
@@ -16927,9 +17302,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16927
17302
|
`**Retorno:** Número real correspondente ao valor fornecido.\n\n` +
|
|
16928
17303
|
`**Exemplo:**\n` +
|
|
16929
17304
|
`\tescreva(real("3.14")) // 3.14\n` +
|
|
16930
|
-
`\tescreva(real(42)) // 42.0\n
|
|
17305
|
+
`\tescreva(real(42)) // 42.0\n`);
|
|
16931
17306
|
case 'reduzir':
|
|
16932
|
-
return `# reduzir(vetor, funcaoReducao, valorInicial)\n\n` +
|
|
17307
|
+
return (`# reduzir(vetor, funcaoReducao, valorInicial)\n\n` +
|
|
16933
17308
|
`Aplica uma função a um acumulador e cada elemento do vetor para reduzi-lo a um único valor.\n\n` +
|
|
16934
17309
|
`**Sintaxe:** reduzir(vetor: qualquer[], funcaoReducao: função, valorInicial?: qualquer)\n\n` +
|
|
16935
17310
|
`**Parâmetros:**\n` +
|
|
@@ -16940,11 +17315,11 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16940
17315
|
`**Exemplo:**\n` +
|
|
16941
17316
|
`\tvar numeros = [1, 2, 3, 4]\n` +
|
|
16942
17317
|
`\tvar soma = reduzir(numeros, funcao(acc, n) { retorna acc + n }, 0)\n` +
|
|
16943
|
-
`\tescreva(soma) // 10\n
|
|
17318
|
+
`\tescreva(soma) // 10\n`);
|
|
16944
17319
|
case 'somar':
|
|
16945
17320
|
return `# somar(vetor)\n\nRetorna a soma de todos os elementos de um vetor numérico.`;
|
|
16946
17321
|
case 'tamanho':
|
|
16947
|
-
return `# tamanho(objeto)\n\n` +
|
|
17322
|
+
return (`# tamanho(objeto)\n\n` +
|
|
16948
17323
|
`Retorna o tamanho de um objeto (vetor, texto, função, etc.).\n\n` +
|
|
16949
17324
|
`**Sintaxe:** tamanho(objeto: qualquer)\n\n` +
|
|
16950
17325
|
`**Parâmetros:**\n` +
|
|
@@ -16953,9 +17328,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16953
17328
|
`Para funções, retorna o número de parâmetros.\n\n` +
|
|
16954
17329
|
`**Exemplo:**\n` +
|
|
16955
17330
|
`\tescreva(tamanho([1, 2, 3])) // 3\n` +
|
|
16956
|
-
`\tescreva(tamanho("Delégua")) // 7\n
|
|
17331
|
+
`\tescreva(tamanho("Delégua")) // 7\n`);
|
|
16957
17332
|
case 'texto':
|
|
16958
|
-
return `# texto(valor)\n\n` +
|
|
17333
|
+
return (`# texto(valor)\n\n` +
|
|
16959
17334
|
`Transforma o valor ou variável em texto.\n\n` +
|
|
16960
17335
|
`**Sintaxe:** texto(valor: qualquer)\n\n` +
|
|
16961
17336
|
`**Parâmetros:**\n` +
|
|
@@ -16964,9 +17339,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16964
17339
|
`**Exemplo:**\n` +
|
|
16965
17340
|
`\tescreva(texto(42)) // "42"\n` +
|
|
16966
17341
|
`\tescreva(texto(verdadeiro)) // "verdadeiro"\n` +
|
|
16967
|
-
`\tescreva(texto([1, 2, 3])) // "[1, 2, 3]"\n
|
|
17342
|
+
`\tescreva(texto([1, 2, 3])) // "[1, 2, 3]"\n`);
|
|
16968
17343
|
case 'todosEmCondicao':
|
|
16969
|
-
return `# todosEmCondicao(vetor, funcaoCondicional)\n\n` +
|
|
17344
|
+
return (`# todosEmCondicao(vetor, funcaoCondicional)\n\n` +
|
|
16970
17345
|
`Retorna verdadeiro se todos os elementos do vetor satisfazem a condição especificada pela função.\n\n` +
|
|
16971
17346
|
`**Sintaxe:** todosEmCondicao(vetor: qualquer[], funcaoCondicional: função)\n\n` +
|
|
16972
17347
|
`**Parâmetros:**\n` +
|
|
@@ -16976,9 +17351,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16976
17351
|
`**Exemplo:**\n` +
|
|
16977
17352
|
`\tvar numeros = [2, 4, 6, 8]\n` +
|
|
16978
17353
|
`\tvar todosPares = todosEmCondicao(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
|
|
16979
|
-
`\tescreva(todosPares) // verdadeiro\n
|
|
17354
|
+
`\tescreva(todosPares) // verdadeiro\n`);
|
|
16980
17355
|
case 'tupla':
|
|
16981
|
-
return `# tupla(vetor)\n\n` +
|
|
17356
|
+
return (`# tupla(vetor)\n\n` +
|
|
16982
17357
|
`Transforma um vetor de elementos em uma tupla de N elementos, sendo N a largura do vetor.\n` +
|
|
16983
17358
|
`Tuplas são estruturas imutáveis de tamanho fixo.\n\n` +
|
|
16984
17359
|
`**Sintaxe:** tupla(vetor: qualquer[])\n\n` +
|
|
@@ -16988,10 +17363,10 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
|
|
|
16988
17363
|
`**Exemplo:**\n` +
|
|
16989
17364
|
`\tvar coordenadas = tupla([10, 20])\n` +
|
|
16990
17365
|
`\tescreva(coordenadas.primeiro) // 10\n` +
|
|
16991
|
-
`\tescreva(coordenadas.segundo) // 20\n
|
|
17366
|
+
`\tescreva(coordenadas.segundo) // 20\n`);
|
|
16992
17367
|
default:
|
|
16993
|
-
return `Função global identificada, mas documentação específica não disponível.\n` +
|
|
16994
|
-
`Aridade: ${aridade} parâmetro(s)
|
|
17368
|
+
return (`Função global identificada, mas documentação específica não disponível.\n` +
|
|
17369
|
+
`Aridade: ${aridade} parâmetro(s).`);
|
|
16995
17370
|
}
|
|
16996
17371
|
}
|
|
16997
17372
|
|
|
@@ -17248,7 +17623,9 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
17248
17623
|
if (this.instancia !== undefined) {
|
|
17249
17624
|
ambiente.valores['isto'] = {
|
|
17250
17625
|
valor: this.instancia,
|
|
17251
|
-
tipo: this.instancia instanceof objeto_delegua_classe_1.ObjetoDeleguaClasse
|
|
17626
|
+
tipo: this.instancia instanceof objeto_delegua_classe_1.ObjetoDeleguaClasse
|
|
17627
|
+
? 'objeto'
|
|
17628
|
+
: tipoDeDados(this.instancia),
|
|
17252
17629
|
imutavel: false,
|
|
17253
17630
|
};
|
|
17254
17631
|
}
|
|
@@ -17331,11 +17708,11 @@ const chamavel_1 = require("./chamavel");
|
|
|
17331
17708
|
const metodo_polimorfico_1 = require("./metodo-polimorfico");
|
|
17332
17709
|
const objeto_delegua_classe_1 = require("./objeto-delegua-classe");
|
|
17333
17710
|
const mapaDeNormalizacao = {
|
|
17334
|
-
|
|
17335
|
-
|
|
17336
|
-
|
|
17337
|
-
|
|
17338
|
-
|
|
17711
|
+
numero: 'número',
|
|
17712
|
+
logico: 'lógico',
|
|
17713
|
+
funcao: 'função',
|
|
17714
|
+
dicionario: 'dicionário',
|
|
17715
|
+
modulo: 'módulo',
|
|
17339
17716
|
};
|
|
17340
17717
|
function normalizarTipo(tipo) {
|
|
17341
17718
|
if (!tipo || tipo === 'qualquer')
|
|
@@ -17362,10 +17739,28 @@ function assinaturasIguais(a, b) {
|
|
|
17362
17739
|
* de classe é criada, a referência para a instância é implementada aqui.
|
|
17363
17740
|
*/
|
|
17364
17741
|
class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
17365
|
-
|
|
17742
|
+
/** Obtenedor de compat: primeiro pai direto (usado por tradutores e partes do interpretador). */
|
|
17743
|
+
get superClasse() {
|
|
17744
|
+
var _a;
|
|
17745
|
+
return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
|
|
17746
|
+
}
|
|
17747
|
+
/** Definidor de compat: atribui um único pai direto (usado pela atribuição implícita de OBJETO_BASE). */
|
|
17748
|
+
set superClasse(v) {
|
|
17749
|
+
this.superClasses = v ? [v] : [];
|
|
17750
|
+
}
|
|
17751
|
+
constructor(simboloOriginal, superClasses, metodos, propriedades) {
|
|
17366
17752
|
super();
|
|
17367
17753
|
this.simboloOriginal = simboloOriginal;
|
|
17368
|
-
|
|
17754
|
+
if (Array.isArray(superClasses)) {
|
|
17755
|
+
this.superClasses = superClasses;
|
|
17756
|
+
}
|
|
17757
|
+
else if (superClasses) {
|
|
17758
|
+
this.superClasses = [superClasses];
|
|
17759
|
+
}
|
|
17760
|
+
else {
|
|
17761
|
+
this.superClasses = [];
|
|
17762
|
+
}
|
|
17763
|
+
this.orem = [this];
|
|
17369
17764
|
this.metodos = metodos || {};
|
|
17370
17765
|
this.metodosEstaticos = {};
|
|
17371
17766
|
this.membrosEstaticos = {};
|
|
@@ -17381,6 +17776,44 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17381
17776
|
this.acessoMetodos = {};
|
|
17382
17777
|
this.acessoPropriedades = {};
|
|
17383
17778
|
}
|
|
17779
|
+
// ─── C3 OReM ──────────────────────────────────────────────────────────────
|
|
17780
|
+
static mesclaC3(listas) {
|
|
17781
|
+
const resultado = [];
|
|
17782
|
+
while (true) {
|
|
17783
|
+
const listasNaoVazias = listas.filter((l) => l.length > 0);
|
|
17784
|
+
if (listasNaoVazias.length === 0)
|
|
17785
|
+
break;
|
|
17786
|
+
let candidato = null;
|
|
17787
|
+
for (const lista of listasNaoVazias) {
|
|
17788
|
+
const cabeca = lista[0];
|
|
17789
|
+
const naCauda = listasNaoVazias.some((l) => l.slice(1).indexOf(cabeca) >= 0);
|
|
17790
|
+
if (!naCauda) {
|
|
17791
|
+
candidato = cabeca;
|
|
17792
|
+
break;
|
|
17793
|
+
}
|
|
17794
|
+
}
|
|
17795
|
+
if (candidato === null) {
|
|
17796
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(null, 'Hierarquia de classes inconsistente: não foi possível calcular o OReM (C3).');
|
|
17797
|
+
}
|
|
17798
|
+
resultado.push(candidato);
|
|
17799
|
+
for (const lista of listas) {
|
|
17800
|
+
const idx = lista.indexOf(candidato);
|
|
17801
|
+
if (idx === 0)
|
|
17802
|
+
lista.shift();
|
|
17803
|
+
}
|
|
17804
|
+
}
|
|
17805
|
+
return resultado;
|
|
17806
|
+
}
|
|
17807
|
+
/** Calcula e armazena o OReM (linearização C3) para esta classe e retorna a lista resultante. */
|
|
17808
|
+
static computarOReM(cls) {
|
|
17809
|
+
if (cls.superClasses.length === 0) {
|
|
17810
|
+
return [cls];
|
|
17811
|
+
}
|
|
17812
|
+
const oremsDePais = cls.superClasses.map((p) => DescritorTipoClasse.computarOReM(p));
|
|
17813
|
+
const listas = [...oremsDePais.map((m) => [...m]), [...cls.superClasses]];
|
|
17814
|
+
return [cls, ...DescritorTipoClasse.mesclaC3(listas)];
|
|
17815
|
+
}
|
|
17816
|
+
// ─── Verificação abstrata ─────────────────────────────────────────────────
|
|
17384
17817
|
/**
|
|
17385
17818
|
* Verifica se todos os métodos abstratos da superclasse estão implementados
|
|
17386
17819
|
* na subclasse fornecida. Lança erro em tempo de execução se algum faltar.
|
|
@@ -17395,13 +17828,17 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17395
17828
|
}
|
|
17396
17829
|
}
|
|
17397
17830
|
}
|
|
17831
|
+
// ─── Obtenedores e definidores ────────────────────────────────────────────
|
|
17398
17832
|
encontrarObtenedor(nome, estatico = false) {
|
|
17399
17833
|
const mapa = estatico ? this.obtenedoresEstaticos : this.obtenedores;
|
|
17400
17834
|
if (Object.prototype.hasOwnProperty.call(mapa, nome)) {
|
|
17401
17835
|
return mapa[nome];
|
|
17402
17836
|
}
|
|
17403
|
-
|
|
17404
|
-
|
|
17837
|
+
for (const ancestral of this.orem.slice(1)) {
|
|
17838
|
+
const mapaAnc = estatico ? ancestral.obtenedoresEstaticos : ancestral.obtenedores;
|
|
17839
|
+
if (Object.prototype.hasOwnProperty.call(mapaAnc, nome)) {
|
|
17840
|
+
return mapaAnc[nome];
|
|
17841
|
+
}
|
|
17405
17842
|
}
|
|
17406
17843
|
return undefined;
|
|
17407
17844
|
}
|
|
@@ -17410,11 +17847,15 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17410
17847
|
if (Object.prototype.hasOwnProperty.call(mapa, nome)) {
|
|
17411
17848
|
return mapa[nome];
|
|
17412
17849
|
}
|
|
17413
|
-
|
|
17414
|
-
|
|
17850
|
+
for (const ancestral of this.orem.slice(1)) {
|
|
17851
|
+
const mapaAnc = estatico ? ancestral.definidoresEstaticos : ancestral.definidores;
|
|
17852
|
+
if (Object.prototype.hasOwnProperty.call(mapaAnc, nome)) {
|
|
17853
|
+
return mapaAnc[nome];
|
|
17854
|
+
}
|
|
17415
17855
|
}
|
|
17416
17856
|
return undefined;
|
|
17417
17857
|
}
|
|
17858
|
+
// ─── Membros estáticos ────────────────────────────────────────────────────
|
|
17418
17859
|
async obterEstatico(nome, visitante) {
|
|
17419
17860
|
var _a;
|
|
17420
17861
|
const obtenedor = this.encontrarObtenedor(nome, true);
|
|
@@ -17443,9 +17884,10 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17443
17884
|
}
|
|
17444
17885
|
this.membrosEstaticos[nome] = valor;
|
|
17445
17886
|
}
|
|
17887
|
+
// ─── Resolução de métodos via OReM ─────────────────────────────────────────
|
|
17446
17888
|
/**
|
|
17447
|
-
* Mescla sobrecargas da classe atual com as
|
|
17448
|
-
* Sobrecargas da subclasse com mesma assinatura substituem as
|
|
17889
|
+
* Mescla sobrecargas da classe atual com as de ancestrais (respeitando MRO).
|
|
17890
|
+
* Sobrecargas da subclasse com mesma assinatura substituem as do ancestral.
|
|
17449
17891
|
*/
|
|
17450
17892
|
mesclarComSuperclasse(metodosAtuais, metodosSuperclasse) {
|
|
17451
17893
|
const resultado = [...metodosAtuais];
|
|
@@ -17458,28 +17900,20 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17458
17900
|
return resultado;
|
|
17459
17901
|
}
|
|
17460
17902
|
obterSobrecargasDaSuperclasse(nome) {
|
|
17461
|
-
|
|
17462
|
-
|
|
17463
|
-
const
|
|
17464
|
-
|
|
17465
|
-
|
|
17466
|
-
|
|
17467
|
-
|
|
17468
|
-
|
|
17469
|
-
|
|
17470
|
-
|
|
17471
|
-
const sobrecargasAncestral = this.superClasse.obterSobrecargasDaSuperclasse(nome);
|
|
17472
|
-
if (sobrecargasAncestral.length > 0) {
|
|
17473
|
-
const resultado = [...sobrecargasSuper];
|
|
17474
|
-
for (const metodoAnc of sobrecargasAncestral) {
|
|
17475
|
-
const jaSobrescrito = resultado.some((m) => assinaturasIguais(m, metodoAnc));
|
|
17476
|
-
if (!jaSobrescrito) {
|
|
17477
|
-
resultado.push(metodoAnc);
|
|
17903
|
+
let sobrecarga = [];
|
|
17904
|
+
// Percorre a OReM[1:] na ordem do OReM — o primeiro ancestral vence
|
|
17905
|
+
for (const ancestral of this.orem.slice(1)) {
|
|
17906
|
+
if (!ancestral.metodos.hasOwnProperty(nome))
|
|
17907
|
+
continue;
|
|
17908
|
+
const metodo = ancestral.metodos[nome];
|
|
17909
|
+
const novos = Array.isArray(metodo) ? metodo : [metodo];
|
|
17910
|
+
for (const m of novos) {
|
|
17911
|
+
if (!sobrecarga.some((s) => assinaturasIguais(s, m))) {
|
|
17912
|
+
sobrecarga.push(m);
|
|
17478
17913
|
}
|
|
17479
17914
|
}
|
|
17480
|
-
sobrecargasSuper = resultado;
|
|
17481
17915
|
}
|
|
17482
|
-
return
|
|
17916
|
+
return sobrecarga;
|
|
17483
17917
|
}
|
|
17484
17918
|
encontrarMetodo(nome) {
|
|
17485
17919
|
let metodosAtuais = [];
|
|
@@ -17510,14 +17944,17 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17510
17944
|
if (nome in this.propriedades) {
|
|
17511
17945
|
return this.propriedades[nome];
|
|
17512
17946
|
}
|
|
17513
|
-
|
|
17514
|
-
|
|
17947
|
+
for (const ancestral of this.orem.slice(1)) {
|
|
17948
|
+
if (nome in ancestral.propriedades) {
|
|
17949
|
+
return ancestral.propriedades[nome];
|
|
17950
|
+
}
|
|
17515
17951
|
}
|
|
17516
17952
|
if (this.dialetoRequerDeclaracaoPropriedades) {
|
|
17517
17953
|
throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${this.simboloOriginal.lexema}.`);
|
|
17518
17954
|
}
|
|
17519
17955
|
return undefined;
|
|
17520
17956
|
}
|
|
17957
|
+
// ─── Representação textual ────────────────────────────────────────────────
|
|
17521
17958
|
/**
|
|
17522
17959
|
* Método utilizado por Delégua para representar esta classe quando impressa.
|
|
17523
17960
|
* @returns {string} A representação da classe como texto.
|
|
@@ -17526,7 +17963,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
|
|
|
17526
17963
|
var _a, _b;
|
|
17527
17964
|
const nome = (_b = (_a = this.simboloOriginal) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : 'Objeto';
|
|
17528
17965
|
const nomesMetodos = Object.keys(this.metodos).join(', ');
|
|
17529
|
-
const nomesPropriedades = this.propriedades.map(p => p.nome.lexema).join(', ');
|
|
17966
|
+
const nomesPropriedades = this.propriedades.map((p) => p.nome.lexema).join(', ');
|
|
17530
17967
|
return `<[ ${nome} estático métodos=[${nomesMetodos}] propriedades=[${nomesPropriedades}] ]>`;
|
|
17531
17968
|
}
|
|
17532
17969
|
/**
|
|
@@ -17655,11 +18092,11 @@ const excecoes_1 = require("../../excecoes");
|
|
|
17655
18092
|
const chamavel_1 = require("./chamavel");
|
|
17656
18093
|
const tiposNumericos = ['inteiro', 'número', 'real', 'longo'];
|
|
17657
18094
|
const mapaDeNormalizacao = {
|
|
17658
|
-
|
|
17659
|
-
|
|
17660
|
-
|
|
17661
|
-
|
|
17662
|
-
|
|
18095
|
+
numero: 'número',
|
|
18096
|
+
logico: 'lógico',
|
|
18097
|
+
funcao: 'função',
|
|
18098
|
+
dicionario: 'dicionário',
|
|
18099
|
+
modulo: 'módulo',
|
|
17663
18100
|
};
|
|
17664
18101
|
function normalizarTipo(tipo) {
|
|
17665
18102
|
if (!tipo || tipo === 'qualquer')
|
|
@@ -17749,8 +18186,10 @@ class MetodoPolimorfico extends chamavel_1.Chamavel {
|
|
|
17749
18186
|
? argumentos[i].valor
|
|
17750
18187
|
: argumentos[i];
|
|
17751
18188
|
// Se o valor é uma VariavelInterface, extrair o valor real
|
|
17752
|
-
if (valorArgumento &&
|
|
17753
|
-
|
|
18189
|
+
if (valorArgumento &&
|
|
18190
|
+
typeof valorArgumento === 'object' &&
|
|
18191
|
+
valorArgumento.hasOwnProperty('valor') &&
|
|
18192
|
+
valorArgumento.hasOwnProperty('tipo')) {
|
|
17754
18193
|
valorArgumento = valorArgumento.valor;
|
|
17755
18194
|
}
|
|
17756
18195
|
const tipoArgumento = (0, inferenciador_1.inferirTipoVariavel)(valorArgumento);
|
|
@@ -17771,8 +18210,10 @@ class MetodoPolimorfico extends chamavel_1.Chamavel {
|
|
|
17771
18210
|
if (!melhorSobrecarga) {
|
|
17772
18211
|
const tiposArgs = argumentos.map((a) => {
|
|
17773
18212
|
let val = a && a.hasOwnProperty('valor') ? a.valor : a;
|
|
17774
|
-
if (val &&
|
|
17775
|
-
|
|
18213
|
+
if (val &&
|
|
18214
|
+
typeof val === 'object' &&
|
|
18215
|
+
val.hasOwnProperty('valor') &&
|
|
18216
|
+
val.hasOwnProperty('tipo')) {
|
|
17776
18217
|
val = val.valor;
|
|
17777
18218
|
}
|
|
17778
18219
|
return normalizarTipo((0, inferenciador_1.inferirTipoVariavel)(val));
|
|
@@ -17926,7 +18367,7 @@ function criarDescritorObjeto() {
|
|
|
17926
18367
|
descritor.metodos['igual'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('igual', 1, (instancia, args) => {
|
|
17927
18368
|
return instancia === args[0];
|
|
17928
18369
|
});
|
|
17929
|
-
|
|
18370
|
+
const implementacaoEInstanciaDe = (instancia, args) => {
|
|
17930
18371
|
if (!instancia)
|
|
17931
18372
|
return false;
|
|
17932
18373
|
const classeAlvo = args[0];
|
|
@@ -17939,8 +18380,10 @@ function criarDescritorObjeto() {
|
|
|
17939
18380
|
cls = cls.superClasse;
|
|
17940
18381
|
}
|
|
17941
18382
|
return false;
|
|
17942
|
-
}
|
|
17943
|
-
descritor.metodos['
|
|
18383
|
+
};
|
|
18384
|
+
descritor.metodos['eInstanciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('eInstanciaDe', 1, implementacaoEInstanciaDe);
|
|
18385
|
+
descritor.metodos['éInstânciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('éInstânciaDe', 1, implementacaoEInstanciaDe);
|
|
18386
|
+
const implementacaoMetodos = (instancia) => {
|
|
17944
18387
|
if (!instancia)
|
|
17945
18388
|
return [];
|
|
17946
18389
|
const nomes = [];
|
|
@@ -17953,7 +18396,9 @@ function criarDescritorObjeto() {
|
|
|
17953
18396
|
cls = cls.superClasse;
|
|
17954
18397
|
}
|
|
17955
18398
|
return nomes;
|
|
17956
|
-
}
|
|
18399
|
+
};
|
|
18400
|
+
descritor.metodos['metodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('metodos', 0, implementacaoMetodos);
|
|
18401
|
+
descritor.metodos['métodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('métodos', 0, implementacaoMetodos);
|
|
17957
18402
|
descritor.metodos['propriedades'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('propriedades', 0, (instancia) => {
|
|
17958
18403
|
if (!instancia)
|
|
17959
18404
|
return [];
|
|
@@ -17980,55 +18425,73 @@ const excecoes_1 = require("../../excecoes");
|
|
|
17980
18425
|
* Métodos são extraídos do descritor da classe, uma `DeleguaClasse`.
|
|
17981
18426
|
*/
|
|
17982
18427
|
class ObjetoDeleguaClasse {
|
|
18428
|
+
valorPadraoParaTipo(tipo) {
|
|
18429
|
+
switch (tipo) {
|
|
18430
|
+
case 'numero':
|
|
18431
|
+
return 0;
|
|
18432
|
+
case 'texto':
|
|
18433
|
+
return '';
|
|
18434
|
+
case 'logico':
|
|
18435
|
+
return false;
|
|
18436
|
+
default:
|
|
18437
|
+
return undefined;
|
|
18438
|
+
}
|
|
18439
|
+
}
|
|
17983
18440
|
constructor(classe) {
|
|
17984
18441
|
this.classe = classe;
|
|
17985
18442
|
this.propriedades = {};
|
|
17986
|
-
|
|
17987
|
-
|
|
18443
|
+
// Inicializar propriedades herdadas do OReM (do mais genérico ao mais específico)
|
|
18444
|
+
// para que ancestrais mais próximos sobrescrevam os mais distantes.
|
|
18445
|
+
const ancestrais = classe.orem.slice(1).reverse();
|
|
18446
|
+
for (const ancestral of ancestrais) {
|
|
18447
|
+
for (const propriedade of ancestral.propriedades) {
|
|
17988
18448
|
if (propriedade.estatico)
|
|
17989
18449
|
continue;
|
|
17990
18450
|
if (propriedade.autoObter || propriedade.autoDefinir) {
|
|
17991
|
-
this.propriedades['_' + propriedade.nome.lexema] =
|
|
18451
|
+
this.propriedades['_' + propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
|
|
17992
18452
|
}
|
|
17993
18453
|
else {
|
|
17994
|
-
this.propriedades[propriedade.nome.lexema] =
|
|
18454
|
+
this.propriedades[propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
|
|
17995
18455
|
}
|
|
17996
18456
|
}
|
|
17997
18457
|
}
|
|
17998
|
-
|
|
18458
|
+
// Propriedades da própria classe (têm prioridade máxima no valor padrão)
|
|
18459
|
+
for (const propriedade of classe.propriedades) {
|
|
17999
18460
|
if (propriedade.estatico)
|
|
18000
18461
|
continue;
|
|
18001
18462
|
if (propriedade.autoObter || propriedade.autoDefinir) {
|
|
18002
|
-
this.propriedades['_' + propriedade.nome.lexema] =
|
|
18463
|
+
this.propriedades['_' + propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
|
|
18003
18464
|
}
|
|
18004
18465
|
else {
|
|
18005
|
-
this.propriedades[propriedade.nome.lexema] =
|
|
18466
|
+
this.propriedades[propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
|
|
18006
18467
|
}
|
|
18007
18468
|
}
|
|
18008
18469
|
}
|
|
18009
18470
|
verificarAcessoLeitura(nome, simbolo, visitante) {
|
|
18010
|
-
var _a, _b, _c, _d, _e;
|
|
18011
|
-
|
|
18471
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
18472
|
+
// Percorre o OReM para encontrar a classe que declarou o membro com um modificador de acesso.
|
|
18473
|
+
let declaradorClasse = undefined;
|
|
18474
|
+
let acesso = undefined;
|
|
18475
|
+
for (const cls of this.classe.orem) {
|
|
18476
|
+
const acessoCls = (_b = (_a = cls.acessoPropriedades) === null || _a === void 0 ? void 0 : _a[nome]) !== null && _b !== void 0 ? _b : (_c = cls.acessoMetodos) === null || _c === void 0 ? void 0 : _c[nome];
|
|
18477
|
+
if (acessoCls) {
|
|
18478
|
+
acesso = acessoCls;
|
|
18479
|
+
declaradorClasse = cls;
|
|
18480
|
+
break;
|
|
18481
|
+
}
|
|
18482
|
+
}
|
|
18012
18483
|
if (!acesso || acesso === 'publico')
|
|
18013
18484
|
return;
|
|
18014
18485
|
const classeAtual = visitante === null || visitante === void 0 ? void 0 : visitante.classeAtualEmExecucao;
|
|
18015
18486
|
if (acesso === 'privado') {
|
|
18016
|
-
if (classeAtual !==
|
|
18017
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é privado e não pode ser acessado fora da classe '${(_d =
|
|
18487
|
+
if (classeAtual !== declaradorClasse) {
|
|
18488
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é privado e não pode ser acessado fora da classe '${(_d = declaradorClasse.simboloOriginal) === null || _d === void 0 ? void 0 : _d.lexema}'.`);
|
|
18018
18489
|
}
|
|
18019
18490
|
}
|
|
18020
18491
|
else if (acesso === 'protegido') {
|
|
18021
|
-
|
|
18022
|
-
let eAcessivel = false;
|
|
18023
|
-
while (cls) {
|
|
18024
|
-
if (cls === this.classe) {
|
|
18025
|
-
eAcessivel = true;
|
|
18026
|
-
break;
|
|
18027
|
-
}
|
|
18028
|
-
cls = cls.superClasse;
|
|
18029
|
-
}
|
|
18492
|
+
const eAcessivel = (_f = (_e = classeAtual === null || classeAtual === void 0 ? void 0 : classeAtual.orem) === null || _e === void 0 ? void 0 : _e.includes(declaradorClasse)) !== null && _f !== void 0 ? _f : false;
|
|
18030
18493
|
if (!eAcessivel) {
|
|
18031
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é protegido e não pode ser acessado fora da hierarquia da classe '${(
|
|
18494
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é protegido e não pode ser acessado fora da hierarquia da classe '${(_g = declaradorClasse.simboloOriginal) === null || _g === void 0 ? void 0 : _g.lexema}'.`);
|
|
18032
18495
|
}
|
|
18033
18496
|
}
|
|
18034
18497
|
}
|
|
@@ -18042,7 +18505,7 @@ class ObjetoDeleguaClasse {
|
|
|
18042
18505
|
return await metodoObtenedor.chamar(visitante, []);
|
|
18043
18506
|
}
|
|
18044
18507
|
// Auto-property: acessa o campo de armazenamento interno '_nome'
|
|
18045
|
-
const propAuto = this.classe.propriedades.find(p => p.nome.lexema === simbolo.lexema);
|
|
18508
|
+
const propAuto = this.classe.propriedades.find((p) => p.nome.lexema === simbolo.lexema);
|
|
18046
18509
|
if (propAuto === null || propAuto === void 0 ? void 0 : propAuto.autoObter) {
|
|
18047
18510
|
this.verificarAcessoLeitura(simbolo.lexema, simbolo, visitante);
|
|
18048
18511
|
return this.propriedades['_' + simbolo.lexema];
|
|
@@ -18087,7 +18550,7 @@ class ObjetoDeleguaClasse {
|
|
|
18087
18550
|
return;
|
|
18088
18551
|
}
|
|
18089
18552
|
// Auto-property: armazena no campo interno '_nome'
|
|
18090
|
-
const propAuto = this.classe.propriedades.find(p => p.nome.lexema === simbolo.lexema);
|
|
18553
|
+
const propAuto = this.classe.propriedades.find((p) => p.nome.lexema === simbolo.lexema);
|
|
18091
18554
|
if (propAuto === null || propAuto === void 0 ? void 0 : propAuto.autoDefinir) {
|
|
18092
18555
|
this.verificarAcessoLeitura(simbolo.lexema, simbolo, visitante);
|
|
18093
18556
|
this.propriedades['_' + simbolo.lexema] = valor;
|
|
@@ -18384,7 +18847,7 @@ class InterpretadorBase {
|
|
|
18384
18847
|
}
|
|
18385
18848
|
// Se é array, resolve recursivamente todos os elementos
|
|
18386
18849
|
if (Array.isArray(objeto)) {
|
|
18387
|
-
return objeto.map(elemento => this.resolverValorRecursivo(elemento));
|
|
18850
|
+
return objeto.map((elemento) => this.resolverValorRecursivo(elemento));
|
|
18388
18851
|
}
|
|
18389
18852
|
// Se é objeto plano, resolve recursivamente todas as propriedades
|
|
18390
18853
|
if (objeto && objeto.constructor && objeto.constructor === Object) {
|
|
@@ -18427,8 +18890,18 @@ class InterpretadorBase {
|
|
|
18427
18890
|
async visitarExpressaoTupla(expressao) {
|
|
18428
18891
|
// Lista de propriedades válidas para tuplas (ignorar propriedades de controle)
|
|
18429
18892
|
const propriedadesValidas = [
|
|
18430
|
-
'primeiro',
|
|
18431
|
-
'
|
|
18893
|
+
'primeiro',
|
|
18894
|
+
'segundo',
|
|
18895
|
+
'terceiro',
|
|
18896
|
+
'quarto',
|
|
18897
|
+
'quinto',
|
|
18898
|
+
'sexto',
|
|
18899
|
+
'sétimo',
|
|
18900
|
+
'setimo',
|
|
18901
|
+
'oitavo',
|
|
18902
|
+
'nono',
|
|
18903
|
+
'décimo',
|
|
18904
|
+
'decimo',
|
|
18432
18905
|
];
|
|
18433
18906
|
const valores = [];
|
|
18434
18907
|
for (let propriedade of propriedadesValidas) {
|
|
@@ -18445,7 +18918,7 @@ class InterpretadorBase {
|
|
|
18445
18918
|
const res = await this.avaliar(expressao.elementos[i]);
|
|
18446
18919
|
elementos.push(this.resolverValor(res));
|
|
18447
18920
|
}
|
|
18448
|
-
const elementosComoConstrutos = elementos.map(valor => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
|
|
18921
|
+
const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
|
|
18449
18922
|
return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
|
|
18450
18923
|
}
|
|
18451
18924
|
async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
|
|
@@ -18787,8 +19260,12 @@ class InterpretadorBase {
|
|
|
18787
19260
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18788
19261
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
18789
19262
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18790
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18791
|
-
|
|
19263
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19264
|
+
? valorEsquerdo
|
|
19265
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19266
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19267
|
+
? valorDireito
|
|
19268
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18792
19269
|
return esq ** dir;
|
|
18793
19270
|
}
|
|
18794
19271
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
@@ -18816,8 +19293,12 @@ class InterpretadorBase {
|
|
|
18816
19293
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18817
19294
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
18818
19295
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18819
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18820
|
-
|
|
19296
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19297
|
+
? valorEsquerdo
|
|
19298
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19299
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19300
|
+
? valorDireito
|
|
19301
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18821
19302
|
return esq - dir;
|
|
18822
19303
|
}
|
|
18823
19304
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
@@ -18829,8 +19310,12 @@ class InterpretadorBase {
|
|
|
18829
19310
|
}
|
|
18830
19311
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
18831
19312
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18832
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18833
|
-
|
|
19313
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19314
|
+
? valorEsquerdo
|
|
19315
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19316
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19317
|
+
? valorDireito
|
|
19318
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18834
19319
|
return esq + dir;
|
|
18835
19320
|
}
|
|
18836
19321
|
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
@@ -18860,8 +19345,12 @@ class InterpretadorBase {
|
|
|
18860
19345
|
}
|
|
18861
19346
|
// Retorna BigInt se qualquer operando for BigInt
|
|
18862
19347
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18863
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18864
|
-
|
|
19348
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19349
|
+
? valorEsquerdo
|
|
19350
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19351
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19352
|
+
? valorDireito
|
|
19353
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18865
19354
|
return esq / dir; // Trunca automaticamente
|
|
18866
19355
|
}
|
|
18867
19356
|
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
@@ -18871,8 +19360,12 @@ class InterpretadorBase {
|
|
|
18871
19360
|
if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
|
|
18872
19361
|
tipoEsquerdo !== delegua_2.default.TEXTO &&
|
|
18873
19362
|
tipoDireito !== delegua_2.default.TEXTO) {
|
|
18874
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18875
|
-
|
|
19363
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19364
|
+
? valorEsquerdo
|
|
19365
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19366
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19367
|
+
? valorDireito
|
|
19368
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18876
19369
|
return esq * dir;
|
|
18877
19370
|
}
|
|
18878
19371
|
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
@@ -18905,7 +19398,8 @@ class InterpretadorBase {
|
|
|
18905
19398
|
case delegua_1.default.MODULO:
|
|
18906
19399
|
case delegua_1.default.MODULO_IGUAL:
|
|
18907
19400
|
// Se o operando esquerdo é uma string, usar formatação de string
|
|
18908
|
-
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
19401
|
+
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
19402
|
+
typeof valorEsquerdo === 'string') {
|
|
18909
19403
|
return this.formatarStringComOperadorPorcentagem(String(valorEsquerdo), direita, // Passar 'direita' ao invés de 'valorDireito' para preservar arrays de tuplas
|
|
18910
19404
|
expressao.operador);
|
|
18911
19405
|
}
|
|
@@ -18919,8 +19413,12 @@ class InterpretadorBase {
|
|
|
18919
19413
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18920
19414
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
18921
19415
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18922
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18923
|
-
|
|
19416
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19417
|
+
? valorEsquerdo
|
|
19418
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19419
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19420
|
+
? valorDireito
|
|
19421
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18924
19422
|
return esq & dir;
|
|
18925
19423
|
}
|
|
18926
19424
|
return Number(valorEsquerdo) & Number(valorDireito);
|
|
@@ -18931,8 +19429,12 @@ class InterpretadorBase {
|
|
|
18931
19429
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18932
19430
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
18933
19431
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18934
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18935
|
-
|
|
19432
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19433
|
+
? valorEsquerdo
|
|
19434
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19435
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19436
|
+
? valorDireito
|
|
19437
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18936
19438
|
return esq ^ dir;
|
|
18937
19439
|
}
|
|
18938
19440
|
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
@@ -18943,8 +19445,12 @@ class InterpretadorBase {
|
|
|
18943
19445
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18944
19446
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
18945
19447
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
18946
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
18947
|
-
|
|
19448
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19449
|
+
? valorEsquerdo
|
|
19450
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19451
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19452
|
+
? valorDireito
|
|
19453
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18948
19454
|
return esq | dir;
|
|
18949
19455
|
}
|
|
18950
19456
|
return Number(valorEsquerdo) | Number(valorDireito);
|
|
@@ -18952,9 +19458,15 @@ class InterpretadorBase {
|
|
|
18952
19458
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18953
19459
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
18954
19460
|
const tamanhoDeslocamentoEsquerda = Number(valorDireito);
|
|
18955
|
-
if (typeof valorEsquerdo === 'bigint' ||
|
|
18956
|
-
|
|
18957
|
-
|
|
19461
|
+
if (typeof valorEsquerdo === 'bigint' ||
|
|
19462
|
+
typeof valorDireito === 'bigint' ||
|
|
19463
|
+
tamanhoDeslocamentoEsquerda >= 32) {
|
|
19464
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19465
|
+
? valorEsquerdo
|
|
19466
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19467
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19468
|
+
? valorDireito
|
|
19469
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18958
19470
|
return esq << dir;
|
|
18959
19471
|
}
|
|
18960
19472
|
return Number(valorEsquerdo) << Number(valorDireito);
|
|
@@ -18962,9 +19474,15 @@ class InterpretadorBase {
|
|
|
18962
19474
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
18963
19475
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
18964
19476
|
const tamanhoDeslocamentoDireita = Number(valorDireito);
|
|
18965
|
-
if (typeof valorEsquerdo === 'bigint' ||
|
|
18966
|
-
|
|
18967
|
-
|
|
19477
|
+
if (typeof valorEsquerdo === 'bigint' ||
|
|
19478
|
+
typeof valorDireito === 'bigint' ||
|
|
19479
|
+
tamanhoDeslocamentoDireita >= 32) {
|
|
19480
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19481
|
+
? valorEsquerdo
|
|
19482
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19483
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19484
|
+
? valorDireito
|
|
19485
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
18968
19486
|
return esq >> dir;
|
|
18969
19487
|
}
|
|
18970
19488
|
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
@@ -19085,7 +19603,8 @@ class InterpretadorBase {
|
|
|
19085
19603
|
// Casos que passam aqui: chamadas a métodos de bibliotecas de Delégua.
|
|
19086
19604
|
if (typeof entidadeChamada === primitivos_1.default.FUNCAO) {
|
|
19087
19605
|
let objeto = null;
|
|
19088
|
-
if (expressao.entidadeChamada.objeto) {
|
|
19606
|
+
if (expressao.entidadeChamada.objeto) {
|
|
19607
|
+
// TODO: Qual o tipo certo aqui?
|
|
19089
19608
|
objeto = await this.avaliar(expressao.entidadeChamada.objeto);
|
|
19090
19609
|
}
|
|
19091
19610
|
return entidadeChamada.apply(this.resolverValor(objeto), argumentos);
|
|
@@ -19144,7 +19663,8 @@ class InterpretadorBase {
|
|
|
19144
19663
|
}
|
|
19145
19664
|
logicaContemOuEm(esquerda, direita, expressao) {
|
|
19146
19665
|
const valorDireitoResolvido = this.resolverValor(direita);
|
|
19147
|
-
if (Array.isArray(valorDireitoResolvido) ||
|
|
19666
|
+
if (Array.isArray(valorDireitoResolvido) ||
|
|
19667
|
+
typeof valorDireitoResolvido === primitivos_1.default.TEXTO) {
|
|
19148
19668
|
const avaliacao = valorDireitoResolvido.includes(esquerda);
|
|
19149
19669
|
return expressao.negado ? !avaliacao : avaliacao;
|
|
19150
19670
|
}
|
|
@@ -19176,13 +19696,19 @@ class InterpretadorBase {
|
|
|
19176
19696
|
const valorDireito = this.resolverValor(direita);
|
|
19177
19697
|
if (typeof valorDireito === 'number' || typeof valorDireito === 'bigint') {
|
|
19178
19698
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
19179
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
19180
|
-
|
|
19181
|
-
|
|
19699
|
+
const esq = typeof valorEsquerdo === 'bigint'
|
|
19700
|
+
? valorEsquerdo
|
|
19701
|
+
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
19702
|
+
const dir = typeof valorDireito === 'bigint'
|
|
19703
|
+
? valorDireito
|
|
19704
|
+
: BigInt(Math.floor(Number(valorDireito)));
|
|
19705
|
+
return expressao.operador.tipo === delegua_1.default.E
|
|
19706
|
+
? esq & dir
|
|
19707
|
+
: esq | dir;
|
|
19182
19708
|
}
|
|
19183
19709
|
return expressao.operador.tipo === delegua_1.default.E
|
|
19184
|
-
?
|
|
19185
|
-
:
|
|
19710
|
+
? Number(valorEsquerdo) & Number(valorDireito)
|
|
19711
|
+
: Number(valorEsquerdo) | Number(valorDireito);
|
|
19186
19712
|
}
|
|
19187
19713
|
// Demais casos sem diferença de tipos
|
|
19188
19714
|
if (expressao.operador.tipo === delegua_1.default.OU) {
|
|
@@ -19276,7 +19802,7 @@ class InterpretadorBase {
|
|
|
19276
19802
|
const valorComoDupla = valorVetorResolvido[declaracao.posicaoAtual];
|
|
19277
19803
|
const promises = await Promise.all([
|
|
19278
19804
|
this.avaliar(declaracao.variavelIteracao.primeiro),
|
|
19279
|
-
this.avaliar(declaracao.variavelIteracao.segundo)
|
|
19805
|
+
this.avaliar(declaracao.variavelIteracao.segundo),
|
|
19280
19806
|
]);
|
|
19281
19807
|
// TODO: O que fazer quando não forem literais?
|
|
19282
19808
|
this.pilhaEscoposExecucao.definirVariavel(String(promises[0].valor), valorComoDupla.primeiro);
|
|
@@ -19456,7 +19982,9 @@ class InterpretadorBase {
|
|
|
19456
19982
|
let formatoTexto = '';
|
|
19457
19983
|
for (const argumento of argumentos) {
|
|
19458
19984
|
let resultadoAvaliacao = await this.avaliar(argumento);
|
|
19459
|
-
if (resultadoAvaliacao &&
|
|
19985
|
+
if (resultadoAvaliacao &&
|
|
19986
|
+
resultadoAvaliacao.hasOwnProperty &&
|
|
19987
|
+
resultadoAvaliacao.hasOwnProperty('valorRetornado')) {
|
|
19460
19988
|
resultadoAvaliacao = resultadoAvaliacao.valorRetornado;
|
|
19461
19989
|
}
|
|
19462
19990
|
let valor = this.resolverValor(resultadoAvaliacao);
|
|
@@ -19697,12 +20225,12 @@ class InterpretadorBase {
|
|
|
19697
20225
|
}, 'Somente listas, dicionários, classes e objetos podem ter seus valores indexados.', expressao.linha));
|
|
19698
20226
|
}
|
|
19699
20227
|
/**
|
|
19700
|
-
|
|
19701
|
-
|
|
19702
|
-
|
|
19703
|
-
|
|
20228
|
+
* Método base para acesso a intervalo.
|
|
20229
|
+
* Por padrão lança erro, pois a maioria dos dialetos (como Delégua padrão)
|
|
20230
|
+
* ainda não suporta isso nativamente, apenas Pituguês.
|
|
20231
|
+
*/
|
|
19704
20232
|
visitarExpressaoAcessoIntervaloVariavel(expressao) {
|
|
19705
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento,
|
|
20233
|
+
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Acesso por intervalo não implementado para este dialeto.', expressao.linha));
|
|
19706
20234
|
}
|
|
19707
20235
|
async visitarExpressaoDefinirValor(expressao) {
|
|
19708
20236
|
const variavelObjeto = await this.avaliar(expressao.objeto);
|
|
@@ -19735,18 +20263,30 @@ class InterpretadorBase {
|
|
|
19735
20263
|
* @returns Sempre retorna nulo, por ser requerido pelo contrato de visita.
|
|
19736
20264
|
*/
|
|
19737
20265
|
async visitarDeclaracaoClasse(declaracao) {
|
|
19738
|
-
|
|
19739
|
-
|
|
19740
|
-
|
|
19741
|
-
|
|
20266
|
+
// Resolver cada superclasse listada em `herda A, B, ...`
|
|
20267
|
+
const superClassesResolvidas = [];
|
|
20268
|
+
for (const superClasseVariavel of declaracao.superClasses) {
|
|
20269
|
+
const variavelSuperClasse = await this.avaliar(superClasseVariavel);
|
|
20270
|
+
const superClasse = variavelSuperClasse.valor;
|
|
19742
20271
|
if (!(superClasse instanceof estruturas_1.DescritorTipoClasse)) {
|
|
19743
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(
|
|
20272
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(superClasseVariavel.nome, 'Superclasse precisa ser uma classe.', declaracao.linha);
|
|
20273
|
+
}
|
|
20274
|
+
superClassesResolvidas.push(superClasse);
|
|
20275
|
+
}
|
|
20276
|
+
// Resolver cada misturável listado em `mescla X, Y, ...`
|
|
20277
|
+
const mesclaResolvidas = [];
|
|
20278
|
+
for (const mesclaVariavel of declaracao.mesclas) {
|
|
20279
|
+
const variavelMisturavel = await this.avaliar(mesclaVariavel);
|
|
20280
|
+
const misturável = variavelMisturavel.valor;
|
|
20281
|
+
if (!(misturável instanceof estruturas_1.DescritorTipoClasse)) {
|
|
20282
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(mesclaVariavel.nome, 'Misturável precisa ser uma classe.', declaracao.linha);
|
|
19744
20283
|
}
|
|
20284
|
+
mesclaResolvidas.push(misturável);
|
|
19745
20285
|
}
|
|
19746
20286
|
// TODO: Precisamos disso?
|
|
19747
20287
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, declaracao);
|
|
19748
|
-
if (
|
|
19749
|
-
this.pilhaEscoposExecucao.definirVariavel('super',
|
|
20288
|
+
if (superClassesResolvidas.length > 0) {
|
|
20289
|
+
this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
|
|
19750
20290
|
}
|
|
19751
20291
|
const metodos = {};
|
|
19752
20292
|
const metodosEstaticos = {};
|
|
@@ -19774,9 +20314,7 @@ class InterpretadorBase {
|
|
|
19774
20314
|
const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
|
|
19775
20315
|
funcao.documentacao = metodoAtual.documentacao;
|
|
19776
20316
|
// Numa classe estática, todos os métodos (exceto construtor) são estáticos.
|
|
19777
|
-
const ehEstatico = declaracao.classeEstatica
|
|
19778
|
-
? !eInicializador
|
|
19779
|
-
: metodoAtual.estatico;
|
|
20317
|
+
const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
|
|
19780
20318
|
if (metodoAtual.eObtenedor) {
|
|
19781
20319
|
if (ehEstatico) {
|
|
19782
20320
|
obtenedoresEstaticos[nomeMetodo] = funcao;
|
|
@@ -19817,7 +20355,7 @@ class InterpretadorBase {
|
|
|
19817
20355
|
acessoPropriedades[prop.nome.lexema] = prop.acesso;
|
|
19818
20356
|
}
|
|
19819
20357
|
}
|
|
19820
|
-
const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo,
|
|
20358
|
+
const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
|
|
19821
20359
|
descritorTipoClasse.metodosEstaticos = metodosEstaticos;
|
|
19822
20360
|
descritorTipoClasse.membrosEstaticos = membrosEstaticos;
|
|
19823
20361
|
descritorTipoClasse.obtenedores = obtenedores;
|
|
@@ -19832,13 +20370,45 @@ class InterpretadorBase {
|
|
|
19832
20370
|
// Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
|
|
19833
20371
|
// Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
|
|
19834
20372
|
// atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
|
|
19835
|
-
if (
|
|
19836
|
-
|
|
20373
|
+
if (descritorTipoClasse.superClasses.length === 0 &&
|
|
20374
|
+
estruturas_1.OBJETO_BASE &&
|
|
20375
|
+
descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
|
|
20376
|
+
descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
|
|
20377
|
+
}
|
|
20378
|
+
// Calcular o OReM (linearização C3) após os pais estarem definidos.
|
|
20379
|
+
descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
|
|
20380
|
+
// Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
|
|
20381
|
+
for (const misturável of mesclaResolvidas) {
|
|
20382
|
+
for (const [nome, funcao] of Object.entries(misturável.metodos)) {
|
|
20383
|
+
if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
|
|
20384
|
+
descritorTipoClasse.metodos[nome] = funcao;
|
|
20385
|
+
}
|
|
20386
|
+
}
|
|
20387
|
+
for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
|
|
20388
|
+
if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
|
|
20389
|
+
descritorTipoClasse.obtenedores[nome] = funcao;
|
|
20390
|
+
}
|
|
20391
|
+
}
|
|
20392
|
+
for (const [nome, funcao] of Object.entries(misturável.definidores)) {
|
|
20393
|
+
if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
|
|
20394
|
+
descritorTipoClasse.definidores[nome] = funcao;
|
|
20395
|
+
}
|
|
20396
|
+
}
|
|
20397
|
+
for (const prop of misturável.propriedades) {
|
|
20398
|
+
const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
|
|
20399
|
+
if (!jaDeclarada) {
|
|
20400
|
+
descritorTipoClasse.propriedades.push(prop);
|
|
20401
|
+
}
|
|
20402
|
+
}
|
|
19837
20403
|
}
|
|
19838
20404
|
// Verifica se a subclasse concreta implementa todos os métodos abstratos
|
|
19839
|
-
// da superclasse abstrata.
|
|
19840
|
-
if (!declaracao.abstrata
|
|
19841
|
-
superClasse
|
|
20405
|
+
// da(s) superclasse(s) abstrata(s).
|
|
20406
|
+
if (!declaracao.abstrata) {
|
|
20407
|
+
for (const superClasse of superClassesResolvidas) {
|
|
20408
|
+
if (superClasse.abstrata) {
|
|
20409
|
+
superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
|
|
20410
|
+
}
|
|
20411
|
+
}
|
|
19842
20412
|
}
|
|
19843
20413
|
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
19844
20414
|
// Por enquanto, tudo bem deixar isso aqui.
|
|
@@ -20065,21 +20635,25 @@ class InterpretadorBase {
|
|
|
20065
20635
|
let valoresArray;
|
|
20066
20636
|
// Verificar se é uma TuplaN (verifica instanceof OU propriedade elementos/tipo para maior compatibilidade)
|
|
20067
20637
|
if (valores instanceof construtos_1.TuplaN ||
|
|
20068
|
-
(valores &&
|
|
20638
|
+
(valores &&
|
|
20639
|
+
valores.tipo === 'tupla' &&
|
|
20640
|
+
valores.elementos &&
|
|
20641
|
+
Array.isArray(valores.elementos))) {
|
|
20069
20642
|
valoresArray = valores.elementos.map((elem) => {
|
|
20070
|
-
if (elem instanceof construtos_1.Literal ||
|
|
20643
|
+
if (elem instanceof construtos_1.Literal ||
|
|
20644
|
+
(elem && typeof elem === 'object' && elem.hasOwnProperty('valor'))) {
|
|
20071
20645
|
return this.resolverValor(elem.valor);
|
|
20072
20646
|
}
|
|
20073
20647
|
return this.resolverValor(elem);
|
|
20074
20648
|
});
|
|
20075
20649
|
}
|
|
20076
20650
|
else if (Array.isArray(valores)) {
|
|
20077
|
-
valoresArray = valores.map(v => this.resolverValor(v));
|
|
20651
|
+
valoresArray = valores.map((v) => this.resolverValor(v));
|
|
20078
20652
|
}
|
|
20079
20653
|
else {
|
|
20080
20654
|
const valorResolvido = this.resolverValor(valores);
|
|
20081
20655
|
if (Array.isArray(valorResolvido)) {
|
|
20082
|
-
valoresArray = valorResolvido.map(v => this.resolverValor(v));
|
|
20656
|
+
valoresArray = valorResolvido.map((v) => this.resolverValor(v));
|
|
20083
20657
|
}
|
|
20084
20658
|
else {
|
|
20085
20659
|
valoresArray = [valorResolvido];
|
|
@@ -20201,7 +20775,9 @@ class InterpretadorBase {
|
|
|
20201
20775
|
return objeto.valor.paraTexto();
|
|
20202
20776
|
if (objeto instanceof construtos_1.Literal)
|
|
20203
20777
|
return this.paraTexto(objeto.valor);
|
|
20204
|
-
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
20778
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
20779
|
+
objeto instanceof estruturas_1.DeleguaFuncao ||
|
|
20780
|
+
objeto instanceof estruturas_1.DescritorTipoClasse)
|
|
20205
20781
|
return objeto.paraTexto();
|
|
20206
20782
|
if (objeto instanceof quebras_1.RetornoQuebra) {
|
|
20207
20783
|
if (typeof objeto.valor === 'boolean')
|
|
@@ -20466,10 +21042,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
20466
21042
|
return objeto;
|
|
20467
21043
|
}
|
|
20468
21044
|
serializarSemEspacos(objeto) {
|
|
20469
|
-
return JSON
|
|
20470
|
-
.stringify(objeto)
|
|
20471
|
-
.replace(/,\s+/g, ',')
|
|
20472
|
-
.replace(/:\s+/g, ':');
|
|
21045
|
+
return JSON.stringify(objeto).replace(/,\s+/g, ',').replace(/:\s+/g, ':');
|
|
20473
21046
|
}
|
|
20474
21047
|
paraTexto(objeto) {
|
|
20475
21048
|
if (objeto === null || objeto === undefined)
|
|
@@ -20484,7 +21057,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
20484
21057
|
return objeto.valor.paraTexto();
|
|
20485
21058
|
if (objeto instanceof construtos_1.Literal || objeto instanceof construtos_1.Tupla)
|
|
20486
21059
|
return objeto.paraTextoSaida();
|
|
20487
|
-
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
21060
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
21061
|
+
objeto instanceof estruturas_1.DeleguaFuncao ||
|
|
21062
|
+
objeto instanceof estruturas_1.DescritorTipoClasse)
|
|
20488
21063
|
return objeto.paraTexto();
|
|
20489
21064
|
if (objeto instanceof quebras_1.RetornoQuebra) {
|
|
20490
21065
|
if (typeof objeto.valor === 'boolean')
|
|
@@ -20760,11 +21335,11 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
20760
21335
|
const valorComoDupla = valorVetorOuDicionarioResolvido[paraCada.posicaoAtual];
|
|
20761
21336
|
const nomesVariaveis = await Promise.all([
|
|
20762
21337
|
this.avaliar(paraCada.variavelIteracao.primeiro),
|
|
20763
|
-
this.avaliar(paraCada.variavelIteracao.segundo)
|
|
21338
|
+
this.avaliar(paraCada.variavelIteracao.segundo),
|
|
20764
21339
|
]);
|
|
20765
21340
|
const valoresDupla = await Promise.all([
|
|
20766
21341
|
this.avaliar(valorComoDupla.primeiro),
|
|
20767
|
-
this.avaliar(valorComoDupla.segundo)
|
|
21342
|
+
this.avaliar(valorComoDupla.segundo),
|
|
20768
21343
|
]);
|
|
20769
21344
|
// nomesVariaveis são strings (nomes das variáveis)
|
|
20770
21345
|
this.pilhaEscoposExecucao.definirVariavel(String(nomesVariaveis[0]), valoresDupla[0]);
|
|
@@ -21510,18 +22085,20 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
21510
22085
|
// Tratamento especial para expressões unárias aplicadas a chamadas de método em literais numéricos.
|
|
21511
22086
|
// Por exemplo: -5.absoluto() deve ser avaliado como (-5).absoluto(), não como -(5.absoluto())
|
|
21512
22087
|
// Isso garante que o operador unário seja aplicado ao literal antes de chamar o método.
|
|
21513
|
-
if ((expressao.operador.tipo === delegua_2.default.SUBTRACAO ||
|
|
22088
|
+
if ((expressao.operador.tipo === delegua_2.default.SUBTRACAO ||
|
|
22089
|
+
expressao.operador.tipo === delegua_2.default.ADICAO) &&
|
|
21514
22090
|
expressao.operando instanceof construtos_1.Chamada) {
|
|
21515
22091
|
const entidadeChamada = expressao.operando.entidadeChamada;
|
|
21516
22092
|
// Verifica se é AcessoMetodo ou AcessoMetodoOuPropriedade
|
|
21517
|
-
if (entidadeChamada instanceof construtos_1.AcessoMetodo ||
|
|
22093
|
+
if (entidadeChamada instanceof construtos_1.AcessoMetodo ||
|
|
22094
|
+
entidadeChamada instanceof construtos_1.AcessoMetodoOuPropriedade) {
|
|
21518
22095
|
const objetoAcesso = entidadeChamada.objeto;
|
|
21519
22096
|
// Verifica se o objeto do método é um literal numérico
|
|
21520
22097
|
if (objetoAcesso instanceof construtos_1.Literal && typeof objetoAcesso.valor === 'number') {
|
|
21521
22098
|
// Cria um novo literal com o sinal aplicado
|
|
21522
|
-
const novoLiteral = new construtos_1.Literal(objetoAcesso.hashArquivo, objetoAcesso.linha, expressao.operador.tipo === delegua_2.default.SUBTRACAO
|
|
21523
|
-
-objetoAcesso.valor
|
|
21524
|
-
+objetoAcesso.valor);
|
|
22099
|
+
const novoLiteral = new construtos_1.Literal(objetoAcesso.hashArquivo, objetoAcesso.linha, expressao.operador.tipo === delegua_2.default.SUBTRACAO
|
|
22100
|
+
? -objetoAcesso.valor
|
|
22101
|
+
: +objetoAcesso.valor);
|
|
21525
22102
|
// Cria um novo acesso com o literal modificado
|
|
21526
22103
|
let novoAcesso;
|
|
21527
22104
|
if (entidadeChamada instanceof construtos_1.AcessoMetodo) {
|
|
@@ -21543,7 +22120,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
21543
22120
|
async visitarExpressaoVetor(expressao) {
|
|
21544
22121
|
// Delega ao interpretador base para processar o vetor
|
|
21545
22122
|
const vetor = await super.visitarExpressaoVetor(expressao);
|
|
21546
|
-
// Adiciona referência no montão (comportamento específico deste interpretador)
|
|
22123
|
+
// Adiciona referência no montão (comportamento específico deste interpretador)
|
|
21547
22124
|
const enderecoVetorMontao = this.montao.adicionarReferencia(vetor);
|
|
21548
22125
|
this.pilhaEscoposExecucao.registrarReferenciaMontao(enderecoVetorMontao);
|
|
21549
22126
|
return new estruturas_1.ReferenciaMontao(enderecoVetorMontao);
|
|
@@ -22877,7 +23454,9 @@ class LexadorPitugues {
|
|
|
22877
23454
|
}
|
|
22878
23455
|
const deslocamento = ehFString ? 2 : 1;
|
|
22879
23456
|
const textoCompleto = this.codigo[this.linha].substring(this.inicioSimbolo + deslocamento, this.atual);
|
|
22880
|
-
if (textoCompleto.length === 0 &&
|
|
23457
|
+
if (textoCompleto.length === 0 &&
|
|
23458
|
+
!this.eFinalDoCodigo() &&
|
|
23459
|
+
this.codigo[this.linha].charAt(this.atual + 1) === delimitador) {
|
|
22881
23460
|
this.avancar(); // Avança para o próximo delimitador
|
|
22882
23461
|
this.analisarTextoMultilinha(delimitador);
|
|
22883
23462
|
return;
|
|
@@ -23488,9 +24067,31 @@ class LexadorPrisma {
|
|
|
23488
24067
|
}
|
|
23489
24068
|
eAlfabeto(caractere) {
|
|
23490
24069
|
const acentuacoes = [
|
|
23491
|
-
'á',
|
|
23492
|
-
'
|
|
23493
|
-
'
|
|
24070
|
+
'á',
|
|
24071
|
+
'Á',
|
|
24072
|
+
'ã',
|
|
24073
|
+
'Ã',
|
|
24074
|
+
'â',
|
|
24075
|
+
'Â',
|
|
24076
|
+
'à',
|
|
24077
|
+
'À',
|
|
24078
|
+
'é',
|
|
24079
|
+
'É',
|
|
24080
|
+
'ê',
|
|
24081
|
+
'Ê',
|
|
24082
|
+
'í',
|
|
24083
|
+
'Í',
|
|
24084
|
+
'ó',
|
|
24085
|
+
'Ó',
|
|
24086
|
+
'õ',
|
|
24087
|
+
'Õ',
|
|
24088
|
+
'ô',
|
|
24089
|
+
'Ô',
|
|
24090
|
+
'ú',
|
|
24091
|
+
'Ú',
|
|
24092
|
+
'ç',
|
|
24093
|
+
'Ç',
|
|
24094
|
+
'_',
|
|
23494
24095
|
];
|
|
23495
24096
|
return ((caractere >= 'a' && caractere <= 'z') ||
|
|
23496
24097
|
(caractere >= 'A' && caractere <= 'Z') ||
|
|
@@ -26010,13 +26611,14 @@ exports.palavrasReservadasDelegua = {
|
|
|
26010
26611
|
falso: delegua_1.default.FALSO,
|
|
26011
26612
|
faca: delegua_1.default.FAZER,
|
|
26012
26613
|
fazer: delegua_1.default.FAZER,
|
|
26013
|
-
|
|
26614
|
+
faça: delegua_1.default.FAZER,
|
|
26014
26615
|
finalmente: delegua_1.default.FINALMENTE,
|
|
26015
26616
|
fixo: delegua_1.default.CONSTANTE,
|
|
26016
26617
|
funcao: delegua_1.default.FUNCAO,
|
|
26017
26618
|
função: delegua_1.default.FUNÇÃO,
|
|
26018
26619
|
herda: delegua_1.default.HERDA,
|
|
26019
26620
|
implementa: delegua_1.default.IMPLEMENTA,
|
|
26621
|
+
mescla: delegua_1.default.MESCLA,
|
|
26020
26622
|
importar: delegua_1.default.IMPORTAR,
|
|
26021
26623
|
importe: delegua_1.default.IMPORTAR,
|
|
26022
26624
|
interface: delegua_1.default.INTERFACE,
|
|
@@ -26055,7 +26657,7 @@ exports.palavrasReservadasDelegua = {
|
|
|
26055
26657
|
var: delegua_1.default.VARIAVEL,
|
|
26056
26658
|
variavel: delegua_1.default.VARIAVEL,
|
|
26057
26659
|
variável: delegua_1.default.VARIAVEL,
|
|
26058
|
-
verdadeiro: delegua_1.default.VERDADEIRO
|
|
26660
|
+
verdadeiro: delegua_1.default.VERDADEIRO,
|
|
26059
26661
|
};
|
|
26060
26662
|
exports.palavrasReservadasMicroGramatica = {
|
|
26061
26663
|
e: delegua_1.default.E,
|
|
@@ -26318,6 +26920,7 @@ exports.default = {
|
|
|
26318
26920
|
HERDA: 'HERDA',
|
|
26319
26921
|
IDENTIFICADOR: 'IDENTIFICADOR',
|
|
26320
26922
|
IMPLEMENTA: 'IMPLEMENTA',
|
|
26923
|
+
MESCLA: 'MESCLA',
|
|
26321
26924
|
INTERFACE: 'INTERFACE',
|
|
26322
26925
|
IGUAL: 'IGUAL',
|
|
26323
26926
|
IGUAL_IGUAL: 'IGUAL_IGUAL',
|
|
@@ -39540,10 +40143,10 @@ class TradutorAssemblyARM {
|
|
|
39540
40143
|
// Para android: ainda é um binário standalone, mas com rótulo Delegua_main
|
|
39541
40144
|
// para deixar claro que não é o _start do CRT padrão.
|
|
39542
40145
|
const entryLabel = this.alvo === 'android' ? 'Delegua_main' : '_start';
|
|
39543
|
-
this.text = `
|
|
39544
|
-
.text
|
|
39545
|
-
.global ${entryLabel}
|
|
39546
|
-
|
|
40146
|
+
this.text = `
|
|
40147
|
+
.text
|
|
40148
|
+
.global ${entryLabel}
|
|
40149
|
+
|
|
39547
40150
|
${entryLabel}:`;
|
|
39548
40151
|
}
|
|
39549
40152
|
gerarDigitoAleatorio() {
|
|
@@ -39585,11 +40188,11 @@ ${entryLabel}:`;
|
|
|
39585
40188
|
}
|
|
39586
40189
|
const indice = this.dicionarioConstrutos[construto.indice.constructor.name](construto.indice);
|
|
39587
40190
|
const reg = this.obterRegistrador();
|
|
39588
|
-
this.text += `
|
|
39589
|
-
ldr ${reg}, =${nomeVar}
|
|
39590
|
-
ldr r0, =${indice}
|
|
39591
|
-
lsl r0, r0, #2 @ multiply index by 4 (word size)
|
|
39592
|
-
add ${reg}, ${reg}, r0
|
|
40191
|
+
this.text += `
|
|
40192
|
+
ldr ${reg}, =${nomeVar}
|
|
40193
|
+
ldr r0, =${indice}
|
|
40194
|
+
lsl r0, r0, #2 @ multiply index by 4 (word size)
|
|
40195
|
+
add ${reg}, ${reg}, r0
|
|
39593
40196
|
ldr r0, [${reg}]`;
|
|
39594
40197
|
this.liberarRegistrador(reg);
|
|
39595
40198
|
return 'r0';
|
|
@@ -39613,12 +40216,12 @@ ${entryLabel}:`;
|
|
|
39613
40216
|
const indice = this.dicionarioConstrutos[construto.indice.constructor.name](construto.indice);
|
|
39614
40217
|
const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
|
|
39615
40218
|
const reg = this.obterRegistrador();
|
|
39616
|
-
this.text += `
|
|
39617
|
-
ldr ${reg}, =${nomeVar}
|
|
39618
|
-
ldr r1, =${indice}
|
|
39619
|
-
lsl r1, r1, #2 @ multiply by 4
|
|
39620
|
-
add ${reg}, ${reg}, r1
|
|
39621
|
-
ldr r1, =${valor}
|
|
40219
|
+
this.text += `
|
|
40220
|
+
ldr ${reg}, =${nomeVar}
|
|
40221
|
+
ldr r1, =${indice}
|
|
40222
|
+
lsl r1, r1, #2 @ multiply by 4
|
|
40223
|
+
add ${reg}, ${reg}, r1
|
|
40224
|
+
ldr r1, =${valor}
|
|
39622
40225
|
str r1, [${reg}]`;
|
|
39623
40226
|
this.liberarRegistrador(reg);
|
|
39624
40227
|
}
|
|
@@ -39637,9 +40240,9 @@ ${entryLabel}:`;
|
|
|
39637
40240
|
this.bss += ` ${varLabel}: .space 4\n`;
|
|
39638
40241
|
this.variaveis.set(nomeVar, varLabel);
|
|
39639
40242
|
}
|
|
39640
|
-
this.text += `
|
|
39641
|
-
ldr r0, =${valor}
|
|
39642
|
-
ldr r1, =${this.variaveis.get(nomeVar)}
|
|
40243
|
+
this.text += `
|
|
40244
|
+
ldr r0, =${valor}
|
|
40245
|
+
ldr r1, =${this.variaveis.get(nomeVar)}
|
|
39643
40246
|
str r0, [r1]`;
|
|
39644
40247
|
}
|
|
39645
40248
|
traduzirConstrutoBinario(construto) {
|
|
@@ -39649,75 +40252,75 @@ ${entryLabel}:`;
|
|
|
39649
40252
|
const reg = this.obterRegistrador();
|
|
39650
40253
|
// Load left operand into r0
|
|
39651
40254
|
if (esquerda !== 'r0') {
|
|
39652
|
-
this.text += `
|
|
40255
|
+
this.text += `
|
|
39653
40256
|
ldr r0, =${esquerda}`;
|
|
39654
40257
|
}
|
|
39655
40258
|
// Load right operand into reg
|
|
39656
|
-
this.text += `
|
|
40259
|
+
this.text += `
|
|
39657
40260
|
ldr ${reg}, =${direita}`;
|
|
39658
40261
|
switch (operador) {
|
|
39659
40262
|
case '+':
|
|
39660
|
-
this.text += `
|
|
40263
|
+
this.text += `
|
|
39661
40264
|
add r0, r0, ${reg}`;
|
|
39662
40265
|
break;
|
|
39663
40266
|
case '-':
|
|
39664
|
-
this.text += `
|
|
40267
|
+
this.text += `
|
|
39665
40268
|
sub r0, r0, ${reg}`;
|
|
39666
40269
|
break;
|
|
39667
40270
|
case '*':
|
|
39668
|
-
this.text += `
|
|
40271
|
+
this.text += `
|
|
39669
40272
|
mul r0, r0, ${reg}`;
|
|
39670
40273
|
break;
|
|
39671
40274
|
case '/':
|
|
39672
|
-
this.text += `
|
|
40275
|
+
this.text += `
|
|
39673
40276
|
sdiv r0, r0, ${reg}`;
|
|
39674
40277
|
break;
|
|
39675
40278
|
case '%':
|
|
39676
|
-
this.text += `
|
|
39677
|
-
sdiv r1, r0, ${reg}
|
|
39678
|
-
mul r1, r1, ${reg}
|
|
40279
|
+
this.text += `
|
|
40280
|
+
sdiv r1, r0, ${reg}
|
|
40281
|
+
mul r1, r1, ${reg}
|
|
39679
40282
|
sub r0, r0, r1 @ r0 = r0 - (r0/reg)*reg`;
|
|
39680
40283
|
break;
|
|
39681
40284
|
case '<':
|
|
39682
|
-
this.text += `
|
|
39683
|
-
cmp r0, ${reg}
|
|
39684
|
-
movlt r0, #1
|
|
40285
|
+
this.text += `
|
|
40286
|
+
cmp r0, ${reg}
|
|
40287
|
+
movlt r0, #1
|
|
39685
40288
|
movge r0, #0`;
|
|
39686
40289
|
break;
|
|
39687
40290
|
case '>':
|
|
39688
|
-
this.text += `
|
|
39689
|
-
cmp r0, ${reg}
|
|
39690
|
-
movgt r0, #1
|
|
40291
|
+
this.text += `
|
|
40292
|
+
cmp r0, ${reg}
|
|
40293
|
+
movgt r0, #1
|
|
39691
40294
|
movle r0, #0`;
|
|
39692
40295
|
break;
|
|
39693
40296
|
case '<=':
|
|
39694
|
-
this.text += `
|
|
39695
|
-
cmp r0, ${reg}
|
|
39696
|
-
movle r0, #1
|
|
40297
|
+
this.text += `
|
|
40298
|
+
cmp r0, ${reg}
|
|
40299
|
+
movle r0, #1
|
|
39697
40300
|
movgt r0, #0`;
|
|
39698
40301
|
break;
|
|
39699
40302
|
case '>=':
|
|
39700
|
-
this.text += `
|
|
39701
|
-
cmp r0, ${reg}
|
|
39702
|
-
movge r0, #1
|
|
40303
|
+
this.text += `
|
|
40304
|
+
cmp r0, ${reg}
|
|
40305
|
+
movge r0, #1
|
|
39703
40306
|
movlt r0, #0`;
|
|
39704
40307
|
break;
|
|
39705
40308
|
case '==':
|
|
39706
40309
|
case '===':
|
|
39707
|
-
this.text += `
|
|
39708
|
-
cmp r0, ${reg}
|
|
39709
|
-
moveq r0, #1
|
|
40310
|
+
this.text += `
|
|
40311
|
+
cmp r0, ${reg}
|
|
40312
|
+
moveq r0, #1
|
|
39710
40313
|
movne r0, #0`;
|
|
39711
40314
|
break;
|
|
39712
40315
|
case '!=':
|
|
39713
40316
|
case '!==':
|
|
39714
|
-
this.text += `
|
|
39715
|
-
cmp r0, ${reg}
|
|
39716
|
-
movne r0, #1
|
|
40317
|
+
this.text += `
|
|
40318
|
+
cmp r0, ${reg}
|
|
40319
|
+
movne r0, #1
|
|
39717
40320
|
moveq r0, #0`;
|
|
39718
40321
|
break;
|
|
39719
40322
|
default:
|
|
39720
|
-
this.text += `
|
|
40323
|
+
this.text += `
|
|
39721
40324
|
@ Operador ${operador} não implementado`;
|
|
39722
40325
|
}
|
|
39723
40326
|
this.liberarRegistrador(reg);
|
|
@@ -39735,35 +40338,35 @@ ${entryLabel}:`;
|
|
|
39735
40338
|
if (index < registrosArgs.length) {
|
|
39736
40339
|
const valorArg = this.dicionarioConstrutos[arg.constructor.name](arg);
|
|
39737
40340
|
if (valorArg !== registrosArgs[index]) {
|
|
39738
|
-
this.text += `
|
|
40341
|
+
this.text += `
|
|
39739
40342
|
ldr ${registrosArgs[index]}, =${valorArg}`;
|
|
39740
40343
|
}
|
|
39741
40344
|
}
|
|
39742
40345
|
else {
|
|
39743
40346
|
// Push extra args on stack
|
|
39744
40347
|
const valorArg = this.dicionarioConstrutos[arg.constructor.name](arg);
|
|
39745
|
-
this.text += `
|
|
39746
|
-
ldr r0, =${valorArg}
|
|
40348
|
+
this.text += `
|
|
40349
|
+
ldr r0, =${valorArg}
|
|
39747
40350
|
push {r0}`;
|
|
39748
40351
|
}
|
|
39749
40352
|
});
|
|
39750
|
-
this.text += `
|
|
40353
|
+
this.text += `
|
|
39751
40354
|
bl ${nomeFuncao}`;
|
|
39752
40355
|
}
|
|
39753
40356
|
traduzirConstrutoDefinirValor(construto) {
|
|
39754
40357
|
const objeto = this.dicionarioConstrutos[construto.objeto.constructor.name](construto.objeto);
|
|
39755
40358
|
const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
|
|
39756
|
-
this.text += `
|
|
39757
|
-
ldr r0, =${valor}
|
|
39758
|
-
ldr r1, =${objeto}
|
|
40359
|
+
this.text += `
|
|
40360
|
+
ldr r0, =${valor}
|
|
40361
|
+
ldr r1, =${objeto}
|
|
39759
40362
|
str r0, [r1]`;
|
|
39760
40363
|
}
|
|
39761
40364
|
traduzirFuncaoConstruto(construto) {
|
|
39762
40365
|
const labelFuncao = `func_${this.gerarDigitoAleatorio()}`;
|
|
39763
|
-
this.text += `
|
|
39764
|
-
|
|
39765
|
-
${labelFuncao}:
|
|
39766
|
-
push {fp, lr}
|
|
40366
|
+
this.text += `
|
|
40367
|
+
|
|
40368
|
+
${labelFuncao}:
|
|
40369
|
+
push {fp, lr}
|
|
39767
40370
|
mov fp, sp`;
|
|
39768
40371
|
// Traduzir corpo da função
|
|
39769
40372
|
if (construto.corpo && Array.isArray(construto.corpo)) {
|
|
@@ -39773,8 +40376,8 @@ ${labelFuncao}:
|
|
|
39773
40376
|
}
|
|
39774
40377
|
});
|
|
39775
40378
|
}
|
|
39776
|
-
this.text += `
|
|
39777
|
-
mov sp, fp
|
|
40379
|
+
this.text += `
|
|
40380
|
+
mov sp, fp
|
|
39778
40381
|
pop {fp, pc}`;
|
|
39779
40382
|
}
|
|
39780
40383
|
traduzirConstrutoLiteral(construto) {
|
|
@@ -39789,29 +40392,29 @@ ${labelFuncao}:
|
|
|
39789
40392
|
const operador = construto.operador.lexema;
|
|
39790
40393
|
const labelVerdadeiro = this.gerarLabel();
|
|
39791
40394
|
const labelFim = this.gerarLabel();
|
|
39792
|
-
this.text += `
|
|
39793
|
-
ldr r0, =${esquerda}
|
|
40395
|
+
this.text += `
|
|
40396
|
+
ldr r0, =${esquerda}
|
|
39794
40397
|
cmp r0, #0`;
|
|
39795
40398
|
if (operador === 'e' || operador === '&&') {
|
|
39796
|
-
this.text += `
|
|
39797
|
-
beq ${labelFim}
|
|
39798
|
-
ldr r0, =${direita}
|
|
39799
|
-
cmp r0, #0
|
|
39800
|
-
beq ${labelFim}
|
|
39801
|
-
${labelVerdadeiro}:
|
|
39802
|
-
mov r0, #1
|
|
40399
|
+
this.text += `
|
|
40400
|
+
beq ${labelFim}
|
|
40401
|
+
ldr r0, =${direita}
|
|
40402
|
+
cmp r0, #0
|
|
40403
|
+
beq ${labelFim}
|
|
40404
|
+
${labelVerdadeiro}:
|
|
40405
|
+
mov r0, #1
|
|
39803
40406
|
${labelFim}:`;
|
|
39804
40407
|
}
|
|
39805
40408
|
else if (operador === 'ou' || operador === '||') {
|
|
39806
|
-
this.text += `
|
|
39807
|
-
bne ${labelVerdadeiro}
|
|
39808
|
-
ldr r0, =${direita}
|
|
39809
|
-
cmp r0, #0
|
|
39810
|
-
bne ${labelVerdadeiro}
|
|
39811
|
-
mov r0, #0
|
|
39812
|
-
b ${labelFim}
|
|
39813
|
-
${labelVerdadeiro}:
|
|
39814
|
-
mov r0, #1
|
|
40409
|
+
this.text += `
|
|
40410
|
+
bne ${labelVerdadeiro}
|
|
40411
|
+
ldr r0, =${direita}
|
|
40412
|
+
cmp r0, #0
|
|
40413
|
+
bne ${labelVerdadeiro}
|
|
40414
|
+
mov r0, #0
|
|
40415
|
+
b ${labelFim}
|
|
40416
|
+
${labelVerdadeiro}:
|
|
40417
|
+
mov r0, #1
|
|
39815
40418
|
${labelFim}:`;
|
|
39816
40419
|
}
|
|
39817
40420
|
return 'r0';
|
|
@@ -39823,16 +40426,16 @@ ${labelFim}:`;
|
|
|
39823
40426
|
traduzirConstrutoUnario(construto) {
|
|
39824
40427
|
const operando = this.dicionarioConstrutos[construto.operando.constructor.name](construto.operando);
|
|
39825
40428
|
const operador = construto.operador.lexema;
|
|
39826
|
-
this.text += `
|
|
40429
|
+
this.text += `
|
|
39827
40430
|
ldr r0, =${operando}`;
|
|
39828
40431
|
if (operador === '-') {
|
|
39829
|
-
this.text += `
|
|
40432
|
+
this.text += `
|
|
39830
40433
|
neg r0, r0`;
|
|
39831
40434
|
}
|
|
39832
40435
|
else if (operador === '!' || operador === 'nao') {
|
|
39833
|
-
this.text += `
|
|
39834
|
-
cmp r0, #0
|
|
39835
|
-
moveq r0, #1
|
|
40436
|
+
this.text += `
|
|
40437
|
+
cmp r0, #0
|
|
40438
|
+
moveq r0, #1
|
|
39836
40439
|
movne r0, #0`;
|
|
39837
40440
|
}
|
|
39838
40441
|
return 'r0';
|
|
@@ -39842,8 +40445,8 @@ ${labelFim}:`;
|
|
|
39842
40445
|
const nomeVar = (_a = construto.simbolo) === null || _a === void 0 ? void 0 : _a.lexema;
|
|
39843
40446
|
if (nomeVar && this.variaveis.has(nomeVar)) {
|
|
39844
40447
|
const varLabel = this.variaveis.get(nomeVar);
|
|
39845
|
-
this.text += `
|
|
39846
|
-
ldr r0, =${varLabel}
|
|
40448
|
+
this.text += `
|
|
40449
|
+
ldr r0, =${varLabel}
|
|
39847
40450
|
ldr r0, [r0]`;
|
|
39848
40451
|
return 'r0';
|
|
39849
40452
|
}
|
|
@@ -39858,9 +40461,9 @@ ${labelFim}:`;
|
|
|
39858
40461
|
construto.valores.forEach((valor, index) => {
|
|
39859
40462
|
if (this.dicionarioConstrutos[valor.constructor.name]) {
|
|
39860
40463
|
const valorTraduzido = this.dicionarioConstrutos[valor.constructor.name](valor);
|
|
39861
|
-
this.text += `
|
|
39862
|
-
ldr r0, =${valorTraduzido}
|
|
39863
|
-
ldr r1, =${labelVetor}
|
|
40464
|
+
this.text += `
|
|
40465
|
+
ldr r0, =${valorTraduzido}
|
|
40466
|
+
ldr r1, =${labelVetor}
|
|
39864
40467
|
str r0, [r1, #${index * 4}]`;
|
|
39865
40468
|
}
|
|
39866
40469
|
});
|
|
@@ -39880,17 +40483,17 @@ ${labelFim}:`;
|
|
|
39880
40483
|
traduzirDeclaracaoEnquanto(declaracao) {
|
|
39881
40484
|
const labelInicio = this.gerarLabel();
|
|
39882
40485
|
const labelFim = this.gerarLabel();
|
|
39883
|
-
this.text += `
|
|
40486
|
+
this.text += `
|
|
39884
40487
|
${labelInicio}:`;
|
|
39885
40488
|
const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
|
|
39886
|
-
this.text += `
|
|
39887
|
-
cmp ${condicao}, #0
|
|
40489
|
+
this.text += `
|
|
40490
|
+
cmp ${condicao}, #0
|
|
39888
40491
|
beq ${labelFim}`;
|
|
39889
40492
|
if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
|
|
39890
40493
|
this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
|
|
39891
40494
|
}
|
|
39892
|
-
this.text += `
|
|
39893
|
-
b ${labelInicio}
|
|
40495
|
+
this.text += `
|
|
40496
|
+
b ${labelInicio}
|
|
39894
40497
|
${labelFim}:`;
|
|
39895
40498
|
}
|
|
39896
40499
|
traduzirDeclaracaoEscolha(declaracao) {
|
|
@@ -39901,10 +40504,10 @@ ${labelFim}:`;
|
|
|
39901
40504
|
const labelProximo = this.gerarLabel();
|
|
39902
40505
|
if (caminho.condicoes && caminho.condicoes[0]) {
|
|
39903
40506
|
const valorCaso = this.dicionarioConstrutos[caminho.condicoes[0].constructor.name](caminho.condicoes[0]);
|
|
39904
|
-
this.text += `
|
|
39905
|
-
ldr r0, =${valorEscolha}
|
|
39906
|
-
ldr r1, =${valorCaso}
|
|
39907
|
-
cmp r0, r1
|
|
40507
|
+
this.text += `
|
|
40508
|
+
ldr r0, =${valorEscolha}
|
|
40509
|
+
ldr r1, =${valorCaso}
|
|
40510
|
+
cmp r0, r1
|
|
39908
40511
|
bne ${labelProximo}`;
|
|
39909
40512
|
if (caminho.declaracoes && Array.isArray(caminho.declaracoes)) {
|
|
39910
40513
|
caminho.declaracoes.forEach((decl) => {
|
|
@@ -39913,23 +40516,24 @@ ${labelFim}:`;
|
|
|
39913
40516
|
}
|
|
39914
40517
|
});
|
|
39915
40518
|
}
|
|
39916
|
-
this.text += `
|
|
39917
|
-
b ${labelFim}
|
|
40519
|
+
this.text += `
|
|
40520
|
+
b ${labelFim}
|
|
39918
40521
|
${labelProximo}:`;
|
|
39919
40522
|
}
|
|
39920
40523
|
});
|
|
39921
40524
|
}
|
|
39922
|
-
this.text += `
|
|
40525
|
+
this.text += `
|
|
39923
40526
|
${labelFim}:`;
|
|
39924
40527
|
}
|
|
39925
40528
|
traduzirDeclaracaoExpressao(declaracao) {
|
|
39926
|
-
if (declaracao.expressao &&
|
|
40529
|
+
if (declaracao.expressao &&
|
|
40530
|
+
this.dicionarioConstrutos[declaracao.expressao.constructor.name]) {
|
|
39927
40531
|
this.dicionarioConstrutos[declaracao.expressao.constructor.name](declaracao.expressao);
|
|
39928
40532
|
}
|
|
39929
40533
|
}
|
|
39930
40534
|
traduzirDeclaracaoFazer(declaracao) {
|
|
39931
40535
|
const labelInicio = this.gerarLabel();
|
|
39932
|
-
this.text += `
|
|
40536
|
+
this.text += `
|
|
39933
40537
|
${labelInicio}:`;
|
|
39934
40538
|
if (declaracao.caminhoFazer && declaracao.caminhoFazer.declaracoes) {
|
|
39935
40539
|
declaracao.caminhoFazer.declaracoes.forEach((decl) => {
|
|
@@ -39940,52 +40544,58 @@ ${labelInicio}:`;
|
|
|
39940
40544
|
}
|
|
39941
40545
|
if (declaracao.condicaoEnquanto) {
|
|
39942
40546
|
const condicao = this.dicionarioConstrutos[declaracao.condicaoEnquanto.constructor.name](declaracao.condicaoEnquanto);
|
|
39943
|
-
this.text += `
|
|
39944
|
-
cmp ${condicao}, #0
|
|
40547
|
+
this.text += `
|
|
40548
|
+
cmp ${condicao}, #0
|
|
39945
40549
|
bne ${labelInicio}`;
|
|
39946
40550
|
}
|
|
39947
40551
|
}
|
|
39948
40552
|
traduzirDeclaracaoFalhar(declaracao) {
|
|
39949
40553
|
let mensagem = '"Erro"';
|
|
39950
|
-
if (declaracao.explicacao &&
|
|
40554
|
+
if (declaracao.explicacao &&
|
|
40555
|
+
typeof declaracao.explicacao === 'object' &&
|
|
40556
|
+
'constructor' in declaracao.explicacao) {
|
|
39951
40557
|
const explicacao = declaracao.explicacao;
|
|
39952
40558
|
if (explicacao.constructor && this.dicionarioConstrutos[explicacao.constructor.name]) {
|
|
39953
40559
|
mensagem = this.dicionarioConstrutos[explicacao.constructor.name](explicacao);
|
|
39954
40560
|
}
|
|
39955
40561
|
}
|
|
39956
|
-
this.text += `
|
|
39957
|
-
@ Falhar com mensagem: ${mensagem}
|
|
39958
|
-
mov r0, #1
|
|
39959
|
-
mov r7, #1 @ sys_exit
|
|
40562
|
+
this.text += `
|
|
40563
|
+
@ Falhar com mensagem: ${mensagem}
|
|
40564
|
+
mov r0, #1
|
|
40565
|
+
mov r7, #1 @ sys_exit
|
|
39960
40566
|
swi 0`;
|
|
39961
40567
|
}
|
|
39962
40568
|
traduzirDeclaracaoFuncao(declaracao) {
|
|
39963
40569
|
var _a;
|
|
39964
40570
|
const nomeFuncao = ((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'funcao';
|
|
39965
|
-
this.text += `
|
|
39966
|
-
|
|
39967
|
-
${nomeFuncao}:
|
|
39968
|
-
push {fp, lr}
|
|
40571
|
+
this.text += `
|
|
40572
|
+
|
|
40573
|
+
${nomeFuncao}:
|
|
40574
|
+
push {fp, lr}
|
|
39969
40575
|
mov fp, sp`;
|
|
39970
|
-
if (declaracao.funcao &&
|
|
40576
|
+
if (declaracao.funcao &&
|
|
40577
|
+
declaracao.funcao.corpo &&
|
|
40578
|
+
Array.isArray(declaracao.funcao.corpo)) {
|
|
39971
40579
|
declaracao.funcao.corpo.forEach((decl) => {
|
|
39972
40580
|
if (this.dicionarioDeclaracoes[decl.constructor.name]) {
|
|
39973
40581
|
this.dicionarioDeclaracoes[decl.constructor.name](decl);
|
|
39974
40582
|
}
|
|
39975
40583
|
});
|
|
39976
40584
|
}
|
|
39977
|
-
this.text += `
|
|
39978
|
-
mov sp, fp
|
|
40585
|
+
this.text += `
|
|
40586
|
+
mov sp, fp
|
|
39979
40587
|
pop {fp, pc}`;
|
|
39980
40588
|
}
|
|
39981
40589
|
traduzirDeclaracaoImportar(declaracao) {
|
|
39982
|
-
this.text += `
|
|
40590
|
+
this.text += `
|
|
39983
40591
|
@ Importar: ${declaracao.caminho || 'unknown'}`;
|
|
39984
40592
|
}
|
|
39985
40593
|
traduzirDeclaracaoLeia(declaracao) {
|
|
39986
40594
|
var _a;
|
|
39987
40595
|
let nomeVar;
|
|
39988
|
-
if (declaracao.argumentos &&
|
|
40596
|
+
if (declaracao.argumentos &&
|
|
40597
|
+
declaracao.argumentos[0] &&
|
|
40598
|
+
declaracao.argumentos[0] instanceof construtos_1.Variavel) {
|
|
39989
40599
|
nomeVar = (_a = declaracao.argumentos[0].simbolo) === null || _a === void 0 ? void 0 : _a.lexema;
|
|
39990
40600
|
}
|
|
39991
40601
|
if (!nomeVar)
|
|
@@ -39995,11 +40605,11 @@ ${nomeFuncao}:
|
|
|
39995
40605
|
this.bss += ` ${varLabel}: .space 256\n`;
|
|
39996
40606
|
this.variaveis.set(nomeVar, varLabel);
|
|
39997
40607
|
}
|
|
39998
|
-
this.text += `
|
|
39999
|
-
ldr r1, =${this.variaveis.get(nomeVar)}
|
|
40000
|
-
mov r2, #256
|
|
40001
|
-
mov r0, #0 @ stdin
|
|
40002
|
-
mov r7, #3 @ sys_read
|
|
40608
|
+
this.text += `
|
|
40609
|
+
ldr r1, =${this.variaveis.get(nomeVar)}
|
|
40610
|
+
mov r2, #256
|
|
40611
|
+
mov r0, #0 @ stdin
|
|
40612
|
+
mov r7, #3 @ sys_read
|
|
40003
40613
|
swi 0`;
|
|
40004
40614
|
}
|
|
40005
40615
|
traduzirDeclaracaoPara(declaracao) {
|
|
@@ -40014,12 +40624,12 @@ ${nomeFuncao}:
|
|
|
40014
40624
|
this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
|
|
40015
40625
|
}
|
|
40016
40626
|
}
|
|
40017
|
-
this.text += `
|
|
40627
|
+
this.text += `
|
|
40018
40628
|
${labelInicio}:`;
|
|
40019
40629
|
if (declaracao.condicao) {
|
|
40020
40630
|
const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
|
|
40021
|
-
this.text += `
|
|
40022
|
-
cmp ${condicao}, #0
|
|
40631
|
+
this.text += `
|
|
40632
|
+
cmp ${condicao}, #0
|
|
40023
40633
|
beq ${labelFim}`;
|
|
40024
40634
|
}
|
|
40025
40635
|
if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
|
|
@@ -40030,8 +40640,8 @@ ${labelInicio}:`;
|
|
|
40030
40640
|
this.dicionarioConstrutos[declaracao.incrementar.constructor.name](declaracao.incrementar);
|
|
40031
40641
|
}
|
|
40032
40642
|
}
|
|
40033
|
-
this.text += `
|
|
40034
|
-
b ${labelInicio}
|
|
40643
|
+
this.text += `
|
|
40644
|
+
b ${labelInicio}
|
|
40035
40645
|
${labelFim}:`;
|
|
40036
40646
|
}
|
|
40037
40647
|
traduzirDeclaracaoParaCada(declaracao) {
|
|
@@ -40047,55 +40657,56 @@ ${labelFim}:`;
|
|
|
40047
40657
|
if (vetor instanceof construtos_1.Vetor) {
|
|
40048
40658
|
tamanhoVetor = vetor.tamanho || 0;
|
|
40049
40659
|
}
|
|
40050
|
-
this.text += `
|
|
40051
|
-
mov r4, #0 @ counter
|
|
40052
|
-
${labelInicio}:
|
|
40053
|
-
cmp r4, #${tamanhoVetor}
|
|
40660
|
+
this.text += `
|
|
40661
|
+
mov r4, #0 @ counter
|
|
40662
|
+
${labelInicio}:
|
|
40663
|
+
cmp r4, #${tamanhoVetor}
|
|
40054
40664
|
bge ${labelFim}`;
|
|
40055
40665
|
if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
|
|
40056
40666
|
this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
|
|
40057
40667
|
}
|
|
40058
|
-
this.text += `
|
|
40059
|
-
add r4, r4, #1
|
|
40060
|
-
b ${labelInicio}
|
|
40668
|
+
this.text += `
|
|
40669
|
+
add r4, r4, #1
|
|
40670
|
+
b ${labelInicio}
|
|
40061
40671
|
${labelFim}:`;
|
|
40062
40672
|
}
|
|
40063
40673
|
traduzirDeclaracaoRetorna(declaracao) {
|
|
40064
40674
|
if (declaracao.valor) {
|
|
40065
40675
|
const valor = this.dicionarioConstrutos[declaracao.valor.constructor.name](declaracao.valor);
|
|
40066
|
-
this.text += `
|
|
40676
|
+
this.text += `
|
|
40067
40677
|
ldr r0, =${valor}`;
|
|
40068
40678
|
}
|
|
40069
|
-
this.text += `
|
|
40070
|
-
mov sp, fp
|
|
40679
|
+
this.text += `
|
|
40680
|
+
mov sp, fp
|
|
40071
40681
|
pop {fp, pc}`;
|
|
40072
40682
|
}
|
|
40073
40683
|
traduzirDeclaracaoSe(declaracao) {
|
|
40074
40684
|
const labelSenao = this.gerarLabel();
|
|
40075
40685
|
const labelFim = this.gerarLabel();
|
|
40076
40686
|
const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
|
|
40077
|
-
this.text += `
|
|
40078
|
-
cmp ${condicao}, #0
|
|
40687
|
+
this.text += `
|
|
40688
|
+
cmp ${condicao}, #0
|
|
40079
40689
|
beq ${labelSenao}`;
|
|
40080
40690
|
if (this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name]) {
|
|
40081
40691
|
this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name](declaracao.caminhoEntao);
|
|
40082
40692
|
}
|
|
40083
|
-
this.text += `
|
|
40084
|
-
b ${labelFim}
|
|
40693
|
+
this.text += `
|
|
40694
|
+
b ${labelFim}
|
|
40085
40695
|
${labelSenao}:`;
|
|
40086
|
-
if (declaracao.caminhoSenao &&
|
|
40696
|
+
if (declaracao.caminhoSenao &&
|
|
40697
|
+
this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name]) {
|
|
40087
40698
|
this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name](declaracao.caminhoSenao);
|
|
40088
40699
|
}
|
|
40089
|
-
this.text += `
|
|
40700
|
+
this.text += `
|
|
40090
40701
|
${labelFim}:`;
|
|
40091
40702
|
}
|
|
40092
40703
|
traduzirDeclaracaoClasse(declaracao) {
|
|
40093
40704
|
var _a;
|
|
40094
|
-
this.text += `
|
|
40705
|
+
this.text += `
|
|
40095
40706
|
@ Classe: ${((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'unknown'}`;
|
|
40096
40707
|
}
|
|
40097
40708
|
traduzirDeclaracaoTente(declaracao) {
|
|
40098
|
-
this.text += `
|
|
40709
|
+
this.text += `
|
|
40099
40710
|
@ Tente-pegue`;
|
|
40100
40711
|
if (declaracao.caminhoTente && Array.isArray(declaracao.caminhoTente)) {
|
|
40101
40712
|
declaracao.caminhoTente.forEach((decl) => {
|
|
@@ -40134,9 +40745,9 @@ ${labelFim}:`;
|
|
|
40134
40745
|
}
|
|
40135
40746
|
else if (this.dicionarioConstrutos[tipoInicializador]) {
|
|
40136
40747
|
const valor = this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
|
|
40137
|
-
this.text += `
|
|
40138
|
-
ldr r0, =${valor}
|
|
40139
|
-
ldr r1, =${varLabel}
|
|
40748
|
+
this.text += `
|
|
40749
|
+
ldr r0, =${valor}
|
|
40750
|
+
ldr r1, =${varLabel}
|
|
40140
40751
|
str r0, [r1]`;
|
|
40141
40752
|
}
|
|
40142
40753
|
}
|
|
@@ -40163,20 +40774,20 @@ ${labelFim}:`;
|
|
|
40163
40774
|
// Para ambos linux-arm e android, continuamos usando a convenção
|
|
40164
40775
|
// de syscall Linux ARM (write). Em Android típico, esse binário
|
|
40165
40776
|
// seria executado via adb/Termux, onde essa convenção ainda é válida.
|
|
40166
|
-
this.text += `
|
|
40167
|
-
ldr r1, =${nome_string_literal}
|
|
40168
|
-
mov r2, #${tam_string_literal}
|
|
40169
|
-
mov r0, #1 @ fd stdout
|
|
40170
|
-
mov r7, #4 @ sys_write
|
|
40777
|
+
this.text += `
|
|
40778
|
+
ldr r1, =${nome_string_literal}
|
|
40779
|
+
mov r2, #${tam_string_literal}
|
|
40780
|
+
mov r0, #1 @ fd stdout
|
|
40781
|
+
mov r7, #4 @ sys_write
|
|
40171
40782
|
swi 0`;
|
|
40172
40783
|
}
|
|
40173
40784
|
saidaSistema() {
|
|
40174
40785
|
// Mesmo comentário da função Escreva: usamos sys_exit Linux.
|
|
40175
40786
|
// Em um futuro modo Android "NDK/JNI", esta função deveria
|
|
40176
40787
|
// apenas retornar ao chamador em vez de fazer syscall direta.
|
|
40177
|
-
this.text += `
|
|
40178
|
-
mov r0, #1 @ exit status
|
|
40179
|
-
mov r7, #1 @ sys_exit
|
|
40788
|
+
this.text += `
|
|
40789
|
+
mov r0, #1 @ exit status
|
|
40790
|
+
mov r7, #1 @ sys_exit
|
|
40180
40791
|
swi 0`;
|
|
40181
40792
|
}
|
|
40182
40793
|
traduzir(declaracoes) {
|
|
@@ -40251,13 +40862,14 @@ class TradutorAssemblyX64 {
|
|
|
40251
40862
|
Escreva: this.traduzirDeclaracaoEscreva.bind(this),
|
|
40252
40863
|
};
|
|
40253
40864
|
this.indentacao = 0;
|
|
40254
|
-
this.text = `
|
|
40255
|
-
section .text
|
|
40256
|
-
${this.alvo === 'linux' ? 'global _start' : 'global main'}
|
|
40865
|
+
this.text = `
|
|
40866
|
+
section .text
|
|
40867
|
+
${this.alvo === 'linux' ? 'global _start' : 'global main'}
|
|
40257
40868
|
${this.alvo === 'linux' ? '_start:' : 'main:'}`;
|
|
40258
40869
|
if (this.alvo === 'windows') {
|
|
40259
|
-
this.text =
|
|
40260
|
-
|
|
40870
|
+
this.text =
|
|
40871
|
+
`
|
|
40872
|
+
extern printf
|
|
40261
40873
|
` + this.text;
|
|
40262
40874
|
}
|
|
40263
40875
|
}
|
|
@@ -40319,8 +40931,8 @@ extern printf
|
|
|
40319
40931
|
}
|
|
40320
40932
|
const indice = this.dicionarioConstrutos[construto.indice.constructor.name](construto.indice);
|
|
40321
40933
|
const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
|
|
40322
|
-
this.text += `
|
|
40323
|
-
mov rax, ${valor}
|
|
40934
|
+
this.text += `
|
|
40935
|
+
mov rax, ${valor}
|
|
40324
40936
|
mov [${nomeVar} + ${indice} * 8], rax`;
|
|
40325
40937
|
}
|
|
40326
40938
|
traduzirConstrutoAtribuir(construto) {
|
|
@@ -40339,8 +40951,8 @@ extern printf
|
|
|
40339
40951
|
this.bss += ` ${varLabel} resq 1\n`;
|
|
40340
40952
|
this.variaveis.set(nomeVar, varLabel);
|
|
40341
40953
|
}
|
|
40342
|
-
this.text += `
|
|
40343
|
-
mov rax, ${valor}
|
|
40954
|
+
this.text += `
|
|
40955
|
+
mov rax, ${valor}
|
|
40344
40956
|
mov [${this.variaveis.get(nomeVar)}], rax`;
|
|
40345
40957
|
}
|
|
40346
40958
|
traduzirConstrutoBinario(construto) {
|
|
@@ -40348,35 +40960,35 @@ extern printf
|
|
|
40348
40960
|
const direita = this.dicionarioConstrutos[construto.direita.constructor.name](construto.direita);
|
|
40349
40961
|
const operador = construto.operador.lexema;
|
|
40350
40962
|
const reg = this.obterRegistrador();
|
|
40351
|
-
this.text += `
|
|
40352
|
-
mov rax, ${esquerda}
|
|
40963
|
+
this.text += `
|
|
40964
|
+
mov rax, ${esquerda}
|
|
40353
40965
|
mov ${reg}, ${direita}`;
|
|
40354
40966
|
switch (operador) {
|
|
40355
40967
|
case '+':
|
|
40356
|
-
this.text += `
|
|
40968
|
+
this.text += `
|
|
40357
40969
|
add rax, ${reg}`;
|
|
40358
40970
|
break;
|
|
40359
40971
|
case '-':
|
|
40360
|
-
this.text += `
|
|
40972
|
+
this.text += `
|
|
40361
40973
|
sub rax, ${reg}`;
|
|
40362
40974
|
break;
|
|
40363
40975
|
case '*':
|
|
40364
|
-
this.text += `
|
|
40976
|
+
this.text += `
|
|
40365
40977
|
imul rax, ${reg}`;
|
|
40366
40978
|
break;
|
|
40367
40979
|
case '/':
|
|
40368
|
-
this.text += `
|
|
40369
|
-
xor rdx, rdx
|
|
40980
|
+
this.text += `
|
|
40981
|
+
xor rdx, rdx
|
|
40370
40982
|
idiv ${reg}`;
|
|
40371
40983
|
break;
|
|
40372
40984
|
case '%':
|
|
40373
|
-
this.text += `
|
|
40374
|
-
xor rdx, rdx
|
|
40375
|
-
idiv ${reg}
|
|
40985
|
+
this.text += `
|
|
40986
|
+
xor rdx, rdx
|
|
40987
|
+
idiv ${reg}
|
|
40376
40988
|
mov rax, rdx`;
|
|
40377
40989
|
break;
|
|
40378
40990
|
default:
|
|
40379
|
-
this.text += `
|
|
40991
|
+
this.text += `
|
|
40380
40992
|
; Operador ${operador} não implementado`;
|
|
40381
40993
|
}
|
|
40382
40994
|
this.liberarRegistrador(reg);
|
|
@@ -40395,28 +41007,28 @@ extern printf
|
|
|
40395
41007
|
construto.argumentos.forEach((arg, index) => {
|
|
40396
41008
|
if (index < registrosArgs.length) {
|
|
40397
41009
|
const valorArg = this.dicionarioConstrutos[arg.constructor.name](arg);
|
|
40398
|
-
this.text += `
|
|
41010
|
+
this.text += `
|
|
40399
41011
|
mov ${registrosArgs[index]}, ${valorArg}`;
|
|
40400
41012
|
}
|
|
40401
41013
|
else {
|
|
40402
41014
|
// TODO: push extra args on stack according to target ABI
|
|
40403
41015
|
}
|
|
40404
41016
|
});
|
|
40405
|
-
this.text += `
|
|
41017
|
+
this.text += `
|
|
40406
41018
|
call ${nomeFuncao}`;
|
|
40407
41019
|
}
|
|
40408
41020
|
traduzirConstrutoDefinirValor(construto) {
|
|
40409
41021
|
const objeto = this.dicionarioConstrutos[construto.objeto.constructor.name](construto.objeto);
|
|
40410
41022
|
const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
|
|
40411
|
-
this.text += `
|
|
40412
|
-
mov rax, ${valor}
|
|
41023
|
+
this.text += `
|
|
41024
|
+
mov rax, ${valor}
|
|
40413
41025
|
mov [${objeto}], rax`;
|
|
40414
41026
|
}
|
|
40415
41027
|
traduzirFuncaoConstruto(construto) {
|
|
40416
41028
|
const labelFuncao = `func_${this.gerarDigitoAleatorio()}`;
|
|
40417
|
-
this.text += `
|
|
40418
|
-
${labelFuncao}:
|
|
40419
|
-
push rbp
|
|
41029
|
+
this.text += `
|
|
41030
|
+
${labelFuncao}:
|
|
41031
|
+
push rbp
|
|
40420
41032
|
mov rbp, rsp`;
|
|
40421
41033
|
// Traduzir corpo da função
|
|
40422
41034
|
if (construto.corpo && Array.isArray(construto.corpo)) {
|
|
@@ -40426,8 +41038,8 @@ ${labelFuncao}:
|
|
|
40426
41038
|
}
|
|
40427
41039
|
});
|
|
40428
41040
|
}
|
|
40429
|
-
this.text += `
|
|
40430
|
-
pop rbp
|
|
41041
|
+
this.text += `
|
|
41042
|
+
pop rbp
|
|
40431
41043
|
ret`;
|
|
40432
41044
|
}
|
|
40433
41045
|
traduzirConstrutoLiteral(construto) {
|
|
@@ -40442,29 +41054,29 @@ ${labelFuncao}:
|
|
|
40442
41054
|
const operador = construto.operador.lexema;
|
|
40443
41055
|
const labelVerdadeiro = this.gerarLabel();
|
|
40444
41056
|
const labelFim = this.gerarLabel();
|
|
40445
|
-
this.text += `
|
|
40446
|
-
mov rax, ${esquerda}
|
|
41057
|
+
this.text += `
|
|
41058
|
+
mov rax, ${esquerda}
|
|
40447
41059
|
cmp rax, 0`;
|
|
40448
41060
|
if (operador === 'e' || operador === '&&') {
|
|
40449
|
-
this.text += `
|
|
40450
|
-
je ${labelFim}
|
|
40451
|
-
mov rax, ${direita}
|
|
40452
|
-
cmp rax, 0
|
|
40453
|
-
je ${labelFim}
|
|
40454
|
-
${labelVerdadeiro}:
|
|
40455
|
-
mov rax, 1
|
|
41061
|
+
this.text += `
|
|
41062
|
+
je ${labelFim}
|
|
41063
|
+
mov rax, ${direita}
|
|
41064
|
+
cmp rax, 0
|
|
41065
|
+
je ${labelFim}
|
|
41066
|
+
${labelVerdadeiro}:
|
|
41067
|
+
mov rax, 1
|
|
40456
41068
|
${labelFim}:`;
|
|
40457
41069
|
}
|
|
40458
41070
|
else if (operador === 'ou' || operador === '||') {
|
|
40459
|
-
this.text += `
|
|
40460
|
-
jne ${labelVerdadeiro}
|
|
40461
|
-
mov rax, ${direita}
|
|
40462
|
-
cmp rax, 0
|
|
40463
|
-
jne ${labelVerdadeiro}
|
|
40464
|
-
mov rax, 0
|
|
40465
|
-
jmp ${labelFim}
|
|
40466
|
-
${labelVerdadeiro}:
|
|
40467
|
-
mov rax, 1
|
|
41071
|
+
this.text += `
|
|
41072
|
+
jne ${labelVerdadeiro}
|
|
41073
|
+
mov rax, ${direita}
|
|
41074
|
+
cmp rax, 0
|
|
41075
|
+
jne ${labelVerdadeiro}
|
|
41076
|
+
mov rax, 0
|
|
41077
|
+
jmp ${labelFim}
|
|
41078
|
+
${labelVerdadeiro}:
|
|
41079
|
+
mov rax, 1
|
|
40468
41080
|
${labelFim}:`;
|
|
40469
41081
|
}
|
|
40470
41082
|
return 'rax';
|
|
@@ -40477,16 +41089,16 @@ ${labelFim}:`;
|
|
|
40477
41089
|
traduzirConstrutoUnario(construto) {
|
|
40478
41090
|
const operando = this.dicionarioConstrutos[construto.operando.constructor.name](construto.operando);
|
|
40479
41091
|
const operador = construto.operador.lexema;
|
|
40480
|
-
this.text += `
|
|
41092
|
+
this.text += `
|
|
40481
41093
|
mov rax, ${operando}`;
|
|
40482
41094
|
if (operador === '-') {
|
|
40483
|
-
this.text += `
|
|
41095
|
+
this.text += `
|
|
40484
41096
|
neg rax`;
|
|
40485
41097
|
}
|
|
40486
41098
|
else if (operador === '!' || operador === 'nao') {
|
|
40487
|
-
this.text += `
|
|
40488
|
-
cmp rax, 0
|
|
40489
|
-
sete al
|
|
41099
|
+
this.text += `
|
|
41100
|
+
cmp rax, 0
|
|
41101
|
+
sete al
|
|
40490
41102
|
movzx rax, al`;
|
|
40491
41103
|
}
|
|
40492
41104
|
return 'rax';
|
|
@@ -40508,8 +41120,8 @@ ${labelFim}:`;
|
|
|
40508
41120
|
construto.valores.forEach((valor, index) => {
|
|
40509
41121
|
if (this.dicionarioConstrutos[valor.constructor.name]) {
|
|
40510
41122
|
const valorTraduzido = this.dicionarioConstrutos[valor.constructor.name](valor);
|
|
40511
|
-
this.text += `
|
|
40512
|
-
mov rax, ${valorTraduzido}
|
|
41123
|
+
this.text += `
|
|
41124
|
+
mov rax, ${valorTraduzido}
|
|
40513
41125
|
mov [${labelVetor} + ${index * 8}], rax`;
|
|
40514
41126
|
}
|
|
40515
41127
|
});
|
|
@@ -40529,17 +41141,17 @@ ${labelFim}:`;
|
|
|
40529
41141
|
traduzirDeclaracaoEnquanto(declaracao) {
|
|
40530
41142
|
const labelInicio = this.gerarLabel();
|
|
40531
41143
|
const labelFim = this.gerarLabel();
|
|
40532
|
-
this.text += `
|
|
41144
|
+
this.text += `
|
|
40533
41145
|
${labelInicio}:`;
|
|
40534
41146
|
const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
|
|
40535
|
-
this.text += `
|
|
40536
|
-
cmp ${condicao}, 0
|
|
41147
|
+
this.text += `
|
|
41148
|
+
cmp ${condicao}, 0
|
|
40537
41149
|
je ${labelFim}`;
|
|
40538
41150
|
if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
|
|
40539
41151
|
this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
|
|
40540
41152
|
}
|
|
40541
|
-
this.text += `
|
|
40542
|
-
jmp ${labelInicio}
|
|
41153
|
+
this.text += `
|
|
41154
|
+
jmp ${labelInicio}
|
|
40543
41155
|
${labelFim}:`;
|
|
40544
41156
|
}
|
|
40545
41157
|
traduzirDeclaracaoEscolha(declaracao) {
|
|
@@ -40550,9 +41162,9 @@ ${labelFim}:`;
|
|
|
40550
41162
|
const labelProximo = this.gerarLabel();
|
|
40551
41163
|
if (caminho.condicoes && caminho.condicoes[0]) {
|
|
40552
41164
|
const valorCaso = this.dicionarioConstrutos[caminho.condicoes[0].constructor.name](caminho.condicoes[0]);
|
|
40553
|
-
this.text += `
|
|
40554
|
-
mov rax, ${valorEscolha}
|
|
40555
|
-
cmp rax, ${valorCaso}
|
|
41165
|
+
this.text += `
|
|
41166
|
+
mov rax, ${valorEscolha}
|
|
41167
|
+
cmp rax, ${valorCaso}
|
|
40556
41168
|
jne ${labelProximo}`;
|
|
40557
41169
|
if (caminho.declaracoes && Array.isArray(caminho.declaracoes)) {
|
|
40558
41170
|
caminho.declaracoes.forEach((decl) => {
|
|
@@ -40561,23 +41173,24 @@ ${labelFim}:`;
|
|
|
40561
41173
|
}
|
|
40562
41174
|
});
|
|
40563
41175
|
}
|
|
40564
|
-
this.text += `
|
|
40565
|
-
jmp ${labelFim}
|
|
41176
|
+
this.text += `
|
|
41177
|
+
jmp ${labelFim}
|
|
40566
41178
|
${labelProximo}:`;
|
|
40567
41179
|
}
|
|
40568
41180
|
});
|
|
40569
41181
|
}
|
|
40570
|
-
this.text += `
|
|
41182
|
+
this.text += `
|
|
40571
41183
|
${labelFim}:`;
|
|
40572
41184
|
}
|
|
40573
41185
|
traduzirDeclaracaoExpressao(declaracao) {
|
|
40574
|
-
if (declaracao.expressao &&
|
|
41186
|
+
if (declaracao.expressao &&
|
|
41187
|
+
this.dicionarioConstrutos[declaracao.expressao.constructor.name]) {
|
|
40575
41188
|
this.dicionarioConstrutos[declaracao.expressao.constructor.name](declaracao.expressao);
|
|
40576
41189
|
}
|
|
40577
41190
|
}
|
|
40578
41191
|
traduzirDeclaracaoFazer(declaracao) {
|
|
40579
41192
|
const labelInicio = this.gerarLabel();
|
|
40580
|
-
this.text += `
|
|
41193
|
+
this.text += `
|
|
40581
41194
|
${labelInicio}:`;
|
|
40582
41195
|
// Em Delégua, fazer-enquanto tem caminhoFazer que é um Bloco
|
|
40583
41196
|
if (declaracao.caminhoFazer && declaracao.caminhoFazer.declaracoes) {
|
|
@@ -40589,60 +41202,66 @@ ${labelInicio}:`;
|
|
|
40589
41202
|
}
|
|
40590
41203
|
if (declaracao.condicaoEnquanto) {
|
|
40591
41204
|
const condicao = this.dicionarioConstrutos[declaracao.condicaoEnquanto.constructor.name](declaracao.condicaoEnquanto);
|
|
40592
|
-
this.text += `
|
|
40593
|
-
cmp ${condicao}, 0
|
|
41205
|
+
this.text += `
|
|
41206
|
+
cmp ${condicao}, 0
|
|
40594
41207
|
jne ${labelInicio}`;
|
|
40595
41208
|
}
|
|
40596
41209
|
}
|
|
40597
41210
|
traduzirDeclaracaoFalhar(declaracao) {
|
|
40598
41211
|
let mensagem = '"Erro"';
|
|
40599
|
-
if (declaracao.explicacao &&
|
|
41212
|
+
if (declaracao.explicacao &&
|
|
41213
|
+
typeof declaracao.explicacao === 'object' &&
|
|
41214
|
+
'constructor' in declaracao.explicacao) {
|
|
40600
41215
|
const explicacao = declaracao.explicacao;
|
|
40601
41216
|
if (explicacao.constructor && this.dicionarioConstrutos[explicacao.constructor.name]) {
|
|
40602
41217
|
mensagem = this.dicionarioConstrutos[explicacao.constructor.name](explicacao);
|
|
40603
41218
|
}
|
|
40604
41219
|
}
|
|
40605
41220
|
if (this.alvo === 'linux') {
|
|
40606
|
-
this.text += `
|
|
40607
|
-
; Falhar com mensagem: ${mensagem}
|
|
40608
|
-
mov eax, 1
|
|
40609
|
-
mov ebx, 1
|
|
41221
|
+
this.text += `
|
|
41222
|
+
; Falhar com mensagem: ${mensagem}
|
|
41223
|
+
mov eax, 1
|
|
41224
|
+
mov ebx, 1
|
|
40610
41225
|
int 0x80`;
|
|
40611
41226
|
}
|
|
40612
41227
|
else {
|
|
40613
|
-
this.text += `
|
|
40614
|
-
; Falhar com mensagem: ${mensagem}
|
|
40615
|
-
mov eax, 1
|
|
41228
|
+
this.text += `
|
|
41229
|
+
; Falhar com mensagem: ${mensagem}
|
|
41230
|
+
mov eax, 1
|
|
40616
41231
|
ret`;
|
|
40617
41232
|
}
|
|
40618
41233
|
}
|
|
40619
41234
|
traduzirDeclaracaoFuncao(declaracao) {
|
|
40620
41235
|
var _a;
|
|
40621
41236
|
const nomeFuncao = ((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'funcao';
|
|
40622
|
-
this.text += `
|
|
40623
|
-
${nomeFuncao}:
|
|
40624
|
-
push rbp
|
|
41237
|
+
this.text += `
|
|
41238
|
+
${nomeFuncao}:
|
|
41239
|
+
push rbp
|
|
40625
41240
|
mov rbp, rsp`;
|
|
40626
|
-
if (declaracao.funcao &&
|
|
41241
|
+
if (declaracao.funcao &&
|
|
41242
|
+
declaracao.funcao.corpo &&
|
|
41243
|
+
Array.isArray(declaracao.funcao.corpo)) {
|
|
40627
41244
|
declaracao.funcao.corpo.forEach((decl) => {
|
|
40628
41245
|
if (this.dicionarioDeclaracoes[decl.constructor.name]) {
|
|
40629
41246
|
this.dicionarioDeclaracoes[decl.constructor.name](decl);
|
|
40630
41247
|
}
|
|
40631
41248
|
});
|
|
40632
41249
|
}
|
|
40633
|
-
this.text += `
|
|
40634
|
-
pop rbp
|
|
41250
|
+
this.text += `
|
|
41251
|
+
pop rbp
|
|
40635
41252
|
ret`;
|
|
40636
41253
|
}
|
|
40637
41254
|
traduzirDeclaracaoImportar(declaracao) {
|
|
40638
41255
|
// Importação é tratada em tempo de linkagem
|
|
40639
|
-
this.text += `
|
|
41256
|
+
this.text += `
|
|
40640
41257
|
; Importar: ${declaracao.caminho || 'unknown'}`;
|
|
40641
41258
|
}
|
|
40642
41259
|
traduzirDeclaracaoLeia(declaracao) {
|
|
40643
41260
|
var _a;
|
|
40644
41261
|
let nomeVar;
|
|
40645
|
-
if (declaracao.argumentos &&
|
|
41262
|
+
if (declaracao.argumentos &&
|
|
41263
|
+
declaracao.argumentos[0] &&
|
|
41264
|
+
declaracao.argumentos[0] instanceof construtos_1.Variavel) {
|
|
40646
41265
|
nomeVar = (_a = declaracao.argumentos[0].simbolo) === null || _a === void 0 ? void 0 : _a.lexema;
|
|
40647
41266
|
}
|
|
40648
41267
|
if (!nomeVar)
|
|
@@ -40652,11 +41271,11 @@ ${nomeFuncao}:
|
|
|
40652
41271
|
this.bss += ` ${varLabel} resb 256\n`;
|
|
40653
41272
|
this.variaveis.set(nomeVar, varLabel);
|
|
40654
41273
|
}
|
|
40655
|
-
this.text += `
|
|
40656
|
-
mov eax, 3
|
|
40657
|
-
mov ebx, 0
|
|
40658
|
-
mov ecx, ${this.variaveis.get(nomeVar)}
|
|
40659
|
-
mov edx, 256
|
|
41274
|
+
this.text += `
|
|
41275
|
+
mov eax, 3
|
|
41276
|
+
mov ebx, 0
|
|
41277
|
+
mov ecx, ${this.variaveis.get(nomeVar)}
|
|
41278
|
+
mov edx, 256
|
|
40660
41279
|
int 0x80`;
|
|
40661
41280
|
}
|
|
40662
41281
|
traduzirDeclaracaoPara(declaracao) {
|
|
@@ -40672,12 +41291,12 @@ ${nomeFuncao}:
|
|
|
40672
41291
|
this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
|
|
40673
41292
|
}
|
|
40674
41293
|
}
|
|
40675
|
-
this.text += `
|
|
41294
|
+
this.text += `
|
|
40676
41295
|
${labelInicio}:`;
|
|
40677
41296
|
if (declaracao.condicao) {
|
|
40678
41297
|
const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
|
|
40679
|
-
this.text += `
|
|
40680
|
-
cmp ${condicao}, 0
|
|
41298
|
+
this.text += `
|
|
41299
|
+
cmp ${condicao}, 0
|
|
40681
41300
|
je ${labelFim}`;
|
|
40682
41301
|
}
|
|
40683
41302
|
if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
|
|
@@ -40688,8 +41307,8 @@ ${labelInicio}:`;
|
|
|
40688
41307
|
this.dicionarioConstrutos[declaracao.incrementar.constructor.name](declaracao.incrementar);
|
|
40689
41308
|
}
|
|
40690
41309
|
}
|
|
40691
|
-
this.text += `
|
|
40692
|
-
jmp ${labelInicio}
|
|
41310
|
+
this.text += `
|
|
41311
|
+
jmp ${labelInicio}
|
|
40693
41312
|
${labelFim}:`;
|
|
40694
41313
|
}
|
|
40695
41314
|
traduzirDeclaracaoParaCada(declaracao) {
|
|
@@ -40705,57 +41324,58 @@ ${labelFim}:`;
|
|
|
40705
41324
|
if (vetor instanceof construtos_1.Vetor) {
|
|
40706
41325
|
tamanhoVetor = vetor.tamanho || 0;
|
|
40707
41326
|
}
|
|
40708
|
-
this.text += `
|
|
40709
|
-
xor rcx, rcx
|
|
40710
|
-
${labelInicio}:
|
|
40711
|
-
cmp rcx, ${tamanhoVetor}
|
|
41327
|
+
this.text += `
|
|
41328
|
+
xor rcx, rcx
|
|
41329
|
+
${labelInicio}:
|
|
41330
|
+
cmp rcx, ${tamanhoVetor}
|
|
40712
41331
|
jge ${labelFim}`;
|
|
40713
41332
|
if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
|
|
40714
41333
|
this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
|
|
40715
41334
|
}
|
|
40716
|
-
this.text += `
|
|
40717
|
-
inc rcx
|
|
40718
|
-
jmp ${labelInicio}
|
|
41335
|
+
this.text += `
|
|
41336
|
+
inc rcx
|
|
41337
|
+
jmp ${labelInicio}
|
|
40719
41338
|
${labelFim}:`;
|
|
40720
41339
|
}
|
|
40721
41340
|
traduzirDeclaracaoRetorna(declaracao) {
|
|
40722
41341
|
if (declaracao.valor) {
|
|
40723
41342
|
const valor = this.dicionarioConstrutos[declaracao.valor.constructor.name](declaracao.valor);
|
|
40724
|
-
this.text += `
|
|
41343
|
+
this.text += `
|
|
40725
41344
|
mov rax, ${valor}`;
|
|
40726
41345
|
}
|
|
40727
|
-
this.text += `
|
|
40728
|
-
pop rbp
|
|
41346
|
+
this.text += `
|
|
41347
|
+
pop rbp
|
|
40729
41348
|
ret`;
|
|
40730
41349
|
}
|
|
40731
41350
|
traduzirDeclaracaoSe(declaracao) {
|
|
40732
41351
|
const labelSenao = this.gerarLabel();
|
|
40733
41352
|
const labelFim = this.gerarLabel();
|
|
40734
41353
|
const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
|
|
40735
|
-
this.text += `
|
|
40736
|
-
cmp ${condicao}, 0
|
|
41354
|
+
this.text += `
|
|
41355
|
+
cmp ${condicao}, 0
|
|
40737
41356
|
je ${labelSenao}`;
|
|
40738
41357
|
if (this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name]) {
|
|
40739
41358
|
this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name](declaracao.caminhoEntao);
|
|
40740
41359
|
}
|
|
40741
|
-
this.text += `
|
|
40742
|
-
jmp ${labelFim}
|
|
41360
|
+
this.text += `
|
|
41361
|
+
jmp ${labelFim}
|
|
40743
41362
|
${labelSenao}:`;
|
|
40744
|
-
if (declaracao.caminhoSenao &&
|
|
41363
|
+
if (declaracao.caminhoSenao &&
|
|
41364
|
+
this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name]) {
|
|
40745
41365
|
this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name](declaracao.caminhoSenao);
|
|
40746
41366
|
}
|
|
40747
|
-
this.text += `
|
|
41367
|
+
this.text += `
|
|
40748
41368
|
${labelFim}:`;
|
|
40749
41369
|
}
|
|
40750
41370
|
traduzirDeclaracaoClasse(declaracao) {
|
|
40751
41371
|
var _a;
|
|
40752
41372
|
// Classes em assembly são complexas - implementação básica
|
|
40753
|
-
this.text += `
|
|
41373
|
+
this.text += `
|
|
40754
41374
|
; Classe: ${((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'unknown'}`;
|
|
40755
41375
|
}
|
|
40756
41376
|
traduzirDeclaracaoTente(declaracao) {
|
|
40757
41377
|
// Try-catch em assembly requer handler complexo
|
|
40758
|
-
this.text += `
|
|
41378
|
+
this.text += `
|
|
40759
41379
|
; Tente-pegue`;
|
|
40760
41380
|
if (declaracao.caminhoTente && Array.isArray(declaracao.caminhoTente)) {
|
|
40761
41381
|
declaracao.caminhoTente.forEach((decl) => {
|
|
@@ -40794,8 +41414,8 @@ ${labelFim}:`;
|
|
|
40794
41414
|
}
|
|
40795
41415
|
else if (this.dicionarioConstrutos[tipoInicializador]) {
|
|
40796
41416
|
const valor = this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
|
|
40797
|
-
this.text += `
|
|
40798
|
-
mov rax, ${valor}
|
|
41417
|
+
this.text += `
|
|
41418
|
+
mov rax, ${valor}
|
|
40799
41419
|
mov [${varLabel}], rax`;
|
|
40800
41420
|
}
|
|
40801
41421
|
}
|
|
@@ -40818,32 +41438,32 @@ ${labelFim}:`;
|
|
|
40818
41438
|
tam_string_literal = this.criaTamanhoNaMemoriaReferenteAVar(nome_string_literal);
|
|
40819
41439
|
}
|
|
40820
41440
|
if (this.alvo === 'linux') {
|
|
40821
|
-
this.text += `
|
|
40822
|
-
mov edx, ${tam_string_literal}
|
|
40823
|
-
mov ecx, ${nome_string_literal}
|
|
40824
|
-
mov ebx, 1 ; fd stdout
|
|
40825
|
-
mov eax, 4 ; sys_write
|
|
41441
|
+
this.text += `
|
|
41442
|
+
mov edx, ${tam_string_literal}
|
|
41443
|
+
mov ecx, ${nome_string_literal}
|
|
41444
|
+
mov ebx, 1 ; fd stdout
|
|
41445
|
+
mov eax, 4 ; sys_write
|
|
40826
41446
|
int 0x80`;
|
|
40827
41447
|
}
|
|
40828
41448
|
else {
|
|
40829
41449
|
// Windows: prototype `extern printf` and follow Win64 calling convention
|
|
40830
41450
|
// RCX = format pointer; here we use the literal directly as a C string
|
|
40831
|
-
this.text += `
|
|
40832
|
-
lea rcx, [rel ${nome_string_literal}]
|
|
41451
|
+
this.text += `
|
|
41452
|
+
lea rcx, [rel ${nome_string_literal}]
|
|
40833
41453
|
call printf`;
|
|
40834
41454
|
}
|
|
40835
41455
|
}
|
|
40836
41456
|
saidaSistema() {
|
|
40837
41457
|
if (this.alvo === 'linux') {
|
|
40838
|
-
this.text += `
|
|
40839
|
-
mov eax, 1 ; sys_exit
|
|
40840
|
-
xor ebx, ebx ; status 0
|
|
41458
|
+
this.text += `
|
|
41459
|
+
mov eax, 1 ; sys_exit
|
|
41460
|
+
xor ebx, ebx ; status 0
|
|
40841
41461
|
int 0x80`;
|
|
40842
41462
|
}
|
|
40843
41463
|
else {
|
|
40844
41464
|
// Windows: return from main with 0 in EAX
|
|
40845
|
-
this.text += `
|
|
40846
|
-
xor eax, eax
|
|
41465
|
+
this.text += `
|
|
41466
|
+
xor eax, eax
|
|
40847
41467
|
ret`;
|
|
40848
41468
|
}
|
|
40849
41469
|
}
|
|
@@ -41311,7 +41931,7 @@ class TradutorAssemblyScript {
|
|
|
41311
41931
|
return resultado;
|
|
41312
41932
|
}
|
|
41313
41933
|
traduzirDeclaracaoVarMultiplo(declaracaoVarMultiplo) {
|
|
41314
|
-
const variaveis = declaracaoVarMultiplo.simbolos.map(s => s.lexema).join(', ');
|
|
41934
|
+
const variaveis = declaracaoVarMultiplo.simbolos.map((s) => s.lexema).join(', ');
|
|
41315
41935
|
let resultado = 'let ';
|
|
41316
41936
|
resultado += variaveis;
|
|
41317
41937
|
resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoVarMultiplo.tipo);
|
|
@@ -41330,7 +41950,7 @@ class TradutorAssemblyScript {
|
|
|
41330
41950
|
return resultado;
|
|
41331
41951
|
}
|
|
41332
41952
|
traduzirDeclaracaoConstMultiplo(declaracaoConstMultiplo) {
|
|
41333
|
-
const constantes = declaracaoConstMultiplo.simbolos.map(s => s.lexema).join(', ');
|
|
41953
|
+
const constantes = declaracaoConstMultiplo.simbolos.map((s) => s.lexema).join(', ');
|
|
41334
41954
|
let resultado = 'const ';
|
|
41335
41955
|
resultado += constantes;
|
|
41336
41956
|
resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoConstMultiplo.tipo);
|
|
@@ -41485,7 +42105,9 @@ class TradutorAssemblyScript {
|
|
|
41485
42105
|
const declaracoesCorpo = corpoBloco.declaracoes || [];
|
|
41486
42106
|
let resultadoCorpo = '{\n';
|
|
41487
42107
|
this.indentacao += 4;
|
|
41488
|
-
resultadoCorpo +=
|
|
42108
|
+
resultadoCorpo +=
|
|
42109
|
+
' '.repeat(this.indentacao) +
|
|
42110
|
+
`const ${nomeVariavel} = ${nomeVetor}[__i_${nomeVariavel}];\n`;
|
|
41489
42111
|
for (const declaracaoOuConstruto of declaracoesCorpo) {
|
|
41490
42112
|
resultadoCorpo += ' '.repeat(this.indentacao);
|
|
41491
42113
|
const nomeConstrutor = declaracaoOuConstruto.constructor.name;
|
|
@@ -41706,7 +42328,9 @@ class TradutorAssemblyScript {
|
|
|
41706
42328
|
if (typeof chave === 'string') {
|
|
41707
42329
|
chaveStr = `"${chave}"`;
|
|
41708
42330
|
}
|
|
41709
|
-
else if (chave &&
|
|
42331
|
+
else if (chave &&
|
|
42332
|
+
chave.constructor &&
|
|
42333
|
+
this.dicionarioConstrutos[chave.constructor.name]) {
|
|
41710
42334
|
// Se for um Construto, traduzi-lo
|
|
41711
42335
|
chaveStr = this.dicionarioConstrutos[chave.constructor.name](chave);
|
|
41712
42336
|
}
|
|
@@ -41801,7 +42425,7 @@ class TradutorAssemblyScript {
|
|
|
41801
42425
|
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}, ${decimo}]`;
|
|
41802
42426
|
}
|
|
41803
42427
|
traduzirConstrutoTuplaN(tuplaN) {
|
|
41804
|
-
const elementos = tuplaN.elementos.map(elemento => this.dicionarioConstrutos[elemento.constructor.name](elemento));
|
|
42428
|
+
const elementos = tuplaN.elementos.map((elemento) => this.dicionarioConstrutos[elemento.constructor.name](elemento));
|
|
41805
42429
|
return `[${elementos.join(', ')}]`;
|
|
41806
42430
|
}
|
|
41807
42431
|
traduzirConstrutoSeTernario(seTernario) {
|
|
@@ -41880,7 +42504,7 @@ class TradutorAssemblyScript {
|
|
|
41880
42504
|
// Check if this is a native library function call
|
|
41881
42505
|
if (chamada.entidadeChamada instanceof construtos_1.Variavel) {
|
|
41882
42506
|
const nomeVariavel = chamada.entidadeChamada.simbolo.lexema;
|
|
41883
|
-
const argumentosTexto = chamada.argumentos.map(arg => this.dicionarioConstrutos[arg.constructor.name](arg));
|
|
42507
|
+
const argumentosTexto = chamada.argumentos.map((arg) => this.dicionarioConstrutos[arg.constructor.name](arg));
|
|
41884
42508
|
const funcaoNativa = this.traduzirFuncaoNativaGlobal(nomeVariavel, argumentosTexto);
|
|
41885
42509
|
if (funcaoNativa) {
|
|
41886
42510
|
return funcaoNativa;
|
|
@@ -42227,7 +42851,7 @@ class TradutorElixir {
|
|
|
42227
42851
|
async extrairCamposStruct(declaracao) {
|
|
42228
42852
|
const campos = new Set();
|
|
42229
42853
|
// Procurar pelo construtor
|
|
42230
|
-
const construtor = declaracao.metodos.find(m => m.simbolo.lexema === 'construtor' || m.simbolo.lexema === 'inicializar');
|
|
42854
|
+
const construtor = declaracao.metodos.find((m) => m.simbolo.lexema === 'construtor' || m.simbolo.lexema === 'inicializar');
|
|
42231
42855
|
if (!construtor) {
|
|
42232
42856
|
return [];
|
|
42233
42857
|
}
|
|
@@ -42236,7 +42860,7 @@ class TradutorElixir {
|
|
|
42236
42860
|
this.extrairCamposDeDeclaracao(declaracaoCorpo, campos);
|
|
42237
42861
|
}
|
|
42238
42862
|
// Converter para atoms do Elixir
|
|
42239
|
-
return Array.from(campos).map(c => `:${this.converterIdentificador(c)}`);
|
|
42863
|
+
return Array.from(campos).map((c) => `:${this.converterIdentificador(c)}`);
|
|
42240
42864
|
}
|
|
42241
42865
|
/**
|
|
42242
42866
|
* Extrai campos de uma declaração recursivamente
|
|
@@ -42278,7 +42902,7 @@ class TradutorElixir {
|
|
|
42278
42902
|
// Construtor vira função new/N
|
|
42279
42903
|
if (metodo.simbolo.lexema === 'construtor' || metodo.simbolo.lexema === 'inicializar') {
|
|
42280
42904
|
resultado += `def new(`;
|
|
42281
|
-
const parametros = metodo.funcao.parametros.map(p => this.converterIdentificador(p.nome.lexema));
|
|
42905
|
+
const parametros = metodo.funcao.parametros.map((p) => this.converterIdentificador(p.nome.lexema));
|
|
42282
42906
|
resultado += parametros.join(', ');
|
|
42283
42907
|
resultado += ') do\n';
|
|
42284
42908
|
this.aumentarIndentacao();
|
|
@@ -42296,7 +42920,7 @@ class TradutorElixir {
|
|
|
42296
42920
|
resultado += `def ${nomeMetodo}(`;
|
|
42297
42921
|
const nomeParametroStruct = this.converterIdentificador(nomeModulo.toLowerCase());
|
|
42298
42922
|
this.nomeParametroStruct = nomeParametroStruct;
|
|
42299
|
-
const parametros = [nomeParametroStruct].concat(metodo.funcao.parametros.map(p => this.converterIdentificador(p.nome.lexema)));
|
|
42923
|
+
const parametros = [nomeParametroStruct].concat(metodo.funcao.parametros.map((p) => this.converterIdentificador(p.nome.lexema)));
|
|
42300
42924
|
resultado += parametros.join(', ');
|
|
42301
42925
|
resultado += ') do\n';
|
|
42302
42926
|
this.aumentarIndentacao();
|
|
@@ -42386,7 +43010,7 @@ class TradutorElixir {
|
|
|
42386
43010
|
let resultado = this.adicionarIndentacao();
|
|
42387
43011
|
resultado += `def ${nomeFuncao}(`;
|
|
42388
43012
|
// Parâmetros
|
|
42389
|
-
const parametros = declaracao.funcao.parametros.map(p => this.converterIdentificador(p.nome.lexema));
|
|
43013
|
+
const parametros = declaracao.funcao.parametros.map((p) => this.converterIdentificador(p.nome.lexema));
|
|
42390
43014
|
resultado += parametros.join(', ');
|
|
42391
43015
|
resultado += ') do\n';
|
|
42392
43016
|
// Corpo
|
|
@@ -42663,7 +43287,9 @@ class TradutorElixir {
|
|
|
42663
43287
|
case 'ordenar':
|
|
42664
43288
|
return `Enum.sort(${objeto})`;
|
|
42665
43289
|
case 'juntar':
|
|
42666
|
-
return argumentos.length > 0
|
|
43290
|
+
return argumentos.length > 0
|
|
43291
|
+
? `Enum.join(${objeto}, ${argumentos[0]})`
|
|
43292
|
+
: `Enum.join(${objeto})`;
|
|
42667
43293
|
case 'fatiar':
|
|
42668
43294
|
if (argumentos.length >= 2) {
|
|
42669
43295
|
return `Enum.slice(${objeto}, ${argumentos[0]}, ${argumentos[1]})`;
|
|
@@ -42802,7 +43428,7 @@ class TradutorElixir {
|
|
|
42802
43428
|
async visitarExpressaoFuncaoConstruto(expressao) {
|
|
42803
43429
|
let resultado = 'fn ';
|
|
42804
43430
|
// Parâmetros
|
|
42805
|
-
const parametros = expressao.parametros.map(p => this.converterIdentificador(p.nome.lexema));
|
|
43431
|
+
const parametros = expressao.parametros.map((p) => this.converterIdentificador(p.nome.lexema));
|
|
42806
43432
|
resultado += parametros.join(', ');
|
|
42807
43433
|
resultado += ' ->';
|
|
42808
43434
|
// Corpo - se for uma única expressão, inline; se for bloco, multi-linha
|
|
@@ -43568,7 +44194,8 @@ class TradutorJavaScript {
|
|
|
43568
44194
|
if (argumento instanceof construtos_1.Variavel) {
|
|
43569
44195
|
return argumento.simbolo.lexema;
|
|
43570
44196
|
}
|
|
43571
|
-
if (argumento instanceof construtos_1.ReferenciaFuncao ||
|
|
44197
|
+
if (argumento instanceof construtos_1.ReferenciaFuncao ||
|
|
44198
|
+
argumento instanceof construtos_1.ArgumentoReferenciaFuncao) {
|
|
43572
44199
|
return argumento.simboloFuncao.lexema;
|
|
43573
44200
|
}
|
|
43574
44201
|
return (_c = (_b = (_a = this.dicionarioConstrutos)[argumento.constructor.name]) === null || _b === void 0 ? void 0 : _b.call(_a, argumento)) !== null && _c !== void 0 ? _c : '';
|
|
@@ -43809,7 +44436,7 @@ class TradutorMermaidJs {
|
|
|
43809
44436
|
var _a, _b;
|
|
43810
44437
|
const nomeClasse = declaracao.simbolo.lexema;
|
|
43811
44438
|
const superClasse = declaracao.superClasse
|
|
43812
|
-
? ((
|
|
44439
|
+
? ((_a = declaracao.superClasse.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || ((_b = declaracao.superClasse.nome) === null || _b === void 0 ? void 0 : _b.lexema)
|
|
43813
44440
|
: undefined;
|
|
43814
44441
|
const linha = declaracao.linha;
|
|
43815
44442
|
// Cria arestas de entrada e saída para a classe
|
|
@@ -44070,9 +44697,7 @@ class TradutorMermaidJs {
|
|
|
44070
44697
|
// Caminho então, normalmente um `Bloco`.
|
|
44071
44698
|
const verticesEntao = await declaracao.caminhoEntao.aceitar(this);
|
|
44072
44699
|
vertices = vertices.concat(verticesEntao);
|
|
44073
|
-
const ultimaArestaEntao = verticesEntao.length > 0
|
|
44074
|
-
? verticesEntao[verticesEntao.length - 1].destino
|
|
44075
|
-
: aresta;
|
|
44700
|
+
const ultimaArestaEntao = verticesEntao.length > 0 ? verticesEntao[verticesEntao.length - 1].destino : aresta;
|
|
44076
44701
|
if (declaracao.caminhoSenao) {
|
|
44077
44702
|
this.anteriores = [];
|
|
44078
44703
|
// Verifica se é "senão se" ou apenas "senão"
|
|
@@ -44120,9 +44745,7 @@ class TradutorMermaidJs {
|
|
|
44120
44745
|
verticesTente.push(...verticesDeclaracao);
|
|
44121
44746
|
}
|
|
44122
44747
|
vertices = vertices.concat(verticesTente);
|
|
44123
|
-
const ultimaArestaTente = verticesTente.length > 0
|
|
44124
|
-
? verticesTente[verticesTente.length - 1].destino
|
|
44125
|
-
: aresta;
|
|
44748
|
+
const ultimaArestaTente = verticesTente.length > 0 ? verticesTente[verticesTente.length - 1].destino : aresta;
|
|
44126
44749
|
const anterioresAposTente = [];
|
|
44127
44750
|
// Caminho pegue (catch) - se existir
|
|
44128
44751
|
if (declaracao.caminhoPegue) {
|
|
@@ -44308,7 +44931,7 @@ class TradutorMermaidJs {
|
|
|
44308
44931
|
async visitarExpressaoFuncaoConstruto(expressao) {
|
|
44309
44932
|
let texto = 'função anônima';
|
|
44310
44933
|
if (expressao.parametros && expressao.parametros.length > 0) {
|
|
44311
|
-
const parametros = expressao.parametros.map(p => p.nome.lexema).join(', ');
|
|
44934
|
+
const parametros = expressao.parametros.map((p) => p.nome.lexema).join(', ');
|
|
44312
44935
|
texto += `(${parametros})`;
|
|
44313
44936
|
}
|
|
44314
44937
|
else {
|
|
@@ -44850,7 +45473,7 @@ class TradutorPython {
|
|
|
44850
45473
|
}
|
|
44851
45474
|
const funcao = argumento;
|
|
44852
45475
|
// Extrai os nomes dos parâmetros
|
|
44853
|
-
const parametros = funcao.parametros.map(param => param.nome.lexema).join(', ');
|
|
45476
|
+
const parametros = funcao.parametros.map((param) => param.nome.lexema).join(', ');
|
|
44854
45477
|
// Python lambdas suportam apenas uma expressão
|
|
44855
45478
|
// Assumimos que a função tem um corpo simples com uma declaração de retorno
|
|
44856
45479
|
let expressao = '';
|
|
@@ -46595,7 +47218,7 @@ class TradutorRuby {
|
|
|
46595
47218
|
}
|
|
46596
47219
|
const funcao = argumento;
|
|
46597
47220
|
// Extrai os nomes dos parâmetros
|
|
46598
|
-
const parametros = funcao.parametros.map(param => param.nome.lexema).join(', ');
|
|
47221
|
+
const parametros = funcao.parametros.map((param) => param.nome.lexema).join(', ');
|
|
46599
47222
|
// Assumimos que a função tem um corpo simples com uma declaração de retorno
|
|
46600
47223
|
let expressao = '';
|
|
46601
47224
|
if (funcao.corpo.length > 0) {
|