@designliquido/delegua 0.38.4 → 0.39.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 +4 -2
- package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico-base.js +7 -1
- package/analisador-semantico/analisador-semantico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js +2 -4
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +7 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +250 -95
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +2 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +2 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.js +2 -2
- package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts +2 -3
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +10 -4
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.d.ts +2 -3
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js +10 -4
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts +2 -14
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +56 -17
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts +2 -22
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +115 -67
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/acesso-metodo-ou-propriedade.d.ts +3 -1
- package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
- package/construtos/acesso-metodo-ou-propriedade.js +4 -2
- package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
- package/construtos/acesso-metodo.d.ts +12 -0
- package/construtos/acesso-metodo.d.ts.map +1 -0
- package/construtos/acesso-metodo.js +18 -0
- package/construtos/acesso-metodo.js.map +1 -0
- package/construtos/acesso-propriedade.d.ts +12 -0
- package/construtos/acesso-propriedade.d.ts.map +1 -0
- package/construtos/acesso-propriedade.js +17 -0
- package/construtos/acesso-propriedade.js.map +1 -0
- package/construtos/chamada.d.ts +1 -2
- package/construtos/chamada.d.ts.map +1 -1
- package/construtos/chamada.js +1 -2
- package/construtos/chamada.js.map +1 -1
- package/construtos/componente-linguagem.d.ts +15 -0
- package/construtos/componente-linguagem.d.ts.map +1 -0
- package/construtos/componente-linguagem.js +19 -0
- package/construtos/componente-linguagem.js.map +1 -0
- package/construtos/dicionario.d.ts +1 -0
- package/construtos/dicionario.d.ts.map +1 -1
- package/construtos/dicionario.js +1 -0
- package/construtos/dicionario.js.map +1 -1
- package/construtos/index.d.ts +4 -1
- package/construtos/index.d.ts.map +1 -1
- package/construtos/index.js +4 -1
- package/construtos/index.js.map +1 -1
- package/construtos/tipo-de.d.ts +6 -2
- package/construtos/tipo-de.d.ts.map +1 -1
- package/construtos/tipo-de.js +4 -0
- package/construtos/tipo-de.js.map +1 -1
- package/estruturas/objeto-delegua-classe.d.ts +2 -0
- package/estruturas/objeto-delegua-classe.d.ts.map +1 -1
- package/estruturas/objeto-delegua-classe.js +12 -0
- package/estruturas/objeto-delegua-classe.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts +4 -2
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +12 -2
- package/formatadores/formatador-delegua.js.map +1 -1
- package/interfaces/index.d.ts +1 -0
- package/interfaces/index.d.ts.map +1 -1
- package/interfaces/index.js +1 -0
- package/interfaces/index.js.map +1 -1
- package/interfaces/primitiva-interface.d.ts +5 -0
- package/interfaces/primitiva-interface.d.ts.map +1 -0
- package/interfaces/primitiva-interface.js +3 -0
- package/interfaces/primitiva-interface.js.map +1 -0
- package/interfaces/visitante-comum-interface.d.ts +4 -2
- package/interfaces/visitante-comum-interface.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +4 -2
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +7 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +4 -2
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +7 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +4 -2
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +7 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/index.d.ts +1 -0
- package/interpretador/index.d.ts.map +1 -1
- package/interpretador/index.js +1 -0
- package/interpretador/index.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +4 -2
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +35 -26
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +11 -0
- package/interpretador/interpretador.d.ts.map +1 -0
- package/interpretador/interpretador.js +208 -0
- package/interpretador/interpretador.js.map +1 -0
- package/lexador/micro-lexador.d.ts.map +1 -1
- package/lexador/micro-lexador.js +4 -0
- package/lexador/micro-lexador.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-javascript.d.ts +8 -2
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +40 -3
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-python.d.ts +5 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +37 -2
- package/tradutores/tradutor-python.js.map +1 -1
- package/umd/delegua.js +1254 -614
|
@@ -5,8 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AvaliadorSintatico = void 0;
|
|
7
7
|
const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
|
|
8
|
-
const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
|
|
9
|
-
const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
10
8
|
const construtos_1 = require("../construtos");
|
|
11
9
|
const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
|
|
12
10
|
const tuplas_1 = require("../construtos/tuplas");
|
|
@@ -16,6 +14,12 @@ const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
|
|
|
16
14
|
const inferenciador_1 = require("../inferenciador");
|
|
17
15
|
const pilha_escopos_1 = require("./pilha-escopos");
|
|
18
16
|
const informacao_escopo_1 = require("./informacao-escopo");
|
|
17
|
+
const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
|
|
18
|
+
const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
19
|
+
const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
|
|
20
|
+
const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
|
|
21
|
+
const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
|
|
22
|
+
const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
|
|
19
23
|
/**
|
|
20
24
|
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
21
25
|
* Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
|
|
@@ -61,28 +65,72 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
61
65
|
}
|
|
62
66
|
return tipoElementarResolvido;
|
|
63
67
|
}
|
|
68
|
+
obterChaveDicionario() {
|
|
69
|
+
switch (this.simbolos[this.atual].tipo) {
|
|
70
|
+
case delegua_2.default.NUMERO:
|
|
71
|
+
case delegua_2.default.TEXTO:
|
|
72
|
+
case delegua_2.default.FALSO:
|
|
73
|
+
case delegua_2.default.VERDADEIRO:
|
|
74
|
+
return this.primario();
|
|
75
|
+
case delegua_2.default.IDENTIFICADOR:
|
|
76
|
+
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
77
|
+
let tipoOperando;
|
|
78
|
+
if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
|
|
79
|
+
tipoOperando = simboloIdentificador.lexema;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
tipoOperando = this.pilhaEscopos.obterTipoVariavelPorNome(simboloIdentificador.lexema);
|
|
83
|
+
}
|
|
84
|
+
if (!['numero', 'número', 'texto', 'lógico'].includes(tipoOperando)) {
|
|
85
|
+
throw this.erro(simboloIdentificador, `Tipo ${tipoOperando} de identificador ${simboloIdentificador.lexema} não é válido como chave de dicionário.`);
|
|
86
|
+
}
|
|
87
|
+
return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
|
|
88
|
+
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
89
|
+
this.avancarEDevolverAnterior();
|
|
90
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
91
|
+
return this.construtoTupla();
|
|
92
|
+
}
|
|
93
|
+
throw this.erro(this.simbolos[this.atual], `Esperado parêntese esquerdo após colchete esquerdo para definição de chave de dicionário. Atual: ${this.simbolos[this.atual].tipo}.`);
|
|
94
|
+
default:
|
|
95
|
+
throw this.erro(this.simbolos[this.atual], `Símbolo ${this.simbolos[this.atual].tipo} inesperado ou inválido como chave de dicionário.`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
construtoDicionario(simboloChaveEsquerda) {
|
|
99
|
+
this.avancarEDevolverAnterior();
|
|
100
|
+
const chaves = [];
|
|
101
|
+
const valores = [];
|
|
102
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
103
|
+
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), [], []);
|
|
104
|
+
}
|
|
105
|
+
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
106
|
+
const chave = this.obterChaveDicionario();
|
|
107
|
+
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
108
|
+
const valor = this.atribuir();
|
|
109
|
+
chaves.push(chave);
|
|
110
|
+
valores.push(valor);
|
|
111
|
+
if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
|
|
112
|
+
this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), chaves, valores);
|
|
116
|
+
}
|
|
117
|
+
construtoTupla() {
|
|
118
|
+
const expressao = this.expressao();
|
|
119
|
+
const argumentos = [expressao];
|
|
120
|
+
while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
|
|
121
|
+
this.avancarEDevolverAnterior();
|
|
122
|
+
argumentos.push(this.expressao());
|
|
123
|
+
}
|
|
124
|
+
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
125
|
+
this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
|
|
126
|
+
return new tuplas_1.SeletorTuplas(...argumentos);
|
|
127
|
+
}
|
|
64
128
|
primario() {
|
|
65
129
|
const simboloAtual = this.simbolos[this.atual];
|
|
66
130
|
let valores = [];
|
|
67
131
|
switch (simboloAtual.tipo) {
|
|
68
132
|
case delegua_2.default.CHAVE_ESQUERDA:
|
|
69
|
-
this.
|
|
70
|
-
const chaves = [];
|
|
71
|
-
valores = [];
|
|
72
|
-
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
73
|
-
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
|
|
74
|
-
}
|
|
75
|
-
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
76
|
-
const chave = this.atribuir();
|
|
77
|
-
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
78
|
-
const valor = this.atribuir();
|
|
79
|
-
chaves.push(chave);
|
|
80
|
-
valores.push(valor);
|
|
81
|
-
if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
|
|
82
|
-
this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
|
|
133
|
+
return this.construtoDicionario(simboloAtual);
|
|
86
134
|
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
87
135
|
this.avancarEDevolverAnterior();
|
|
88
136
|
valores = [];
|
|
@@ -90,19 +138,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
90
138
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), [], 0, 'qualquer');
|
|
91
139
|
}
|
|
92
140
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
|
|
93
|
-
let valor = null;
|
|
94
141
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
95
|
-
|
|
96
|
-
const argumentos = [expressao];
|
|
97
|
-
while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
|
|
98
|
-
this.avancarEDevolverAnterior();
|
|
99
|
-
argumentos.push(this.expressao());
|
|
100
|
-
}
|
|
101
|
-
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
102
|
-
this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
|
|
103
|
-
return new tuplas_1.SeletorTuplas(...argumentos);
|
|
142
|
+
return this.construtoTupla();
|
|
104
143
|
}
|
|
105
|
-
valor = this.atribuir();
|
|
144
|
+
const valor = this.atribuir();
|
|
106
145
|
valores.push(valor);
|
|
107
146
|
if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
|
|
108
147
|
this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
@@ -143,7 +182,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
143
182
|
return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
|
|
144
183
|
case delegua_2.default.NULO:
|
|
145
184
|
this.avancarEDevolverAnterior();
|
|
146
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null);
|
|
185
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
|
|
147
186
|
case delegua_2.default.NUMERO:
|
|
148
187
|
case delegua_2.default.TEXTO:
|
|
149
188
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
@@ -175,14 +214,67 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
175
214
|
case delegua_2.default.TIPO:
|
|
176
215
|
this.avancarEDevolverAnterior();
|
|
177
216
|
this.consumir(delegua_2.default.DE, "Esperado 'de' após 'tipo'.");
|
|
178
|
-
let
|
|
217
|
+
let construto;
|
|
179
218
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESCREVA, delegua_2.default.LEIA, delegua_2.default.FUNCAO, delegua_2.default.FUNÇÃO, delegua_2.default.SE, delegua_2.default.ENQUANTO, delegua_2.default.PARA, delegua_2.default.RETORNA, delegua_1.default.INTEIRO, delegua_1.default.TEXTO, delegua_1.default.VETOR, delegua_1.default.LOGICO, delegua_1.default.LÓGICO, delegua_1.default.VAZIO)) {
|
|
180
|
-
|
|
219
|
+
construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
|
|
181
220
|
}
|
|
182
221
|
else {
|
|
183
|
-
|
|
222
|
+
construto = this.expressao();
|
|
223
|
+
}
|
|
224
|
+
if (construto.constructor.name === 'AcessoMetodoOuPropriedade') {
|
|
225
|
+
const construtoTipado = construto;
|
|
226
|
+
switch (construtoTipado.tipo) {
|
|
227
|
+
case delegua_1.default.DICIONARIO:
|
|
228
|
+
case delegua_1.default.DICIONÁRIO:
|
|
229
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_dicionario_1.default)) {
|
|
230
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de dicionário.`);
|
|
231
|
+
}
|
|
232
|
+
const primitivaDicionarioSelecionada = primitivas_dicionario_1.default[construtoTipado.simbolo.lexema];
|
|
233
|
+
construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaDicionarioSelecionada.tipoRetorno);
|
|
234
|
+
break;
|
|
235
|
+
case delegua_1.default.INTEIRO:
|
|
236
|
+
case delegua_1.default.NUMERO:
|
|
237
|
+
case delegua_1.default.NÚMERO:
|
|
238
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_numero_1.default)) {
|
|
239
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de número.`);
|
|
240
|
+
}
|
|
241
|
+
const primitivaNumeroSelecionada = primitivas_numero_1.default[construtoTipado.simbolo.lexema];
|
|
242
|
+
construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
|
|
243
|
+
break;
|
|
244
|
+
case delegua_1.default.TEXTO:
|
|
245
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_texto_1.default)) {
|
|
246
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de texto.`);
|
|
247
|
+
}
|
|
248
|
+
const primitivaTextoSelecionada = primitivas_texto_1.default[construtoTipado.simbolo.lexema];
|
|
249
|
+
construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
|
|
250
|
+
break;
|
|
251
|
+
case delegua_1.default.VETOR:
|
|
252
|
+
case delegua_1.default.VETOR_NUMERO:
|
|
253
|
+
case delegua_1.default.VETOR_NÚMERO:
|
|
254
|
+
case delegua_1.default.VETOR_TEXTO:
|
|
255
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_vetor_1.default)) {
|
|
256
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de vetor.`);
|
|
257
|
+
}
|
|
258
|
+
const primitivaVetorSelecionada = primitivas_vetor_1.default[construtoTipado.simbolo.lexema];
|
|
259
|
+
construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
if (construtoTipado.tipo in this.tiposDefinidosEmCodigo) {
|
|
263
|
+
const tipoCorrespondente = this.tiposDefinidosEmCodigo[construtoTipado.tipo];
|
|
264
|
+
const possivelMetodo = tipoCorrespondente.metodos.filter(m => m.simbolo.lexema === construtoTipado.simbolo.lexema);
|
|
265
|
+
if (possivelMetodo.length > 0) {
|
|
266
|
+
construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, possivelMetodo[0].tipoRetorno);
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
const possivelPropriedade = tipoCorrespondente.propriedades.filter(p => p.nome.lexema === construtoTipado.simbolo.lexema);
|
|
270
|
+
if (possivelPropriedade.length > 0) {
|
|
271
|
+
construto = new construtos_1.AcessoPropriedade(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, possivelPropriedade[0].tipo);
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
184
276
|
}
|
|
185
|
-
return new construtos_1.TipoDe(this.hashArquivo, simboloAtual,
|
|
277
|
+
return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
|
|
186
278
|
case delegua_2.default.EXPRESSAO_REGULAR:
|
|
187
279
|
let valor = '';
|
|
188
280
|
let linhaAtual = this.simbolos[this.atual].linha;
|
|
@@ -223,6 +315,61 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
223
315
|
}
|
|
224
316
|
return expressao;
|
|
225
317
|
}
|
|
318
|
+
finalizarChamada(entidadeChamada) {
|
|
319
|
+
const argumentos = [];
|
|
320
|
+
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
321
|
+
do {
|
|
322
|
+
// `apply()` em JavaScript aceita até 255 parâmetros.
|
|
323
|
+
if (argumentos.length >= 255) {
|
|
324
|
+
throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
|
|
325
|
+
}
|
|
326
|
+
argumentos.push(this.expressao());
|
|
327
|
+
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
328
|
+
}
|
|
329
|
+
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
330
|
+
// Toda chamada precisa saber de antemão qual o tipo resolvido.
|
|
331
|
+
let entidadeChamadaResolvida = entidadeChamada;
|
|
332
|
+
if (entidadeChamadaResolvida.constructor.name === 'AcessoMetodoOuPropriedade') {
|
|
333
|
+
const construtoTipado = entidadeChamadaResolvida;
|
|
334
|
+
switch (entidadeChamadaResolvida.tipo) {
|
|
335
|
+
case delegua_1.default.DICIONARIO:
|
|
336
|
+
case delegua_1.default.DICIONÁRIO:
|
|
337
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_dicionario_1.default)) {
|
|
338
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de dicionário.`);
|
|
339
|
+
}
|
|
340
|
+
const primitivaDicionarioSelecionada = primitivas_dicionario_1.default[construtoTipado.simbolo.lexema];
|
|
341
|
+
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaDicionarioSelecionada.tipoRetorno);
|
|
342
|
+
break;
|
|
343
|
+
case delegua_1.default.INTEIRO:
|
|
344
|
+
case delegua_1.default.NUMERO:
|
|
345
|
+
case delegua_1.default.NÚMERO:
|
|
346
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_numero_1.default)) {
|
|
347
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de número.`);
|
|
348
|
+
}
|
|
349
|
+
const primitivaNumeroSelecionada = primitivas_numero_1.default[construtoTipado.simbolo.lexema];
|
|
350
|
+
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
|
|
351
|
+
break;
|
|
352
|
+
case delegua_1.default.TEXTO:
|
|
353
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_texto_1.default)) {
|
|
354
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de texto.`);
|
|
355
|
+
}
|
|
356
|
+
const primitivaTextoSelecionada = primitivas_texto_1.default[construtoTipado.simbolo.lexema];
|
|
357
|
+
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
|
|
358
|
+
break;
|
|
359
|
+
case delegua_1.default.VETOR:
|
|
360
|
+
case delegua_1.default.VETOR_NUMERO:
|
|
361
|
+
case delegua_1.default.VETOR_NÚMERO:
|
|
362
|
+
case delegua_1.default.VETOR_TEXTO:
|
|
363
|
+
if (!(construtoTipado.simbolo.lexema in primitivas_vetor_1.default)) {
|
|
364
|
+
throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de vetor.`);
|
|
365
|
+
}
|
|
366
|
+
const primitivaVetorSelecionada = primitivas_vetor_1.default[construtoTipado.simbolo.lexema];
|
|
367
|
+
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return new construtos_1.Chamada(this.hashArquivo, entidadeChamadaResolvida, argumentos);
|
|
372
|
+
}
|
|
226
373
|
unario() {
|
|
227
374
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.NEGACAO, delegua_2.default.SUBTRACAO, delegua_2.default.BIT_NOT, delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR)) {
|
|
228
375
|
const operador = this.simbolos[this.atual - 1];
|
|
@@ -247,11 +394,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
247
394
|
*/
|
|
248
395
|
adicaoOuSubtracao() {
|
|
249
396
|
let expressao = this.multiplicar();
|
|
250
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.
|
|
397
|
+
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MENOS_IGUAL)) {
|
|
251
398
|
const operador = this.simbolos[this.atual - 1];
|
|
252
399
|
const direito = this.multiplicar();
|
|
253
400
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
254
401
|
}
|
|
402
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIS_IGUAL)) {
|
|
403
|
+
const operador = this.simbolos[this.atual - 1];
|
|
404
|
+
const direito = this.atribuir();
|
|
405
|
+
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
406
|
+
}
|
|
255
407
|
return expressao;
|
|
256
408
|
}
|
|
257
409
|
bitShift() {
|
|
@@ -348,8 +500,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
348
500
|
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
349
501
|
}
|
|
350
502
|
if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
|
|
351
|
-
|
|
352
|
-
return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
|
|
503
|
+
return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, expressao.objeto, expressao.simbolo, valor);
|
|
353
504
|
}
|
|
354
505
|
if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
|
|
355
506
|
return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
|
|
@@ -815,6 +966,47 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
815
966
|
this.pilhaDecoradores = [];
|
|
816
967
|
return retornos;
|
|
817
968
|
}
|
|
969
|
+
logicaComumInferenciaTiposVariaveisEConstantes(inicializador, tipo) {
|
|
970
|
+
if (tipo !== 'qualquer') {
|
|
971
|
+
return tipo;
|
|
972
|
+
}
|
|
973
|
+
switch (inicializador.constructor.name) {
|
|
974
|
+
case 'AcessoIndiceVariavel':
|
|
975
|
+
const entidadeChamadaAcessoIndiceVariavel = inicializador.entidadeChamada;
|
|
976
|
+
return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
|
|
977
|
+
case 'Chamada':
|
|
978
|
+
const entidadeChamadaChamada = inicializador.entidadeChamada;
|
|
979
|
+
switch (entidadeChamadaChamada.constructor.name) {
|
|
980
|
+
case 'AcessoMetodo':
|
|
981
|
+
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
982
|
+
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
983
|
+
case 'AcessoPropriedade':
|
|
984
|
+
const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
|
|
985
|
+
return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
|
|
986
|
+
case 'Variavel':
|
|
987
|
+
const entidadeChamadaVariavel = entidadeChamadaChamada;
|
|
988
|
+
return entidadeChamadaVariavel.tipo;
|
|
989
|
+
}
|
|
990
|
+
break;
|
|
991
|
+
case 'FuncaoConstruto':
|
|
992
|
+
const funcaoConstruto = inicializador;
|
|
993
|
+
return `função<${funcaoConstruto.tipoRetorno}>`;
|
|
994
|
+
case 'Leia':
|
|
995
|
+
return 'texto';
|
|
996
|
+
case 'Dupla':
|
|
997
|
+
case 'Trio':
|
|
998
|
+
case 'Quarteto':
|
|
999
|
+
case 'Quinteto':
|
|
1000
|
+
case 'Sexteto':
|
|
1001
|
+
case 'Septeto':
|
|
1002
|
+
case 'Octeto':
|
|
1003
|
+
case 'Noneto':
|
|
1004
|
+
case 'Deceto':
|
|
1005
|
+
return delegua_1.default.TUPLA;
|
|
1006
|
+
default:
|
|
1007
|
+
return inicializador.tipo;
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
818
1010
|
/**
|
|
819
1011
|
* Caso símbolo atual seja `var`, devolve uma declaração de variável.
|
|
820
1012
|
* @returns Um Construto do tipo Var.
|
|
@@ -852,30 +1044,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
852
1044
|
}
|
|
853
1045
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
854
1046
|
// Se tipo ainda não foi definido, infere.
|
|
855
|
-
|
|
856
|
-
switch (inicializadores[indice].constructor.name) {
|
|
857
|
-
case 'AcessoIndiceVariavel':
|
|
858
|
-
const entidadeChamada = inicializadores[indice].entidadeChamada;
|
|
859
|
-
tipo = entidadeChamada.tipo.slice(0, -2);
|
|
860
|
-
break;
|
|
861
|
-
case 'Dupla':
|
|
862
|
-
case 'Trio':
|
|
863
|
-
case 'Quarteto':
|
|
864
|
-
case 'Quinteto':
|
|
865
|
-
case 'Sexteto':
|
|
866
|
-
case 'Septeto':
|
|
867
|
-
case 'Octeto':
|
|
868
|
-
case 'Noneto':
|
|
869
|
-
case 'Deceto':
|
|
870
|
-
tipo = delegua_1.default.TUPLA;
|
|
871
|
-
break;
|
|
872
|
-
case 'Literal':
|
|
873
|
-
case 'Variavel':
|
|
874
|
-
case 'Vetor':
|
|
875
|
-
tipo = inicializadores[indice].tipo;
|
|
876
|
-
break;
|
|
877
|
-
}
|
|
878
|
-
}
|
|
1047
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
879
1048
|
this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
|
|
880
1049
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
881
1050
|
}
|
|
@@ -928,30 +1097,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
928
1097
|
}
|
|
929
1098
|
let retorno = [];
|
|
930
1099
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
case 'AcessoIndiceVariavel':
|
|
934
|
-
const entidadeChamada = inicializadores[indice].entidadeChamada;
|
|
935
|
-
tipo = entidadeChamada.tipo.slice(0, -2);
|
|
936
|
-
break;
|
|
937
|
-
case 'Dupla':
|
|
938
|
-
case 'Trio':
|
|
939
|
-
case 'Quarteto':
|
|
940
|
-
case 'Quinteto':
|
|
941
|
-
case 'Sexteto':
|
|
942
|
-
case 'Septeto':
|
|
943
|
-
case 'Octeto':
|
|
944
|
-
case 'Noneto':
|
|
945
|
-
case 'Deceto':
|
|
946
|
-
tipo = delegua_1.default.TUPLA;
|
|
947
|
-
break;
|
|
948
|
-
case 'Literal':
|
|
949
|
-
case 'Variavel':
|
|
950
|
-
case 'Vetor':
|
|
951
|
-
tipo = inicializadores[indice].tipo;
|
|
952
|
-
break;
|
|
953
|
-
}
|
|
954
|
-
}
|
|
1100
|
+
// Se tipo ainda não foi definido, infere.
|
|
1101
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
955
1102
|
this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
|
|
956
1103
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
957
1104
|
}
|
|
@@ -975,8 +1122,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
975
1122
|
// para ela. Vai ser atualizado após avaliação do corpo da função.
|
|
976
1123
|
this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
|
|
977
1124
|
const corpoDaFuncao = this.corpoDaFuncao(tipo);
|
|
978
|
-
this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno
|
|
979
|
-
return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno
|
|
1125
|
+
this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno);
|
|
1126
|
+
return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno, decoradores);
|
|
980
1127
|
}
|
|
981
1128
|
logicaComumParametros() {
|
|
982
1129
|
const parametros = [];
|
|
@@ -1055,9 +1202,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1055
1202
|
}
|
|
1056
1203
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
1057
1204
|
let tipoRetorno = 'qualquer';
|
|
1205
|
+
let definicaoExplicitaDeTipo = false;
|
|
1058
1206
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
|
|
1059
1207
|
tipoRetorno = this.verificarDefinicaoTipoAtual();
|
|
1060
1208
|
this.avancarEDevolverAnterior();
|
|
1209
|
+
definicaoExplicitaDeTipo = true;
|
|
1061
1210
|
}
|
|
1062
1211
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
|
|
1063
1212
|
const corpo = this.blocoEscopo();
|
|
@@ -1072,19 +1221,25 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1072
1221
|
}
|
|
1073
1222
|
}
|
|
1074
1223
|
const tiposRetornos = new Set(expressoesRetorna.map(e => e.tipo));
|
|
1075
|
-
// if (tiposRetornos.size > 1 && !tiposRetornos.has('qualquer')) {
|
|
1076
1224
|
if (tiposRetornos.size > 1 && tipoRetorno !== 'qualquer') {
|
|
1077
1225
|
let tiposEncontrados = Array.from(tiposRetornos).reduce((acumulador, valor) => acumulador += valor + ', ', '');
|
|
1078
1226
|
tiposEncontrados = tiposEncontrados.slice(0, -2);
|
|
1079
1227
|
throw this.erro(parenteseEsquerdo, `Função retorna valores com mais de um tipo. Tipo esperado: ${tipoRetorno}. Tipos encontrados: ${tiposEncontrados}.`);
|
|
1080
1228
|
}
|
|
1081
1229
|
tiposRetornos.delete('qualquer');
|
|
1082
|
-
if (tipoRetorno === 'qualquer'
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1230
|
+
if (tipoRetorno === 'qualquer') {
|
|
1231
|
+
if (tiposRetornos.size > 0) {
|
|
1232
|
+
// Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
|
|
1233
|
+
// este avaliador sintático pode restringir o tipo baseado nos construtos
|
|
1234
|
+
// de retornos encontrados nos blocos internos da função.
|
|
1235
|
+
const tipoRetornoDeduzido = tiposRetornos.values().next().value;
|
|
1236
|
+
tipoRetorno = tipoRetornoDeduzido;
|
|
1237
|
+
}
|
|
1238
|
+
else if (!definicaoExplicitaDeTipo) {
|
|
1239
|
+
// Ou, se esses retornos sequer existem, e o tipo explícito não é
|
|
1240
|
+
// 'qualquer', o tipo inferido é 'vazio'.
|
|
1241
|
+
tipoRetorno = 'vazio';
|
|
1242
|
+
}
|
|
1088
1243
|
}
|
|
1089
1244
|
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
|
|
1090
1245
|
}
|