@designliquido/delegua 0.39.0 → 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.
Files changed (37) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts +6 -1
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  3. package/avaliador-sintatico/avaliador-sintatico.js +207 -120
  4. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  5. package/bin/package.json +1 -1
  6. package/construtos/acesso-propriedade.d.ts +1 -0
  7. package/construtos/acesso-propriedade.d.ts.map +1 -1
  8. package/construtos/acesso-propriedade.js +7 -0
  9. package/construtos/acesso-propriedade.js.map +1 -1
  10. package/construtos/componente-linguagem.d.ts +15 -0
  11. package/construtos/componente-linguagem.d.ts.map +1 -0
  12. package/construtos/componente-linguagem.js +19 -0
  13. package/construtos/componente-linguagem.js.map +1 -0
  14. package/construtos/dicionario.d.ts +1 -0
  15. package/construtos/dicionario.d.ts.map +1 -1
  16. package/construtos/dicionario.js +1 -0
  17. package/construtos/dicionario.js.map +1 -1
  18. package/construtos/index.d.ts +2 -1
  19. package/construtos/index.d.ts.map +1 -1
  20. package/construtos/index.js +2 -1
  21. package/construtos/index.js.map +1 -1
  22. package/construtos/tipo-de.d.ts +6 -2
  23. package/construtos/tipo-de.d.ts.map +1 -1
  24. package/construtos/tipo-de.js +4 -0
  25. package/construtos/tipo-de.js.map +1 -1
  26. package/interpretador/interpretador-base.d.ts.map +1 -1
  27. package/interpretador/interpretador-base.js +3 -14
  28. package/interpretador/interpretador-base.js.map +1 -1
  29. package/interpretador/interpretador.d.ts +2 -1
  30. package/interpretador/interpretador.d.ts.map +1 -1
  31. package/interpretador/interpretador.js +39 -0
  32. package/interpretador/interpretador.js.map +1 -1
  33. package/package.json +1 -1
  34. package/tradutores/tradutor-python.d.ts.map +1 -1
  35. package/tradutores/tradutor-python.js +7 -2
  36. package/tradutores/tradutor-python.js.map +1 -1
  37. package/umd/delegua.js +655 -502
@@ -1,6 +1,7 @@
1
- import { Chamada, Comentario, Construto, Decorador, FuncaoConstruto } from '../construtos';
1
+ import { Chamada, Comentario, Construto, Decorador, Dicionario, FuncaoConstruto } from '../construtos';
2
2
  import { AvaliadorSintaticoInterface, ParametroInterface, SimboloInterface } from '../interfaces';
3
3
  import { ErroAvaliadorSintatico } from './erro-avaliador-sintatico';
4
+ import { Tupla } from '../construtos/tuplas';
4
5
  import { Bloco, Classe, Const, Continua, Declaracao, Enquanto, Escolha, Escreva, Expressao, Falhar, Fazer, FuncaoDeclaracao, Importar, Leia, Para, ParaCada, Retorna, Se, Sustar, TendoComo, Tente, Var } from '../declaracoes';
5
6
  import { RetornoAvaliadorSintatico } from '../interfaces/retornos/retorno-avaliador-sintatico';
6
7
  import { RetornoLexador } from '../interfaces/retornos/retorno-lexador';
@@ -37,6 +38,9 @@ export declare class AvaliadorSintatico extends AvaliadorSintaticoBase implement
37
38
  performance: boolean;
38
39
  constructor(performance?: boolean);
39
40
  protected verificarDefinicaoTipoAtual(): string;
41
+ protected obterChaveDicionario(): Construto;
42
+ protected construtoDicionario(simboloChaveEsquerda: SimboloInterface): Dicionario;
43
+ protected construtoTupla(): Tupla;
40
44
  primario(): Construto;
41
45
  chamar(): Construto;
42
46
  finalizarChamada(entidadeChamada: Construto): Chamada;
@@ -96,6 +100,7 @@ export declare class AvaliadorSintatico extends AvaliadorSintaticoBase implement
96
100
  protected resolverDeclaracao(): any;
97
101
  protected declaracaoTendoComo(): TendoComo;
98
102
  protected declaracaoDesestruturacaoVariavel(): Var[];
103
+ protected logicaComumInferenciaTiposVariaveisEConstantes(inicializador: Construto, tipo: string): string;
99
104
  /**
100
105
  * Caso símbolo atual seja `var`, devolve uma declaração de variável.
101
106
  * @returns Um Construto do tipo Var.
@@ -1 +1 @@
1
- {"version":3,"file":"avaliador-sintatico.d.ts","sourceRoot":"","sources":["../../fontes/avaliador-sintatico/avaliador-sintatico.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"avaliador-sintatico.d.ts","sourceRoot":"","sources":["../../fontes/avaliador-sintatico/avaliador-sintatico.ts"],"names":[],"mappings":"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"}
@@ -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.avancarEDevolverAnterior();
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
- const expressao = this.expressao();
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 _expressao;
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
- _expressao = this.simboloAnterior();
219
+ construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
184
220
  }
185
221
  else {
186
- _expressao = this.expressao();
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, _expressao instanceof construtos_1.Literal ? _expressao.valor : _expressao);
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 acessoMetodoOuPropriedade = entidadeChamadaResolvida;
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 (!(acessoMetodoOuPropriedade.simbolo.lexema in primitivas_numero_1.default)) {
250
- throw this.erro(acessoMetodoOuPropriedade.simbolo, `${acessoMetodoOuPropriedade.simbolo.lexema} não é uma primitiva de 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.`);
251
348
  }
252
- const primitivaNumeroSelecionada = primitivas_numero_1.default[acessoMetodoOuPropriedade.simbolo.lexema];
253
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(acessoMetodoOuPropriedade.hashArquivo, acessoMetodoOuPropriedade.objeto, acessoMetodoOuPropriedade.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
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 (!(acessoMetodoOuPropriedade.simbolo.lexema in primitivas_texto_1.default)) {
257
- throw this.erro(acessoMetodoOuPropriedade.simbolo, `${acessoMetodoOuPropriedade.simbolo.lexema} não é uma primitiva de 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.`);
258
355
  }
259
- const primitivaTextoSelecionada = primitivas_texto_1.default[acessoMetodoOuPropriedade.simbolo.lexema];
260
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(acessoMetodoOuPropriedade.hashArquivo, acessoMetodoOuPropriedade.objeto, acessoMetodoOuPropriedade.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
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 (!(acessoMetodoOuPropriedade.simbolo.lexema in primitivas_vetor_1.default)) {
267
- throw this.erro(acessoMetodoOuPropriedade.simbolo, `${acessoMetodoOuPropriedade.simbolo.lexema} não é uma primitiva de vetor.`);
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[acessoMetodoOuPropriedade.simbolo.lexema];
270
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(acessoMetodoOuPropriedade.hashArquivo, acessoMetodoOuPropriedade.objeto, acessoMetodoOuPropriedade.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
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
  }
@@ -403,8 +500,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
403
500
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
404
501
  }
405
502
  if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
406
- const get = expressao;
407
- 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);
408
504
  }
409
505
  if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
410
506
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
@@ -870,6 +966,47 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
870
966
  this.pilhaDecoradores = [];
871
967
  return retornos;
872
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
+ }
873
1010
  /**
874
1011
  * Caso símbolo atual seja `var`, devolve uma declaração de variável.
875
1012
  * @returns Um Construto do tipo Var.
@@ -907,43 +1044,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
907
1044
  }
908
1045
  for (let [indice, identificador] of identificadores.entries()) {
909
1046
  // Se tipo ainda não foi definido, infere.
910
- if (tipo === 'qualquer') {
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
- }
1047
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
947
1048
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
948
1049
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
949
1050
  }
@@ -996,30 +1097,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
996
1097
  }
997
1098
  let retorno = [];
998
1099
  for (let [indice, identificador] of identificadores.entries()) {
999
- if (tipo === 'qualquer') {
1000
- switch (inicializadores[indice].constructor.name) {
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
- }
1100
+ // Se tipo ainda não foi definido, infere.
1101
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1023
1102
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1024
1103
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1025
1104
  }
@@ -1043,8 +1122,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1043
1122
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1044
1123
  this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
1045
1124
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1046
- this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno || 'qualquer');
1047
- return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno || 'qualquer', decoradores);
1125
+ this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno);
1126
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno, decoradores);
1048
1127
  }
1049
1128
  logicaComumParametros() {
1050
1129
  const parametros = [];
@@ -1123,9 +1202,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1123
1202
  }
1124
1203
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1125
1204
  let tipoRetorno = 'qualquer';
1205
+ let definicaoExplicitaDeTipo = false;
1126
1206
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1127
1207
  tipoRetorno = this.verificarDefinicaoTipoAtual();
1128
1208
  this.avancarEDevolverAnterior();
1209
+ definicaoExplicitaDeTipo = true;
1129
1210
  }
1130
1211
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1131
1212
  const corpo = this.blocoEscopo();
@@ -1140,19 +1221,25 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1140
1221
  }
1141
1222
  }
1142
1223
  const tiposRetornos = new Set(expressoesRetorna.map(e => e.tipo));
1143
- // if (tiposRetornos.size > 1 && !tiposRetornos.has('qualquer')) {
1144
1224
  if (tiposRetornos.size > 1 && tipoRetorno !== 'qualquer') {
1145
1225
  let tiposEncontrados = Array.from(tiposRetornos).reduce((acumulador, valor) => acumulador += valor + ', ', '');
1146
1226
  tiposEncontrados = tiposEncontrados.slice(0, -2);
1147
1227
  throw this.erro(parenteseEsquerdo, `Função retorna valores com mais de um tipo. Tipo esperado: ${tipoRetorno}. Tipos encontrados: ${tiposEncontrados}.`);
1148
1228
  }
1149
1229
  tiposRetornos.delete('qualquer');
1150
- if (tipoRetorno === 'qualquer' && tiposRetornos.size === 1) {
1151
- // Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
1152
- // este avaliador sintático pode restringir o tipo baseado nos retornos
1153
- // encontrados nos blocos internos da função.
1154
- const tipoRetornoDeduzido = tiposRetornos.values().next().value;
1155
- tipoRetorno = tipoRetornoDeduzido;
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
+ }
1156
1243
  }
1157
1244
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
1158
1245
  }