@designliquido/delegua 0.39.0 → 0.39.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +22 -11
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +6 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +210 -126
- package/avaliador-sintatico/avaliador-sintatico.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 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +1 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +2 -3
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
- package/bibliotecas/primitivas-vetor.js +1 -1
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/acesso-propriedade.d.ts +1 -0
- package/construtos/acesso-propriedade.d.ts.map +1 -1
- package/construtos/acesso-propriedade.js +7 -0
- package/construtos/acesso-propriedade.js.map +1 -1
- package/construtos/atribuir.d.ts +3 -2
- package/construtos/atribuir.d.ts.map +1 -1
- package/construtos/atribuir.js +7 -4
- package/construtos/atribuir.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 +2 -1
- package/construtos/index.d.ts.map +1 -1
- package/construtos/index.js +2 -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/formatadores/formatador-delegua.js +1 -1
- package/formatadores/formatador-delegua.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 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +2 -2
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +2 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +22 -15
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +2 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +39 -0
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/lexador.js +16 -16
- package/lexador/lexador.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-assemblyscript.js +1 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +18 -3
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-python.d.ts +11 -6
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +153 -89
- package/tradutores/tradutor-python.js.map +1 -1
- package/umd/delegua.js +871 -629
|
@@ -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,9 @@ 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"));
|
|
19
20
|
const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
|
|
20
21
|
const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
|
|
21
22
|
const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
|
|
@@ -64,28 +65,72 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
64
65
|
}
|
|
65
66
|
return tipoElementarResolvido;
|
|
66
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
|
+
}
|
|
67
128
|
primario() {
|
|
68
129
|
const simboloAtual = this.simbolos[this.atual];
|
|
69
130
|
let valores = [];
|
|
70
131
|
switch (simboloAtual.tipo) {
|
|
71
132
|
case delegua_2.default.CHAVE_ESQUERDA:
|
|
72
|
-
this.
|
|
73
|
-
const chaves = [];
|
|
74
|
-
valores = [];
|
|
75
|
-
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
76
|
-
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
|
|
77
|
-
}
|
|
78
|
-
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
79
|
-
const chave = this.atribuir();
|
|
80
|
-
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
81
|
-
const valor = this.atribuir();
|
|
82
|
-
chaves.push(chave);
|
|
83
|
-
valores.push(valor);
|
|
84
|
-
if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
|
|
85
|
-
this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
|
|
133
|
+
return this.construtoDicionario(simboloAtual);
|
|
89
134
|
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
90
135
|
this.avancarEDevolverAnterior();
|
|
91
136
|
valores = [];
|
|
@@ -93,19 +138,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
93
138
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), [], 0, 'qualquer');
|
|
94
139
|
}
|
|
95
140
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
|
|
96
|
-
let valor = null;
|
|
97
141
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
98
|
-
|
|
99
|
-
const argumentos = [expressao];
|
|
100
|
-
while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
|
|
101
|
-
this.avancarEDevolverAnterior();
|
|
102
|
-
argumentos.push(this.expressao());
|
|
103
|
-
}
|
|
104
|
-
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
105
|
-
this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
|
|
106
|
-
return new tuplas_1.SeletorTuplas(...argumentos);
|
|
142
|
+
return this.construtoTupla();
|
|
107
143
|
}
|
|
108
|
-
valor = this.atribuir();
|
|
144
|
+
const valor = this.atribuir();
|
|
109
145
|
valores.push(valor);
|
|
110
146
|
if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
|
|
111
147
|
this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
@@ -146,7 +182,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
146
182
|
return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
|
|
147
183
|
case delegua_2.default.NULO:
|
|
148
184
|
this.avancarEDevolverAnterior();
|
|
149
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null);
|
|
185
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
|
|
150
186
|
case delegua_2.default.NUMERO:
|
|
151
187
|
case delegua_2.default.TEXTO:
|
|
152
188
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
@@ -178,14 +214,67 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
178
214
|
case delegua_2.default.TIPO:
|
|
179
215
|
this.avancarEDevolverAnterior();
|
|
180
216
|
this.consumir(delegua_2.default.DE, "Esperado 'de' após 'tipo'.");
|
|
181
|
-
let
|
|
217
|
+
let construto;
|
|
182
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)) {
|
|
183
|
-
|
|
219
|
+
construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
|
|
184
220
|
}
|
|
185
221
|
else {
|
|
186
|
-
|
|
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
|
+
}
|
|
187
276
|
}
|
|
188
|
-
return new construtos_1.TipoDe(this.hashArquivo, simboloAtual,
|
|
277
|
+
return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
|
|
189
278
|
case delegua_2.default.EXPRESSAO_REGULAR:
|
|
190
279
|
let valor = '';
|
|
191
280
|
let linhaAtual = this.simbolos[this.atual].linha;
|
|
@@ -241,33 +330,41 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
241
330
|
// Toda chamada precisa saber de antemão qual o tipo resolvido.
|
|
242
331
|
let entidadeChamadaResolvida = entidadeChamada;
|
|
243
332
|
if (entidadeChamadaResolvida.constructor.name === 'AcessoMetodoOuPropriedade') {
|
|
244
|
-
const
|
|
333
|
+
const construtoTipado = entidadeChamadaResolvida;
|
|
245
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;
|
|
246
343
|
case delegua_1.default.INTEIRO:
|
|
247
344
|
case delegua_1.default.NUMERO:
|
|
248
345
|
case delegua_1.default.NÚMERO:
|
|
249
|
-
if (!(
|
|
250
|
-
throw this.erro(
|
|
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.`);
|
|
251
348
|
}
|
|
252
|
-
const primitivaNumeroSelecionada = primitivas_numero_1.default[
|
|
253
|
-
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(
|
|
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);
|
|
254
351
|
break;
|
|
255
352
|
case delegua_1.default.TEXTO:
|
|
256
|
-
if (!(
|
|
257
|
-
throw this.erro(
|
|
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.`);
|
|
258
355
|
}
|
|
259
|
-
const primitivaTextoSelecionada = primitivas_texto_1.default[
|
|
260
|
-
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(
|
|
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);
|
|
261
358
|
break;
|
|
262
359
|
case delegua_1.default.VETOR:
|
|
263
360
|
case delegua_1.default.VETOR_NUMERO:
|
|
264
361
|
case delegua_1.default.VETOR_NÚMERO:
|
|
265
362
|
case delegua_1.default.VETOR_TEXTO:
|
|
266
|
-
if (!(
|
|
267
|
-
throw this.erro(
|
|
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.`);
|
|
268
365
|
}
|
|
269
|
-
const primitivaVetorSelecionada = primitivas_vetor_1.default[
|
|
270
|
-
entidadeChamadaResolvida = new construtos_1.AcessoMetodo(
|
|
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);
|
|
271
368
|
break;
|
|
272
369
|
}
|
|
273
370
|
}
|
|
@@ -389,22 +486,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
389
486
|
].includes(expressao.operador.tipo)) {
|
|
390
487
|
if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
|
|
391
488
|
const entidade = expressao.esquerda;
|
|
392
|
-
|
|
393
|
-
return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, entidade.indice);
|
|
489
|
+
return new construtos_1.Atribuir(this.hashArquivo, entidade.entidadeChamada, expressao, entidade.indice, expressao.operador);
|
|
394
490
|
}
|
|
395
|
-
|
|
396
|
-
return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
|
|
491
|
+
return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda, expressao, undefined, expressao.operador);
|
|
397
492
|
}
|
|
398
493
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
399
494
|
const igual = this.simbolos[this.atual - 1];
|
|
400
495
|
const valor = this.expressao();
|
|
401
496
|
if (expressao instanceof construtos_1.Variavel) {
|
|
402
|
-
|
|
403
|
-
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
497
|
+
return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
|
|
404
498
|
}
|
|
405
499
|
if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
|
|
406
|
-
|
|
407
|
-
return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
|
|
500
|
+
return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, expressao.objeto, expressao.simbolo, valor);
|
|
408
501
|
}
|
|
409
502
|
if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
|
|
410
503
|
return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
|
|
@@ -870,6 +963,47 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
870
963
|
this.pilhaDecoradores = [];
|
|
871
964
|
return retornos;
|
|
872
965
|
}
|
|
966
|
+
logicaComumInferenciaTiposVariaveisEConstantes(inicializador, tipo) {
|
|
967
|
+
if (tipo !== 'qualquer') {
|
|
968
|
+
return tipo;
|
|
969
|
+
}
|
|
970
|
+
switch (inicializador.constructor.name) {
|
|
971
|
+
case 'AcessoIndiceVariavel':
|
|
972
|
+
const entidadeChamadaAcessoIndiceVariavel = inicializador.entidadeChamada;
|
|
973
|
+
return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
|
|
974
|
+
case 'Chamada':
|
|
975
|
+
const entidadeChamadaChamada = inicializador.entidadeChamada;
|
|
976
|
+
switch (entidadeChamadaChamada.constructor.name) {
|
|
977
|
+
case 'AcessoMetodo':
|
|
978
|
+
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
979
|
+
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
980
|
+
case 'AcessoPropriedade':
|
|
981
|
+
const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
|
|
982
|
+
return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
|
|
983
|
+
case 'Variavel':
|
|
984
|
+
const entidadeChamadaVariavel = entidadeChamadaChamada;
|
|
985
|
+
return entidadeChamadaVariavel.tipo;
|
|
986
|
+
}
|
|
987
|
+
break;
|
|
988
|
+
case 'FuncaoConstruto':
|
|
989
|
+
const funcaoConstruto = inicializador;
|
|
990
|
+
return `função<${funcaoConstruto.tipoRetorno}>`;
|
|
991
|
+
case 'Leia':
|
|
992
|
+
return 'texto';
|
|
993
|
+
case 'Dupla':
|
|
994
|
+
case 'Trio':
|
|
995
|
+
case 'Quarteto':
|
|
996
|
+
case 'Quinteto':
|
|
997
|
+
case 'Sexteto':
|
|
998
|
+
case 'Septeto':
|
|
999
|
+
case 'Octeto':
|
|
1000
|
+
case 'Noneto':
|
|
1001
|
+
case 'Deceto':
|
|
1002
|
+
return delegua_1.default.TUPLA;
|
|
1003
|
+
default:
|
|
1004
|
+
return inicializador.tipo;
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
873
1007
|
/**
|
|
874
1008
|
* Caso símbolo atual seja `var`, devolve uma declaração de variável.
|
|
875
1009
|
* @returns Um Construto do tipo Var.
|
|
@@ -907,43 +1041,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
907
1041
|
}
|
|
908
1042
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
909
1043
|
// Se tipo ainda não foi definido, infere.
|
|
910
|
-
|
|
911
|
-
switch (inicializadores[indice].constructor.name) {
|
|
912
|
-
case 'AcessoIndiceVariavel':
|
|
913
|
-
const entidadeChamadaAcessoIndiceVariavel = inicializadores[indice].entidadeChamada;
|
|
914
|
-
tipo = entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
|
|
915
|
-
break;
|
|
916
|
-
case 'Chamada':
|
|
917
|
-
const entidadeChamadaChamada = inicializadores[indice].entidadeChamada;
|
|
918
|
-
switch (entidadeChamadaChamada.constructor.name) {
|
|
919
|
-
case 'AcessoMetodo':
|
|
920
|
-
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
921
|
-
tipo = entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
922
|
-
break;
|
|
923
|
-
case 'AcessoPropriedade':
|
|
924
|
-
const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
|
|
925
|
-
tipo = entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
|
|
926
|
-
break;
|
|
927
|
-
}
|
|
928
|
-
break;
|
|
929
|
-
case 'Dupla':
|
|
930
|
-
case 'Trio':
|
|
931
|
-
case 'Quarteto':
|
|
932
|
-
case 'Quinteto':
|
|
933
|
-
case 'Sexteto':
|
|
934
|
-
case 'Septeto':
|
|
935
|
-
case 'Octeto':
|
|
936
|
-
case 'Noneto':
|
|
937
|
-
case 'Deceto':
|
|
938
|
-
tipo = delegua_1.default.TUPLA;
|
|
939
|
-
break;
|
|
940
|
-
case 'Literal':
|
|
941
|
-
case 'Variavel':
|
|
942
|
-
case 'Vetor':
|
|
943
|
-
tipo = inicializadores[indice].tipo;
|
|
944
|
-
break;
|
|
945
|
-
}
|
|
946
|
-
}
|
|
1044
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
947
1045
|
this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
|
|
948
1046
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
949
1047
|
}
|
|
@@ -996,30 +1094,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
996
1094
|
}
|
|
997
1095
|
let retorno = [];
|
|
998
1096
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
case 'AcessoIndiceVariavel':
|
|
1002
|
-
const entidadeChamada = inicializadores[indice].entidadeChamada;
|
|
1003
|
-
tipo = entidadeChamada.tipo.slice(0, -2);
|
|
1004
|
-
break;
|
|
1005
|
-
case 'Dupla':
|
|
1006
|
-
case 'Trio':
|
|
1007
|
-
case 'Quarteto':
|
|
1008
|
-
case 'Quinteto':
|
|
1009
|
-
case 'Sexteto':
|
|
1010
|
-
case 'Septeto':
|
|
1011
|
-
case 'Octeto':
|
|
1012
|
-
case 'Noneto':
|
|
1013
|
-
case 'Deceto':
|
|
1014
|
-
tipo = delegua_1.default.TUPLA;
|
|
1015
|
-
break;
|
|
1016
|
-
case 'Literal':
|
|
1017
|
-
case 'Variavel':
|
|
1018
|
-
case 'Vetor':
|
|
1019
|
-
tipo = inicializadores[indice].tipo;
|
|
1020
|
-
break;
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1097
|
+
// Se tipo ainda não foi definido, infere.
|
|
1098
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1023
1099
|
this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
|
|
1024
1100
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1025
1101
|
}
|
|
@@ -1043,8 +1119,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1043
1119
|
// para ela. Vai ser atualizado após avaliação do corpo da função.
|
|
1044
1120
|
this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
|
|
1045
1121
|
const corpoDaFuncao = this.corpoDaFuncao(tipo);
|
|
1046
|
-
this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno
|
|
1047
|
-
return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno
|
|
1122
|
+
this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno);
|
|
1123
|
+
return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno, decoradores);
|
|
1048
1124
|
}
|
|
1049
1125
|
logicaComumParametros() {
|
|
1050
1126
|
const parametros = [];
|
|
@@ -1123,9 +1199,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1123
1199
|
}
|
|
1124
1200
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
1125
1201
|
let tipoRetorno = 'qualquer';
|
|
1202
|
+
let definicaoExplicitaDeTipo = false;
|
|
1126
1203
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
|
|
1127
1204
|
tipoRetorno = this.verificarDefinicaoTipoAtual();
|
|
1128
1205
|
this.avancarEDevolverAnterior();
|
|
1206
|
+
definicaoExplicitaDeTipo = true;
|
|
1129
1207
|
}
|
|
1130
1208
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
|
|
1131
1209
|
const corpo = this.blocoEscopo();
|
|
@@ -1140,19 +1218,25 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1140
1218
|
}
|
|
1141
1219
|
}
|
|
1142
1220
|
const tiposRetornos = new Set(expressoesRetorna.map(e => e.tipo));
|
|
1143
|
-
// if (tiposRetornos.size > 1 && !tiposRetornos.has('qualquer')) {
|
|
1144
1221
|
if (tiposRetornos.size > 1 && tipoRetorno !== 'qualquer') {
|
|
1145
1222
|
let tiposEncontrados = Array.from(tiposRetornos).reduce((acumulador, valor) => acumulador += valor + ', ', '');
|
|
1146
1223
|
tiposEncontrados = tiposEncontrados.slice(0, -2);
|
|
1147
1224
|
throw this.erro(parenteseEsquerdo, `Função retorna valores com mais de um tipo. Tipo esperado: ${tipoRetorno}. Tipos encontrados: ${tiposEncontrados}.`);
|
|
1148
1225
|
}
|
|
1149
1226
|
tiposRetornos.delete('qualquer');
|
|
1150
|
-
if (tipoRetorno === 'qualquer'
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1227
|
+
if (tipoRetorno === 'qualquer') {
|
|
1228
|
+
if (tiposRetornos.size > 0) {
|
|
1229
|
+
// Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
|
|
1230
|
+
// este avaliador sintático pode restringir o tipo baseado nos construtos
|
|
1231
|
+
// de retornos encontrados nos blocos internos da função.
|
|
1232
|
+
const tipoRetornoDeduzido = tiposRetornos.values().next().value;
|
|
1233
|
+
tipoRetorno = tipoRetornoDeduzido;
|
|
1234
|
+
}
|
|
1235
|
+
else if (!definicaoExplicitaDeTipo) {
|
|
1236
|
+
// Ou, se esses retornos sequer existem, e o tipo explícito não é
|
|
1237
|
+
// 'qualquer', o tipo inferido é 'vazio'.
|
|
1238
|
+
tipoRetorno = 'vazio';
|
|
1239
|
+
}
|
|
1156
1240
|
}
|
|
1157
1241
|
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
|
|
1158
1242
|
}
|