@designliquido/delegua 0.38.1 → 0.38.3

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 (73) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts +1 -2
  2. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico.js +2 -2
  4. package/analisador-semantico/analisador-semantico.js.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico-base.js +3 -2
  7. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.d.ts +10 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico.js +111 -15
  11. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +4 -4
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +7 -7
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +2 -2
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  21. package/bin/package.json +1 -1
  22. package/construtos/acesso-metodo-ou-propriedade.d.ts +2 -1
  23. package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
  24. package/construtos/acesso-metodo-ou-propriedade.js +2 -1
  25. package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
  26. package/construtos/agrupamento.d.ts +1 -0
  27. package/construtos/agrupamento.d.ts.map +1 -1
  28. package/construtos/agrupamento.js +1 -0
  29. package/construtos/agrupamento.js.map +1 -1
  30. package/construtos/binario.d.ts +3 -1
  31. package/construtos/binario.d.ts.map +1 -1
  32. package/construtos/binario.js +17 -0
  33. package/construtos/binario.js.map +1 -1
  34. package/construtos/construto.d.ts +1 -0
  35. package/construtos/construto.d.ts.map +1 -1
  36. package/declaracoes/const.d.ts +2 -3
  37. package/declaracoes/const.d.ts.map +1 -1
  38. package/declaracoes/const.js +7 -2
  39. package/declaracoes/const.js.map +1 -1
  40. package/declaracoes/funcao.d.ts +5 -2
  41. package/declaracoes/funcao.d.ts.map +1 -1
  42. package/declaracoes/funcao.js +4 -1
  43. package/declaracoes/funcao.js.map +1 -1
  44. package/declaracoes/retorna.d.ts +4 -2
  45. package/declaracoes/retorna.d.ts.map +1 -1
  46. package/declaracoes/retorna.js +7 -1
  47. package/declaracoes/retorna.js.map +1 -1
  48. package/declaracoes/var.d.ts +2 -3
  49. package/declaracoes/var.d.ts.map +1 -1
  50. package/declaracoes/var.js +7 -2
  51. package/declaracoes/var.js.map +1 -1
  52. package/inferenciador.d.ts +1 -1
  53. package/inferenciador.d.ts.map +1 -1
  54. package/inferenciador.js +47 -36
  55. package/inferenciador.js.map +1 -1
  56. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  57. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -2
  58. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  59. package/interpretador/interpretador-base.d.ts.map +1 -1
  60. package/interpretador/interpretador-base.js +9 -0
  61. package/interpretador/interpretador-base.js.map +1 -1
  62. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  63. package/interpretador/pilha-escopos-execucao.js +7 -1
  64. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  65. package/lexador/lexador.d.ts.map +1 -1
  66. package/lexador/lexador.js +3 -0
  67. package/lexador/lexador.js.map +1 -1
  68. package/package.json +1 -1
  69. package/tipo-dados-elementar.d.ts.map +1 -1
  70. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  71. package/tradutores/tradutor-assemblyscript.js +4 -0
  72. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  73. package/umd/delegua.js +242 -74
package/umd/delegua.js CHANGED
@@ -22,7 +22,8 @@ class AvaliadorSintaticoBase {
22
22
  }
23
23
  erro(simbolo, mensagemDeErro) {
24
24
  const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
25
- this.erros.push(excecao);
25
+ // TODO: Estudar remover.
26
+ // this.erros.push(excecao);
26
27
  return excecao;
27
28
  }
28
29
  simboloAnterior() {
@@ -165,7 +166,7 @@ class AvaliadorSintaticoBase {
165
166
  const parametros = [];
166
167
  do {
167
168
  if (parametros.length >= 255) {
168
- this.erro(this.simbolos[this.atual], 'Função não pode ter mais de 255 parâmetros.');
169
+ throw this.erro(this.simbolos[this.atual], 'Função não pode ter mais de 255 parâmetros.');
169
170
  }
170
171
  const parametro = {};
171
172
  if (this.simbolos[this.atual].tipo === comum_1.default.MULTIPLICACAO) {
@@ -255,6 +256,12 @@ const informacao_escopo_1 = require("./informacao-escopo");
255
256
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
256
257
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
257
258
  * Há dois grupos de estruturas de alto nível: Construtos e Declarações.
259
+ *
260
+ * Construtos não existem por si só: cada construto precisa estar dentro de uma declaração para ser
261
+ * aceito pela próxima etapa, como tradução, interpretação, análise semântica, etc.
262
+ *
263
+ * Diferentemente de outros dialetos, em Delégua um construto normalmente retorna um tipo.
264
+ * Por isso a separação deste avaliador sintático do avaliador sintático base.
258
265
  */
259
266
  class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
260
267
  constructor(performance = false) {
@@ -361,9 +368,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
361
368
  if (this.simbolos[this.atual] &&
362
369
  [delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR].includes(this.simbolos[this.atual].tipo)) {
363
370
  const simboloIncrementoDecremento = this.avancarEDevolverAnterior();
364
- return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando), 'DEPOIS');
371
+ return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando || 'qualquer'), 'DEPOIS');
365
372
  }
366
- return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
373
+ return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando || 'qualquer');
367
374
  case delegua_2.default.IMPORTAR:
368
375
  this.avancarEDevolverAnterior();
369
376
  return this.declaracaoImportar();
@@ -514,7 +521,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
514
521
  let expressao = this.bitOu();
515
522
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
516
523
  const operador = this.simbolos[this.atual - 1];
517
- const direito = this.bitOu(); // Única diferença entre esta implementação e base.
524
+ const direito = this.bitOu();
518
525
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
519
526
  }
520
527
  return expressao;
@@ -583,7 +590,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
583
590
  if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
584
591
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
585
592
  }
586
- this.erro(igual, 'Tarefa de atribuição inválida');
593
+ throw this.erro(igual, 'Tarefa de atribuição inválida');
587
594
  }
588
595
  return expressao;
589
596
  }
@@ -659,7 +666,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
659
666
  }
660
667
  declaracaoContinua() {
661
668
  if (this.blocos < 1) {
662
- this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
669
+ throw this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
663
670
  }
664
671
  // Ponto-e-vírgula é opcional aqui.
665
672
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -857,7 +864,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
857
864
  }
858
865
  declaracaoSustar() {
859
866
  if (this.blocos < 1) {
860
- this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
867
+ throw this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
861
868
  }
862
869
  // Ponto-e-vírgula é opcional aqui.
863
870
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -993,7 +1000,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
993
1000
  if (!!simboloAnterior &&
994
1001
  simboloAnterior.tipo === delegua_2.default.IDENTIFICADOR &&
995
1002
  simboloAnterior.linha === simboloAtual.linha) {
996
- this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
1003
+ throw this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
997
1004
  }
998
1005
  }
999
1006
  return this.declaracaoExpressao();
@@ -1036,7 +1043,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1036
1043
  const inicializador = this.expressao();
1037
1044
  const retornos = [];
1038
1045
  for (let identificador of identificadores) {
1039
- // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
1040
1046
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, 'qualquer');
1041
1047
  const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1042
1048
  declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
@@ -1052,7 +1058,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1052
1058
  declaracaoDeVariaveis() {
1053
1059
  const identificadores = [];
1054
1060
  const retorno = [];
1055
- let tipo = null;
1061
+ let tipo = 'qualquer';
1056
1062
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1057
1063
  return this.declaracaoDesestruturacaoVariavel();
1058
1064
  }
@@ -1082,8 +1088,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1082
1088
  }
1083
1089
  for (let [indice, identificador] of identificadores.entries()) {
1084
1090
  // Se tipo ainda não foi definido, infere.
1085
- if (!tipo) {
1091
+ if (tipo === 'qualquer') {
1086
1092
  switch (inicializadores[indice].constructor.name) {
1093
+ case 'AcessoIndiceVariavel':
1094
+ const entidadeChamada = inicializadores[indice].entidadeChamada;
1095
+ tipo = entidadeChamada.tipo.slice(0, -2);
1096
+ break;
1087
1097
  case 'Dupla':
1088
1098
  case 'Trio':
1089
1099
  case 'Quarteto':
@@ -1096,6 +1106,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1096
1106
  tipo = delegua_1.default.TUPLA;
1097
1107
  break;
1098
1108
  case 'Literal':
1109
+ case 'Variavel':
1099
1110
  case 'Vetor':
1100
1111
  tipo = inicializadores[indice].tipo;
1101
1112
  break;
@@ -1132,7 +1143,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1132
1143
  */
1133
1144
  declaracaoDeConstantes() {
1134
1145
  const identificadores = [];
1135
- let tipo = null;
1146
+ let tipo = 'qualquer';
1136
1147
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1137
1148
  return this.declaracaoDesestruturacaoConstante();
1138
1149
  }
@@ -1153,8 +1164,29 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1153
1164
  }
1154
1165
  let retorno = [];
1155
1166
  for (let [indice, identificador] of identificadores.entries()) {
1156
- if (!tipo) {
1157
- tipo = (0, inferenciador_1.inferirTipoVariavel)(inicializadores[indice]);
1167
+ if (tipo === 'qualquer') {
1168
+ switch (inicializadores[indice].constructor.name) {
1169
+ case 'AcessoIndiceVariavel':
1170
+ const entidadeChamada = inicializadores[indice].entidadeChamada;
1171
+ tipo = entidadeChamada.tipo.slice(0, -2);
1172
+ break;
1173
+ case 'Dupla':
1174
+ case 'Trio':
1175
+ case 'Quarteto':
1176
+ case 'Quinteto':
1177
+ case 'Sexteto':
1178
+ case 'Septeto':
1179
+ case 'Octeto':
1180
+ case 'Noneto':
1181
+ case 'Deceto':
1182
+ tipo = delegua_1.default.TUPLA;
1183
+ break;
1184
+ case 'Literal':
1185
+ case 'Variavel':
1186
+ case 'Vetor':
1187
+ tipo = inicializadores[indice].tipo;
1188
+ break;
1189
+ }
1158
1190
  }
1159
1191
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1160
1192
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
@@ -1180,7 +1212,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1180
1212
  this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
1181
1213
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1182
1214
  this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno || 'qualquer');
1183
- return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, null, decoradores);
1215
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno || 'qualquer', decoradores);
1184
1216
  }
1185
1217
  logicaComumParametros() {
1186
1218
  const parametros = [];
@@ -1210,6 +1242,45 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1210
1242
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1211
1243
  return parametros;
1212
1244
  }
1245
+ *buscarRetornosEmBloco(construtoBloco) {
1246
+ for (const declaracao of construtoBloco.declaracoes) {
1247
+ if (declaracao.constructor.name === 'Retorna') {
1248
+ yield declaracao;
1249
+ }
1250
+ }
1251
+ }
1252
+ *buscarRetornosEmSe(construtoSe) {
1253
+ const blocoEntao = construtoSe.caminhoEntao;
1254
+ for (const declaracao of this.buscarRetornosEmBloco(blocoEntao)) {
1255
+ if (declaracao.constructor.name === 'Retorna') {
1256
+ yield declaracao;
1257
+ }
1258
+ }
1259
+ const blocoSenao = construtoSe.caminhoSenao;
1260
+ if (!blocoSenao)
1261
+ return;
1262
+ for (const declaracao of blocoSenao.declaracoes) {
1263
+ if (declaracao.constructor.name === 'Retorna') {
1264
+ yield declaracao;
1265
+ }
1266
+ }
1267
+ }
1268
+ buscarRetornos(declaracao) {
1269
+ let retornasEncontrados = [];
1270
+ switch (declaracao.constructor.name) {
1271
+ case 'Retorna':
1272
+ retornasEncontrados.push(declaracao);
1273
+ break;
1274
+ case 'Se':
1275
+ for (const retorna of this.buscarRetornosEmSe(declaracao)) {
1276
+ retornasEncontrados.push(retorna);
1277
+ }
1278
+ break;
1279
+ default:
1280
+ break;
1281
+ }
1282
+ return retornasEncontrados;
1283
+ }
1213
1284
  corpoDaFuncao(tipo) {
1214
1285
  // O parêntese esquerdo é considerado o símbolo inicial para
1215
1286
  // fins de pragma.
@@ -1226,6 +1297,31 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1226
1297
  }
1227
1298
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1228
1299
  const corpo = this.blocoEscopo();
1300
+ let expressoesRetorna = [];
1301
+ for (const declaracao of corpo) {
1302
+ expressoesRetorna = expressoesRetorna.concat(this.buscarRetornos(declaracao));
1303
+ }
1304
+ if (tipoRetorno === 'vazio' && expressoesRetorna.length > 0) {
1305
+ const retornosNaoVazios = expressoesRetorna.filter(e => e.tipo !== 'vazio');
1306
+ if (retornosNaoVazios.length > 0) {
1307
+ throw this.erro(retornosNaoVazios[0].simboloChave, `Função declara explicitamente 'vazio', mas usa expressão 'retorna' com tipo de retorno diferente de vazio.`);
1308
+ }
1309
+ }
1310
+ const tiposRetornos = new Set(expressoesRetorna.map(e => e.tipo));
1311
+ // if (tiposRetornos.size > 1 && !tiposRetornos.has('qualquer')) {
1312
+ if (tiposRetornos.size > 1 && tipoRetorno !== 'qualquer') {
1313
+ let tiposEncontrados = Array.from(tiposRetornos).reduce((acumulador, valor) => acumulador += valor + ', ', '');
1314
+ tiposEncontrados = tiposEncontrados.slice(0, -2);
1315
+ throw this.erro(parenteseEsquerdo, `Função retorna valores com mais de um tipo. Tipo esperado: ${tipoRetorno}. Tipos encontrados: ${tiposEncontrados}.`);
1316
+ }
1317
+ tiposRetornos.delete('qualquer');
1318
+ if (tipoRetorno === 'qualquer' && tiposRetornos.size === 1) {
1319
+ // Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
1320
+ // este avaliador sintático pode restringir o tipo baseado nos retornos
1321
+ // encontrados nos blocos internos da função.
1322
+ const tipoRetornoDeduzido = tiposRetornos.values().next().value;
1323
+ tipoRetorno = tipoRetornoDeduzido;
1324
+ }
1229
1325
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
1230
1326
  }
1231
1327
  declaracaoDeClasse() {
@@ -1234,6 +1330,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1234
1330
  let superClasse = null;
1235
1331
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
1236
1332
  const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
1333
+ // TODO: Colocar tipo aqui?
1237
1334
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
1238
1335
  }
1239
1336
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
@@ -1367,7 +1464,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1367
1464
  if (Array.isArray(retornoDeclaracao)) {
1368
1465
  declaracoes = declaracoes.concat(retornoDeclaracao);
1369
1466
  }
1370
- else {
1467
+ else if (retornoDeclaracao !== null) {
1371
1468
  declaracoes.push(retornoDeclaracao);
1372
1469
  }
1373
1470
  }
@@ -1703,7 +1800,7 @@ class AvaliadorSintaticoEguaClassico {
1703
1800
  else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
1704
1801
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, 0, expressao.entidadeChamada, expressao.indice, valor);
1705
1802
  }
1706
- this.erro(igual, 'Tarefa de atribuição inválida');
1803
+ throw this.erro(igual, 'Tarefa de atribuição inválida');
1707
1804
  }
1708
1805
  return expressao;
1709
1806
  }
@@ -1800,14 +1897,14 @@ class AvaliadorSintaticoEguaClassico {
1800
1897
  }
1801
1898
  declaracaoSustar() {
1802
1899
  if (this.blocos < 1) {
1803
- this.erro(this.simboloAnterior(), "'pausa' deve estar dentro de um loop.");
1900
+ throw this.erro(this.simboloAnterior(), "'pausa' deve estar dentro de um loop.");
1804
1901
  }
1805
1902
  this.consumir(egua_classico_1.default.PONTO_E_VIRGULA, "Esperado ';' após 'pausa'.");
1806
1903
  return new declaracoes_1.Sustar(this.simboloAtual());
1807
1904
  }
1808
1905
  declaracaoContinua() {
1809
1906
  if (this.blocos < 1) {
1810
- this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
1907
+ throw this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
1811
1908
  }
1812
1909
  this.consumir(egua_classico_1.default.PONTO_E_VIRGULA, "Esperado ';' após 'continua'.");
1813
1910
  return new declaracoes_1.Continua(this.simboloAtual());
@@ -1958,7 +2055,7 @@ class AvaliadorSintaticoEguaClassico {
1958
2055
  if (!this.verificarTipoSimboloAtual(egua_classico_1.default.PARENTESE_DIREITO)) {
1959
2056
  do {
1960
2057
  if (parametros.length >= 255) {
1961
- this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
2058
+ throw this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
1962
2059
  }
1963
2060
  const parametro = {};
1964
2061
  if (this.simboloAtual().tipo === egua_classico_1.default.MULTIPLICACAO) {
@@ -2373,13 +2470,13 @@ class AvaliadorSintaticoPitugues {
2373
2470
  const simbolo = expressao.simbolo;
2374
2471
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
2375
2472
  }
2376
- else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
2473
+ if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
2377
2474
  return new construtos_1.DefinirValor(this.hashArquivo, 0, expressao.objeto, expressao.simbolo, valor);
2378
2475
  }
2379
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
2476
+ if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
2380
2477
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, 0, expressao.entidadeChamada, expressao.indice, valor);
2381
2478
  }
2382
- this.erro(igual, 'Tarefa de atribuição inválida');
2479
+ throw this.erro(igual, 'Tarefa de atribuição inválida');
2383
2480
  }
2384
2481
  return expressao;
2385
2482
  }
@@ -2432,7 +2529,7 @@ class AvaliadorSintaticoPitugues {
2432
2529
  let espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
2433
2530
  const espacosIndentacaoLinhaAnterior = this.pragmas[simboloAnterior.linha].espacosIndentacao;
2434
2531
  if (espacosIndentacaoLinhaAtual <= espacosIndentacaoLinhaAnterior) {
2435
- this.erro(simboloAtual, `Indentação inconsistente na linha ${simboloAtual.linha}. ` +
2532
+ throw this.erro(simboloAtual, `Indentação inconsistente na linha ${simboloAtual.linha}. ` +
2436
2533
  `Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
2437
2534
  `Atual: ${espacosIndentacaoLinhaAtual}`);
2438
2535
  }
@@ -2566,13 +2663,13 @@ class AvaliadorSintaticoPitugues {
2566
2663
  }
2567
2664
  declaracaoSustar() {
2568
2665
  if (this.blocos < 1) {
2569
- this.erro(this.simboloAnterior(), "'sustar' deve estar dentro de um laço de repetição.");
2666
+ throw this.erro(this.simboloAnterior(), "'sustar' deve estar dentro de um laço de repetição.");
2570
2667
  }
2571
2668
  return new declaracoes_1.Sustar(this.simboloAtual());
2572
2669
  }
2573
2670
  declaracaoContinua() {
2574
2671
  if (this.blocos < 1) {
2575
- this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
2672
+ throw this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
2576
2673
  }
2577
2674
  return new declaracoes_1.Continua(this.simboloAtual());
2578
2675
  }
@@ -2701,7 +2798,7 @@ class AvaliadorSintaticoPitugues {
2701
2798
  const parametros = [];
2702
2799
  do {
2703
2800
  if (parametros.length >= 255) {
2704
- this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
2801
+ throw this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
2705
2802
  }
2706
2803
  const parametro = {};
2707
2804
  if (this.simboloAtual().tipo === pitugues_1.default.MULTIPLICACAO) {
@@ -2847,7 +2944,7 @@ class AvaliadorSintaticoPortugolIpt extends avaliador_sintatico_base_1.Avaliador
2847
2944
  else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
2848
2945
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
2849
2946
  }
2850
- this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
2947
+ throw this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
2851
2948
  }
2852
2949
  return expressao;
2853
2950
  }
@@ -2907,7 +3004,7 @@ class AvaliadorSintaticoPortugolIpt extends avaliador_sintatico_base_1.Avaliador
2907
3004
  const literalInicializacao = this.consumir(portugol_ipt_1.default.INTEIRO, 'Esperado literal inteiro após símbolo de igual em declaração de variável.');
2908
3005
  valorInicializacao = Number(literalInicializacao.literal);
2909
3006
  }
2910
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloInteiro.linha), valorInicializacao)));
3007
+ inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloInteiro.linha), valorInicializacao, 'inteiro')));
2911
3008
  } while (this.verificarSeSimboloAtualEIgualA(portugol_ipt_1.default.VIRGULA));
2912
3009
  return inicializacoes;
2913
3010
  }
@@ -4118,11 +4215,12 @@ exports.AcessoMetodoOuPropriedade = void 0;
4118
4215
  * classe.
4119
4216
  */
4120
4217
  class AcessoMetodoOuPropriedade {
4121
- constructor(hashArquivo, objeto, simbolo) {
4218
+ constructor(hashArquivo, objeto, simbolo, tipo = 'qualquer') {
4122
4219
  this.linha = objeto.linha;
4123
4220
  this.hashArquivo = hashArquivo;
4124
4221
  this.objeto = objeto;
4125
4222
  this.simbolo = simbolo;
4223
+ this.tipo = objeto.tipo || tipo;
4126
4224
  }
4127
4225
  async aceitar(visitante) {
4128
4226
  return await visitante.visitarExpressaoAcessoMetodo(this);
@@ -4144,6 +4242,7 @@ class Agrupamento {
4144
4242
  this.linha = linha;
4145
4243
  this.hashArquivo = hashArquivo;
4146
4244
  this.expressao = expressao;
4245
+ this.tipo = expressao.tipo;
4147
4246
  }
4148
4247
  async aceitar(visitante) {
4149
4248
  return await visitante.visitarExpressaoAgrupamento(this);
@@ -4242,11 +4341,28 @@ exports.Binario = void 0;
4242
4341
  */
4243
4342
  class Binario {
4244
4343
  constructor(hashArquivo, esquerda, operador, direita) {
4344
+ this.tipo = 'qualquer';
4245
4345
  this.linha = esquerda.linha;
4246
4346
  this.hashArquivo = hashArquivo;
4247
4347
  this.esquerda = esquerda;
4248
4348
  this.operador = operador;
4249
4349
  this.direita = direita;
4350
+ this.tipo = this.deduzirTipo();
4351
+ }
4352
+ deduzirTipo() {
4353
+ if (['logico', 'lógico'].includes(this.esquerda.tipo) || ['logico', 'lógico'].includes(this.direita.tipo)) {
4354
+ return 'lógico';
4355
+ }
4356
+ if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
4357
+ return 'texto';
4358
+ }
4359
+ if (this.esquerda.tipo === 'inteiro' && this.direita.tipo === 'inteiro') {
4360
+ return 'inteiro';
4361
+ }
4362
+ if (['numero', 'número'].includes(this.esquerda.tipo) || ['numero', 'número'].includes(this.direita.tipo)) {
4363
+ return 'número';
4364
+ }
4365
+ return 'qualquer';
4250
4366
  }
4251
4367
  async aceitar(visitante) {
4252
4368
  return await visitante.visitarExpressaoBinaria(this);
@@ -5042,11 +5158,16 @@ const declaracao_1 = require("./declaracao");
5042
5158
  * Uma declaração de constante.
5043
5159
  */
5044
5160
  class Const extends declaracao_1.Declaracao {
5045
- constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5161
+ constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
5046
5162
  super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5047
5163
  this.simbolo = simbolo;
5048
5164
  this.inicializador = inicializador;
5049
- this.tipo = tipo;
5165
+ if (tipo !== 'qualquer') {
5166
+ this.tipo = tipo;
5167
+ }
5168
+ else {
5169
+ this.tipo = (inicializador === null || inicializador === void 0 ? void 0 : inicializador.tipo) || tipo;
5170
+ }
5050
5171
  }
5051
5172
  async aceitar(visitante) {
5052
5173
  return await visitante.visitarDeclaracaoConst(this);
@@ -5214,8 +5335,11 @@ exports.Fazer = Fazer;
5214
5335
  Object.defineProperty(exports, "__esModule", { value: true });
5215
5336
  exports.FuncaoDeclaracao = void 0;
5216
5337
  const declaracao_1 = require("./declaracao");
5338
+ /**
5339
+ * Uma declaração de função.
5340
+ */
5217
5341
  class FuncaoDeclaracao extends declaracao_1.Declaracao {
5218
- constructor(simbolo, funcao, tipoRetorno, decoradores = []) {
5342
+ constructor(simbolo, funcao, tipoRetorno = 'qualquer', decoradores = []) {
5219
5343
  super(Number(simbolo.linha), simbolo.hashArquivo);
5220
5344
  this.simbolo = simbolo;
5221
5345
  this.funcao = funcao;
@@ -5427,7 +5551,13 @@ class Retorna extends declaracao_1.Declaracao {
5427
5551
  constructor(simboloChave, valor) {
5428
5552
  super(Number(simboloChave.linha), simboloChave.hashArquivo);
5429
5553
  this.simboloChave = simboloChave;
5430
- this.valor = valor;
5554
+ if (valor) {
5555
+ this.valor = valor;
5556
+ this.tipo = valor.tipo;
5557
+ }
5558
+ else {
5559
+ this.tipo = 'vazio';
5560
+ }
5431
5561
  }
5432
5562
  async aceitar(visitante) {
5433
5563
  return await visitante.visitarExpressaoRetornar(this);
@@ -5545,11 +5675,16 @@ const declaracao_1 = require("./declaracao");
5545
5675
  * Uma declaração de variável.
5546
5676
  */
5547
5677
  class Var extends declaracao_1.Declaracao {
5548
- constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5678
+ constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
5549
5679
  super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5550
5680
  this.simbolo = simbolo;
5551
5681
  this.inicializador = inicializador;
5552
- this.tipo = tipo;
5682
+ if (tipo !== 'qualquer') {
5683
+ this.tipo = tipo;
5684
+ }
5685
+ else {
5686
+ this.tipo = (inicializador === null || inicializador === void 0 ? void 0 : inicializador.tipo) || tipo;
5687
+ }
5553
5688
  this.referencia = false;
5554
5689
  this.desestruturacao = false;
5555
5690
  }
@@ -6942,7 +7077,7 @@ var TipoNativoSimbolo;
6942
7077
  TipoNativoSimbolo["VAZIO"] = "<palavra reservada vazio ajuda=\"palavra reservada usada para definir fun\u00E7\u00F5es que n\u00E3o retornam valores\">";
6943
7078
  })(TipoNativoSimbolo || (exports.TipoNativoSimbolo = TipoNativoSimbolo = {}));
6944
7079
  function inferirVetor(vetor) {
6945
- const tiposEmVetor = new Set(vetor.map((elemento) => typeof elemento));
7080
+ const tiposEmVetor = new Set(vetor.map((elemento) => elemento.constructor.name));
6946
7081
  if (tiposEmVetor.size > 1) {
6947
7082
  return 'vetor';
6948
7083
  }
@@ -6962,62 +7097,73 @@ function inferirVetor(vetor) {
6962
7097
  return 'vetor';
6963
7098
  }
6964
7099
  return `${tiposObjetosEmVetor.values().next().value}[]`;
7100
+ case 'Literal':
7101
+ // TODO: Não sei se é seguro inferir pelo primeiro valor do vetor.
7102
+ return `${vetor[0].tipo}[]`;
6965
7103
  default:
6966
7104
  return 'vetor';
6967
7105
  }
6968
7106
  }
6969
7107
  function inferirTipoVariavel(variavel) {
6970
- const tipo = typeof variavel;
7108
+ if (variavel === null) {
7109
+ return 'nulo';
7110
+ }
7111
+ const tipo = variavel.constructor.name;
6971
7112
  switch (tipo) {
7113
+ case 'String':
6972
7114
  case 'string':
6973
7115
  return 'texto';
7116
+ case 'Number':
6974
7117
  case 'number':
6975
7118
  return 'número';
6976
7119
  case 'bigint':
6977
7120
  return 'longo';
7121
+ case 'Boolean':
6978
7122
  case 'boolean':
6979
7123
  return 'lógico';
6980
7124
  case 'undefined':
6981
7125
  return 'nulo';
7126
+ case 'Object':
6982
7127
  case 'object':
6983
- if (Array.isArray(variavel)) {
6984
- return inferirVetor(variavel);
6985
- }
6986
7128
  if (variavel === null)
6987
7129
  return 'nulo';
6988
- if (variavel.constructor.name === 'DeleguaFuncao')
6989
- return 'função';
6990
- if (variavel.constructor.name === 'DeleguaModulo')
6991
- return 'módulo';
6992
- if (variavel.constructor.name === 'Classe')
6993
- return 'objeto';
6994
- if (variavel.constructor.name === 'Simbolo') {
6995
- if (typeof variavel === 'object') {
6996
- const simbolo = variavel;
6997
- if (simbolo.tipo === delegua_2.default.ESCREVA)
6998
- return TipoNativoSimbolo.ESCREVA;
6999
- if (simbolo.tipo === delegua_2.default.FUNCAO || simbolo.tipo === delegua_2.default.FUNÇÃO)
7000
- return TipoNativoSimbolo.FUNCAO;
7001
- if (simbolo.tipo === delegua_2.default.LEIA)
7002
- return TipoNativoSimbolo.LEIA;
7003
- if (simbolo.tipo === delegua_2.default.SE)
7004
- return TipoNativoSimbolo.SE;
7005
- if (simbolo.tipo === delegua_2.default.ENQUANTO)
7006
- return TipoNativoSimbolo.ENQUANTO;
7007
- if (simbolo.tipo === delegua_2.default.PARA)
7008
- return TipoNativoSimbolo.PARA;
7009
- if (simbolo.tipo === delegua_2.default.RETORNA)
7010
- return TipoNativoSimbolo.RETORNA;
7011
- if (simbolo.tipo === primitivos_1.default.TEXTO)
7012
- return TipoNativoSimbolo.TEXTO;
7013
- if (simbolo.tipo === primitivos_1.default.BOOLEANO)
7014
- return TipoNativoSimbolo.BOOLEANO;
7015
- if (simbolo.tipo === delegua_1.default.VAZIO)
7016
- return TipoNativoSimbolo.VAZIO;
7017
- }
7018
- }
7019
7130
  return 'dicionário';
7131
+ case 'Array':
7132
+ case 'Vetor':
7133
+ return inferirVetor(variavel);
7134
+ case 'DeleguaFuncao':
7135
+ return 'função';
7136
+ case 'DeleguaModulo':
7137
+ return 'módulo';
7138
+ case 'Classe':
7139
+ return 'objeto';
7140
+ case 'Simbolo': // TODO: Repensar.
7141
+ const simbolo = variavel;
7142
+ switch (simbolo.tipo) {
7143
+ case primitivos_1.default.BOOLEANO:
7144
+ return TipoNativoSimbolo.BOOLEANO;
7145
+ case delegua_2.default.ENQUANTO:
7146
+ return TipoNativoSimbolo.ENQUANTO;
7147
+ case delegua_2.default.ESCREVA:
7148
+ return TipoNativoSimbolo.ESCREVA;
7149
+ case delegua_2.default.FUNCAO:
7150
+ case delegua_2.default.FUNÇÃO:
7151
+ return TipoNativoSimbolo.FUNCAO;
7152
+ case delegua_2.default.LEIA:
7153
+ return TipoNativoSimbolo.LEIA;
7154
+ case delegua_2.default.PARA:
7155
+ return TipoNativoSimbolo.PARA;
7156
+ case delegua_2.default.RETORNA:
7157
+ return TipoNativoSimbolo.RETORNA;
7158
+ case delegua_2.default.SE:
7159
+ return TipoNativoSimbolo.SE;
7160
+ case primitivos_1.default.TEXTO:
7161
+ return TipoNativoSimbolo.TEXTO;
7162
+ case delegua_1.default.VAZIO:
7163
+ return TipoNativoSimbolo.VAZIO;
7164
+ }
7020
7165
  case 'function':
7166
+ case 'FuncaoPadrao':
7021
7167
  return 'função';
7022
7168
  case 'symbol':
7023
7169
  return 'símbolo';
@@ -7627,6 +7773,10 @@ class InterpretadorBase {
7627
7773
  : String(NaN);
7628
7774
  if (this.tiposNumericos.includes(tipoDireita) && this.tiposNumericos.includes(tipoEsquerda))
7629
7775
  return;
7776
+ if (this.tiposNumericos.includes(tipoEsquerda) && tipoDireita === 'qualquer')
7777
+ return;
7778
+ if (this.tiposNumericos.includes(tipoDireita) && tipoEsquerda === 'qualquer')
7779
+ return;
7630
7780
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
7631
7781
  }
7632
7782
  async visitarExpressaoBinaria(expressao) {
@@ -7665,6 +7815,11 @@ class InterpretadorBase {
7665
7815
  if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
7666
7816
  return Number(valorEsquerdo) + Number(valorDireito);
7667
7817
  }
7818
+ // TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
7819
+ // tradicionais do JavaScript?
7820
+ if (tipoEsquerdo === 'qualquer' || tipoDireito === 'qualquer') {
7821
+ return valorEsquerdo + valorDireito;
7822
+ }
7668
7823
  return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
7669
7824
  case delegua_1.default.DIVISAO:
7670
7825
  case delegua_1.default.DIVISAO_IGUAL:
@@ -9327,6 +9482,9 @@ class PilhaEscoposExecucao {
9327
9482
  if (variavel && variavel.hasOwnProperty('tipo')) {
9328
9483
  tipoVariavel = variavel.tipo;
9329
9484
  }
9485
+ else if (valor && valor.constructor.name === 'DeleguaFuncao') {
9486
+ tipoVariavel = 'função';
9487
+ }
9330
9488
  else if (tipo) {
9331
9489
  tipoVariavel = tipo;
9332
9490
  }
@@ -9375,7 +9533,10 @@ class PilhaEscoposExecucao {
9375
9533
  if (variavel.imutavel) {
9376
9534
  throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Constante '${simbolo.lexema}' não pode receber novos valores.`);
9377
9535
  }
9378
- const tipo = (variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : (0, inferenciador_1.inferirTipoVariavel)(valor)).toLowerCase();
9536
+ const tipoInferido = variavel && variavel.hasOwnProperty('tipo') && variavel.tipo ?
9537
+ variavel.tipo :
9538
+ (0, inferenciador_1.inferirTipoVariavel)(valor);
9539
+ const tipo = tipoInferido.toLowerCase();
9379
9540
  const valorResolvido = this.converterValor(tipo, valor);
9380
9541
  if (indice !== undefined && indice !== null) {
9381
9542
  if (variavel.valor instanceof Array) {
@@ -11258,6 +11419,9 @@ class Lexador {
11258
11419
  this.atual = 0;
11259
11420
  this.linha = 0;
11260
11421
  this.codigo = codigo || [''];
11422
+ if (codigo.length === 0) {
11423
+ this.codigo = [''];
11424
+ }
11261
11425
  this.hashArquivo = hashArquivo;
11262
11426
  for (let iterador = 0; iterador < this.codigo.length; iterador++) {
11263
11427
  this.codigo[iterador] += '\0';
@@ -24645,9 +24809,12 @@ class TradutorAssemblyScript {
24645
24809
  case 'texto':
24646
24810
  return ': string';
24647
24811
  case 'inteiro':
24812
+ case 'numero':
24813
+ case 'número':
24648
24814
  case 'real':
24649
24815
  return ': f64';
24650
24816
  case 'logico':
24817
+ case 'lógico':
24651
24818
  return ': bool';
24652
24819
  case 'nulo':
24653
24820
  return ': null';
@@ -24657,6 +24824,7 @@ class TradutorAssemblyScript {
24657
24824
  case 'texto[]':
24658
24825
  return ': string[]';
24659
24826
  case 'logico[]':
24827
+ case 'lógico[]':
24660
24828
  return ': bool[]';
24661
24829
  default:
24662
24830
  return ': any';