@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.
Files changed (121) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +4 -2
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +7 -1
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico-base.js +2 -4
  7. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.d.ts +7 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico.js +250 -95
  11. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +2 -2
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +2 -2
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  16. package/avaliador-sintatico/micro-avaliador-sintatico.js +2 -2
  17. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  18. package/bibliotecas/primitivas-dicionario.d.ts +2 -3
  19. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  20. package/bibliotecas/primitivas-dicionario.js +10 -4
  21. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  22. package/bibliotecas/primitivas-numero.d.ts +2 -3
  23. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  24. package/bibliotecas/primitivas-numero.js +10 -4
  25. package/bibliotecas/primitivas-numero.js.map +1 -1
  26. package/bibliotecas/primitivas-texto.d.ts +2 -14
  27. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  28. package/bibliotecas/primitivas-texto.js +56 -17
  29. package/bibliotecas/primitivas-texto.js.map +1 -1
  30. package/bibliotecas/primitivas-vetor.d.ts +2 -22
  31. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  32. package/bibliotecas/primitivas-vetor.js +115 -67
  33. package/bibliotecas/primitivas-vetor.js.map +1 -1
  34. package/bin/package.json +1 -1
  35. package/construtos/acesso-metodo-ou-propriedade.d.ts +3 -1
  36. package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
  37. package/construtos/acesso-metodo-ou-propriedade.js +4 -2
  38. package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
  39. package/construtos/acesso-metodo.d.ts +12 -0
  40. package/construtos/acesso-metodo.d.ts.map +1 -0
  41. package/construtos/acesso-metodo.js +18 -0
  42. package/construtos/acesso-metodo.js.map +1 -0
  43. package/construtos/acesso-propriedade.d.ts +12 -0
  44. package/construtos/acesso-propriedade.d.ts.map +1 -0
  45. package/construtos/acesso-propriedade.js +17 -0
  46. package/construtos/acesso-propriedade.js.map +1 -0
  47. package/construtos/chamada.d.ts +1 -2
  48. package/construtos/chamada.d.ts.map +1 -1
  49. package/construtos/chamada.js +1 -2
  50. package/construtos/chamada.js.map +1 -1
  51. package/construtos/componente-linguagem.d.ts +15 -0
  52. package/construtos/componente-linguagem.d.ts.map +1 -0
  53. package/construtos/componente-linguagem.js +19 -0
  54. package/construtos/componente-linguagem.js.map +1 -0
  55. package/construtos/dicionario.d.ts +1 -0
  56. package/construtos/dicionario.d.ts.map +1 -1
  57. package/construtos/dicionario.js +1 -0
  58. package/construtos/dicionario.js.map +1 -1
  59. package/construtos/index.d.ts +4 -1
  60. package/construtos/index.d.ts.map +1 -1
  61. package/construtos/index.js +4 -1
  62. package/construtos/index.js.map +1 -1
  63. package/construtos/tipo-de.d.ts +6 -2
  64. package/construtos/tipo-de.d.ts.map +1 -1
  65. package/construtos/tipo-de.js +4 -0
  66. package/construtos/tipo-de.js.map +1 -1
  67. package/estruturas/objeto-delegua-classe.d.ts +2 -0
  68. package/estruturas/objeto-delegua-classe.d.ts.map +1 -1
  69. package/estruturas/objeto-delegua-classe.js +12 -0
  70. package/estruturas/objeto-delegua-classe.js.map +1 -1
  71. package/formatadores/formatador-delegua.d.ts +4 -2
  72. package/formatadores/formatador-delegua.d.ts.map +1 -1
  73. package/formatadores/formatador-delegua.js +12 -2
  74. package/formatadores/formatador-delegua.js.map +1 -1
  75. package/interfaces/index.d.ts +1 -0
  76. package/interfaces/index.d.ts.map +1 -1
  77. package/interfaces/index.js +1 -0
  78. package/interfaces/index.js.map +1 -1
  79. package/interfaces/primitiva-interface.d.ts +5 -0
  80. package/interfaces/primitiva-interface.d.ts.map +1 -0
  81. package/interfaces/primitiva-interface.js +3 -0
  82. package/interfaces/primitiva-interface.js.map +1 -0
  83. package/interfaces/visitante-comum-interface.d.ts +4 -2
  84. package/interfaces/visitante-comum-interface.d.ts.map +1 -1
  85. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +4 -2
  86. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  87. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +7 -1
  88. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  89. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +4 -2
  90. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
  91. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +7 -1
  92. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  93. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +4 -2
  94. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  95. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +7 -1
  96. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  97. package/interpretador/index.d.ts +1 -0
  98. package/interpretador/index.d.ts.map +1 -1
  99. package/interpretador/index.js +1 -0
  100. package/interpretador/index.js.map +1 -1
  101. package/interpretador/interpretador-base.d.ts +4 -2
  102. package/interpretador/interpretador-base.d.ts.map +1 -1
  103. package/interpretador/interpretador-base.js +35 -26
  104. package/interpretador/interpretador-base.js.map +1 -1
  105. package/interpretador/interpretador.d.ts +11 -0
  106. package/interpretador/interpretador.d.ts.map +1 -0
  107. package/interpretador/interpretador.js +208 -0
  108. package/interpretador/interpretador.js.map +1 -0
  109. package/lexador/micro-lexador.d.ts.map +1 -1
  110. package/lexador/micro-lexador.js +4 -0
  111. package/lexador/micro-lexador.js.map +1 -1
  112. package/package.json +1 -1
  113. package/tradutores/tradutor-javascript.d.ts +8 -2
  114. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  115. package/tradutores/tradutor-javascript.js +40 -3
  116. package/tradutores/tradutor-javascript.js.map +1 -1
  117. package/tradutores/tradutor-python.d.ts +5 -1
  118. package/tradutores/tradutor-python.d.ts.map +1 -1
  119. package/tradutores/tradutor-python.js +37 -2
  120. package/tradutores/tradutor-python.js.map +1 -1
  121. 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.avancarEDevolverAnterior();
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
- const expressao = this.expressao();
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 _expressao;
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
- _expressao = this.simboloAnterior();
219
+ construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
181
220
  }
182
221
  else {
183
- _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
+ }
184
276
  }
185
- 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);
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.MAIS_IGUAL, delegua_2.default.MENOS_IGUAL)) {
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
- const get = expressao;
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
- if (tipo === 'qualquer') {
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
- if (tipo === 'qualquer') {
932
- switch (inicializadores[indice].constructor.name) {
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 || 'qualquer');
979
- 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);
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' && tiposRetornos.size === 1) {
1083
- // Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
1084
- // este avaliador sintático pode restringir o tipo baseado nos retornos
1085
- // encontrados nos blocos internos da função.
1086
- const tipoRetornoDeduzido = tiposRetornos.values().next().value;
1087
- 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
+ }
1088
1243
  }
1089
1244
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
1090
1245
  }