@designliquido/delegua 1.7.2 → 1.8.0

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 (104) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +10 -1
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +89 -0
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/analisador-semantico/analisador-semantico.d.ts +3 -9
  6. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  7. package/analisador-semantico/analisador-semantico.js +15 -59
  8. package/analisador-semantico/analisador-semantico.js.map +1 -1
  9. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +5 -6
  10. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  11. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +36 -46
  12. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  13. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +2 -1
  14. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  15. package/avaliador-sintatico/avaliador-sintatico-base.js +4 -0
  16. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  17. package/avaliador-sintatico/avaliador-sintatico.d.ts +8 -1
  18. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  19. package/avaliador-sintatico/avaliador-sintatico.js +57 -24
  20. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +19 -13
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
  25. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +1 -2
  26. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  27. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  28. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +1 -2
  29. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  30. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
  31. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js +1 -2
  32. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
  33. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
  34. package/avaliador-sintatico/micro-avaliador-sintatico.js +10 -17
  35. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  36. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  37. package/bibliotecas/biblioteca-global.js +8 -42
  38. package/bibliotecas/biblioteca-global.js.map +1 -1
  39. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  40. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +4 -40
  41. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  42. package/bin/package.json +1 -1
  43. package/construtos/atribuir.d.ts.map +1 -1
  44. package/construtos/atribuir.js +9 -4
  45. package/construtos/atribuir.js.map +1 -1
  46. package/construtos/literal.d.ts +3 -3
  47. package/construtos/literal.d.ts.map +1 -1
  48. package/construtos/literal.js.map +1 -1
  49. package/declaracoes/const-multiplo.d.ts +3 -3
  50. package/declaracoes/const-multiplo.d.ts.map +1 -1
  51. package/declaracoes/const-multiplo.js.map +1 -1
  52. package/declaracoes/se.d.ts +6 -2
  53. package/declaracoes/se.d.ts.map +1 -1
  54. package/declaracoes/se.js.map +1 -1
  55. package/declaracoes/var-multiplo.d.ts +3 -3
  56. package/declaracoes/var-multiplo.d.ts.map +1 -1
  57. package/declaracoes/var-multiplo.js.map +1 -1
  58. package/inferenciador.d.ts +1 -3
  59. package/inferenciador.d.ts.map +1 -1
  60. package/inferenciador.js +0 -8
  61. package/inferenciador.js.map +1 -1
  62. package/interfaces/interpretador-com-depuracao-interface.d.ts +1 -1
  63. package/interfaces/interpretador-com-depuracao-interface.d.ts.map +1 -1
  64. package/interfaces/variavel-hipotetica-interface.d.ts +2 -2
  65. package/interfaces/variavel-hipotetica-interface.d.ts.map +1 -1
  66. package/interpretador/depuracao/comum.d.ts +2 -1
  67. package/interpretador/depuracao/comum.d.ts.map +1 -1
  68. package/interpretador/depuracao/comum.js +27 -1
  69. package/interpretador/depuracao/comum.js.map +1 -1
  70. package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts +2 -1
  71. package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts.map +1 -1
  72. package/interpretador/depuracao/interpretador-base-com-depuracao.js +3 -0
  73. package/interpretador/depuracao/interpretador-base-com-depuracao.js.map +1 -1
  74. package/interpretador/depuracao/interpretador-com-depuracao.d.ts +2 -1
  75. package/interpretador/depuracao/interpretador-com-depuracao.d.ts.map +1 -1
  76. package/interpretador/depuracao/interpretador-com-depuracao.js +3 -0
  77. package/interpretador/depuracao/interpretador-com-depuracao.js.map +1 -1
  78. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  79. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -10
  80. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  81. package/interpretador/interpretador-base.d.ts.map +1 -1
  82. package/interpretador/interpretador-base.js +0 -1
  83. package/interpretador/interpretador-base.js.map +1 -1
  84. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +1 -0
  85. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -1
  86. package/lexador/dialetos/palavras-reservadas/pitugues.js +1 -0
  87. package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -1
  88. package/package.json +1 -1
  89. package/tipos-de-simbolos/comum.d.ts +1 -0
  90. package/tipos-de-simbolos/comum.d.ts.map +1 -1
  91. package/tipos-de-simbolos/comum.js +1 -0
  92. package/tipos-de-simbolos/comum.js.map +1 -1
  93. package/tipos-de-simbolos/pitugues.d.ts +1 -0
  94. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  95. package/tipos-de-simbolos/pitugues.js +1 -0
  96. package/tipos-de-simbolos/pitugues.js.map +1 -1
  97. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  98. package/tradutores/tradutor-javascript.js +57 -23
  99. package/tradutores/tradutor-javascript.js.map +1 -1
  100. package/umd/delegua.js +275 -198
  101. package/tipo-dados-elementar.d.ts +0 -2
  102. package/tipo-dados-elementar.d.ts.map +0 -1
  103. package/tipo-dados-elementar.js +0 -3
  104. package/tipo-dados-elementar.js.map +0 -1
package/umd/delegua.js CHANGED
@@ -56,6 +56,95 @@ class AnalisadorSemanticoBase {
56
56
  correcoes: correcoes,
57
57
  });
58
58
  }
59
+ comparacaoArgumentosContraParametrosFuncao(simboloFuncao, parametros, argumentos) {
60
+ if (parametros.length !== argumentos.length) {
61
+ this.erro(simboloFuncao, `Função '${simboloFuncao.lexema}' espera ${parametros.length} parâmetros. Atual: ${argumentos.length}.`);
62
+ }
63
+ for (let [indice, parametro] of parametros.entries()) {
64
+ const argumento = argumentos[indice];
65
+ if (argumento) {
66
+ // Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
67
+ // independentemente de ser um `Literal` (tipo já resolvido), `Variavel` (tipo inferido do
68
+ // escopo), `Binario`, `Agrupamento`, ou qualquer outro construto (retorna `null` quando
69
+ // o tipo não pode ser determinado em tempo de compilação).
70
+ const tipoArgumento = this.obterTipoExpressao(argumento);
71
+ // Validar apenas quando ambos os lados têm um tipo específico e determinável.
72
+ // Ignorar quando `tipoArgumento` é nulo (por exemplo, resultado de `Chamada`) ou `qualquer`,
73
+ // evitando falsos positivos para expressões cujo tipo é desconhecido em tempo de compilação.
74
+ if (tipoArgumento && tipoArgumento !== 'qualquer' && parametro.tipoDado) {
75
+ if (parametro.tipoDado === 'texto' && tipoArgumento !== 'texto') {
76
+ this.erro(simboloFuncao, `O valor passado para o parâmetro '${parametro.nome.lexema}' (${parametro.tipoDado}) é diferente do esperado pela função (${tipoArgumento}).`);
77
+ }
78
+ else if (['inteiro', 'número', 'real'].includes(parametro.tipoDado)) {
79
+ // Delegua suporta conversões implícitas entre tipos numéricos, mas não
80
+ // entre texto e número.
81
+ if (!['inteiro', 'número', 'real'].includes(tipoArgumento)) {
82
+ this.erro(simboloFuncao, `O valor passado para o parâmetro '${parametro.nome.lexema}' (${parametro.tipoDado}) é diferente do esperado pela função (${tipoArgumento}).`);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
91
+ */
92
+ obterTipoExpressao(expressao) {
93
+ if (expressao instanceof construtos_1.Literal) {
94
+ return expressao.tipo;
95
+ }
96
+ if (expressao instanceof construtos_1.Variavel) {
97
+ const variavel = this.gerenciadorEscopos.buscar(expressao.simbolo.lexema);
98
+ return (variavel === null || variavel === void 0 ? void 0 : variavel.tipo) || null;
99
+ }
100
+ if (expressao instanceof construtos_1.Binario) {
101
+ // Para binários, tentamos inferir o tipo baseado nos operandos
102
+ return this.inferirTipoBinario(expressao);
103
+ }
104
+ if (expressao instanceof construtos_1.Logico) {
105
+ // Operadores lógicos sempre retornam tipo lógico
106
+ return 'lógico';
107
+ }
108
+ if (expressao instanceof construtos_1.Agrupamento) {
109
+ return this.obterTipoExpressao(expressao.expressao);
110
+ }
111
+ if (expressao instanceof construtos_1.Leia) {
112
+ // leia() sempre retorna texto
113
+ return 'texto';
114
+ }
115
+ return null;
116
+ }
117
+ /**
118
+ * Infere o tipo de resultado de uma operação binária
119
+ */
120
+ inferirTipoBinario(binario) {
121
+ const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
122
+ const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
123
+ // Operadores de comparação sempre retornam lógico
124
+ if (operadoresComparacao.includes(binario.operador.tipo)) {
125
+ return 'lógico';
126
+ }
127
+ const tipoEsquerda = this.obterTipoExpressao(binario.esquerda);
128
+ const tipoDireita = this.obterTipoExpressao(binario.direita);
129
+ if (!tipoEsquerda || !tipoDireita) {
130
+ return null;
131
+ }
132
+ if (operadoresMatematicos.includes(binario.operador.tipo)) {
133
+ const tiposNumericos = ['inteiro', 'número', 'real'];
134
+ if (tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita)) {
135
+ // Se um dos lados é 'real', o resultado é 'real'
136
+ if (tipoEsquerda === 'real' || tipoDireita === 'real') {
137
+ return 'real';
138
+ }
139
+ return 'número';
140
+ }
141
+ // Concatenação de textos
142
+ if (tipoEsquerda === 'texto' || tipoDireita === 'texto') {
143
+ return 'texto';
144
+ }
145
+ }
146
+ return 'qualquer';
147
+ }
59
148
  /**
60
149
  * Marca as variáveis usadas em uma expressão.
61
150
  */
@@ -375,6 +464,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
375
464
  this.pilhaVariaveis = new pilha_variaveis_1.PilhaVariaveis();
376
465
  this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
377
466
  this.funcoes = {};
467
+ this.classesDeclararadas = new Set();
378
468
  this.atual = 0;
379
469
  this.diagnosticos = [];
380
470
  }
@@ -879,65 +969,6 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
879
969
  return null;
880
970
  }
881
971
  }
882
- /**
883
- * Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
884
- */
885
- obterTipoExpressao(expressao) {
886
- if (expressao instanceof construtos_1.Literal) {
887
- return expressao.tipo;
888
- }
889
- if (expressao instanceof construtos_1.Variavel) {
890
- const variavel = this.gerenciadorEscopos.buscar(expressao.simbolo.lexema);
891
- return (variavel === null || variavel === void 0 ? void 0 : variavel.tipo) || null;
892
- }
893
- if (expressao instanceof construtos_1.Binario) {
894
- // Para binários, tentamos inferir o tipo baseado nos operandos
895
- return this.inferirTipoBinario(expressao);
896
- }
897
- if (expressao instanceof construtos_1.Logico) {
898
- // Operadores lógicos sempre retornam tipo lógico
899
- return 'lógico';
900
- }
901
- if (expressao instanceof construtos_1.Agrupamento) {
902
- return this.obterTipoExpressao(expressao.expressao);
903
- }
904
- if (expressao instanceof construtos_1.Leia) {
905
- // leia() sempre retorna texto
906
- return 'texto';
907
- }
908
- return null;
909
- }
910
- /**
911
- * Infere o tipo de resultado de uma operação binária
912
- */
913
- inferirTipoBinario(binario) {
914
- const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
915
- const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
916
- // Operadores de comparação sempre retornam lógico
917
- if (operadoresComparacao.includes(binario.operador.tipo)) {
918
- return 'lógico';
919
- }
920
- const tipoEsquerda = this.obterTipoExpressao(binario.esquerda);
921
- const tipoDireita = this.obterTipoExpressao(binario.direita);
922
- if (!tipoEsquerda || !tipoDireita) {
923
- return null;
924
- }
925
- if (operadoresMatematicos.includes(binario.operador.tipo)) {
926
- const tiposNumericos = ['inteiro', 'número', 'real'];
927
- if (tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita)) {
928
- // Se um dos lados é 'real', o resultado é 'real'
929
- if (tipoEsquerda === 'real' || tipoDireita === 'real') {
930
- return 'real';
931
- }
932
- return 'número';
933
- }
934
- // Concatenação de textos
935
- if (tipoEsquerda === 'texto' || tipoDireita === 'texto') {
936
- return 'texto';
937
- }
938
- }
939
- return 'qualquer';
940
- }
941
972
  verificarExistenciaConstruto(construto) {
942
973
  if (construto instanceof construtos_1.Variavel) {
943
974
  if (!this.gerenciadorEscopos.buscar(construto.simbolo.lexema)) {
@@ -1197,6 +1228,19 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1197
1228
  }
1198
1229
  return Promise.resolve();
1199
1230
  }
1231
+ visitarDeclaracaoClasse(declaracao) {
1232
+ if (declaracao.superClasse) {
1233
+ const nomeSuperclasse = declaracao.superClasse.simbolo.lexema;
1234
+ if (nomeSuperclasse === declaracao.simbolo.lexema) {
1235
+ this.erro(declaracao.superClasse.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
1236
+ }
1237
+ else if (!this.classesDeclararadas.has(nomeSuperclasse)) {
1238
+ this.erro(declaracao.superClasse.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
1239
+ }
1240
+ }
1241
+ this.classesDeclararadas.add(declaracao.simbolo.lexema);
1242
+ return Promise.resolve();
1243
+ }
1200
1244
  visitarDeclaracaoDefinicaoFuncao(declaracao) {
1201
1245
  var _a;
1202
1246
  if (declaracao.funcao.tipo === undefined) {
@@ -1271,6 +1315,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1271
1315
  }
1272
1316
  async analisar(declaracoes) {
1273
1317
  this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
1318
+ this.classesDeclararadas = new Set();
1274
1319
  this.atual = 0;
1275
1320
  this.diagnosticos = [];
1276
1321
  try {
@@ -1501,6 +1546,10 @@ class AvaliadorSintaticoBase {
1501
1546
  }
1502
1547
  return false;
1503
1548
  }
1549
+ async declaracaoBloco() {
1550
+ const simboloInicioBloco = this.consumir(comum_1.default.CHAVE_ESQUERDA, "Esperado '{' para abertura de bloco.");
1551
+ return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
1552
+ }
1504
1553
  async finalizarChamada(entidadeChamada) {
1505
1554
  const argumentos = [];
1506
1555
  if (!this.verificarTipoSimboloAtual(comum_1.default.PARENTESE_DIREITO)) {
@@ -1931,7 +1980,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1931
1980
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
1932
1981
  */
1933
1982
  async resolverCompreensaoDeLista(retornoExpressao) {
1934
- this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificado.");
1983
+ this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificador.");
1935
1984
  this.consumir(delegua_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
1936
1985
  const simboloVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
1937
1986
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
@@ -2098,8 +2147,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2098
2147
  case delegua_2.default.TEXTO:
2099
2148
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
2100
2149
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
2101
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
2102
- return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
2150
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoInferido);
2103
2151
  case delegua_2.default.PARA:
2104
2152
  const simboloPara = this.avancarEDevolverAnterior();
2105
2153
  return await this.paraComoConstruto(simboloPara);
@@ -2227,6 +2275,50 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2227
2275
  }
2228
2276
  return tipoAcesso;
2229
2277
  }
2278
+ /**
2279
+ * Resolve um construto do tipo `Variavel`, `AcessoMetodoOuPropriedade` ou `AcessoIndiceVariavel`
2280
+ * para um `ElementoMontaoTipos` correspondente, caso exista.
2281
+ * @param construto O construto.
2282
+ * @returns O `ElementoMontaoTipos` correspondente ou `null` se não existir.
2283
+ */
2284
+ resolverElementoMontao(construto) {
2285
+ switch (construto.constructor) {
2286
+ case construtos_1.Variavel:
2287
+ try {
2288
+ const nomeVariavel = construto.simbolo.lexema;
2289
+ const elementoMontao = this.pilhaEscopos.obterElementoMontaoTipos(nomeVariavel);
2290
+ if (elementoMontao.endereco) {
2291
+ const referenciaMontaoTipos = this.montaoTipos.obterReferencia(construto.hashArquivo, construto.linha, elementoMontao.endereco);
2292
+ if (referenciaMontaoTipos instanceof elemento_montao_tipos_1.ElementoMontaoTipos) {
2293
+ return referenciaMontaoTipos;
2294
+ }
2295
+ return null;
2296
+ }
2297
+ return elementoMontao;
2298
+ }
2299
+ catch (_a) {
2300
+ return null;
2301
+ }
2302
+ case construtos_1.AcessoMetodoOuPropriedade: {
2303
+ const acesso = construto;
2304
+ const elementoObjeto = this.resolverElementoMontao(acesso.objeto);
2305
+ if (!elementoObjeto) {
2306
+ return null;
2307
+ }
2308
+ return elementoObjeto.subElementos[acesso.simbolo.lexema] || null;
2309
+ }
2310
+ case construtos_1.AcessoIndiceVariavel: {
2311
+ const acessoIndice = construto;
2312
+ const elementoObjeto = this.resolverElementoMontao(acessoIndice.entidadeChamada);
2313
+ if (!elementoObjeto || !(acessoIndice.indice instanceof construtos_1.Literal)) {
2314
+ return null;
2315
+ }
2316
+ return elementoObjeto.subElementos[String(acessoIndice.indice.valor)] || null;
2317
+ }
2318
+ default:
2319
+ return null;
2320
+ }
2321
+ }
2230
2322
  async resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
2231
2323
  if (!this.simbolos[this.atual]) {
2232
2324
  return expressaoAnterior;
@@ -2244,12 +2336,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2244
2336
  // Se não for um dicionário anônimo (ou seja, ser variável ou constante com nome)
2245
2337
  if (expressaoAnterior.tipo === 'dicionário' &&
2246
2338
  expressaoAnterior.constructor !== construtos_1.Dicionario) {
2247
- // TODO: Achar algum caso em que aqui não seja variável.
2248
- const nomeDicionario = expressaoAnterior.simbolo.lexema;
2249
- const elementoDicionarioPilha = this.pilhaEscopos.obterElementoMontaoTipos(nomeDicionario);
2250
- const referenciaMontaoTipos = this.montaoTipos.obterReferencia(expressaoAnterior.hashArquivo, expressaoAnterior.linha, elementoDicionarioPilha.endereco);
2251
- if (nome.lexema in referenciaMontaoTipos.subElementos) {
2252
- tipoInferido = referenciaMontaoTipos.subElementos[nome.lexema].tipo;
2339
+ const elementoMontaoTipos = this.resolverElementoMontao(expressaoAnterior);
2340
+ if (elementoMontaoTipos &&
2341
+ nome.lexema in elementoMontaoTipos.subElementos) {
2342
+ tipoInferido = elementoMontaoTipos.subElementos[nome.lexema].tipo;
2253
2343
  }
2254
2344
  }
2255
2345
  const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
@@ -2746,8 +2836,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2746
2836
  }
2747
2837
  async logicaComumEnquanto() {
2748
2838
  const condicao = await this.expressao();
2749
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
2750
- const corpo = await this.resolverDeclaracao();
2839
+ const corpo = await this.declaracaoBloco();
2751
2840
  return {
2752
2841
  condicao,
2753
2842
  corpo,
@@ -2851,7 +2940,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2851
2940
  return new declaracoes_1.Falhar(simboloFalha, expressaoFalha);
2852
2941
  }
2853
2942
  async logicaComumFazer() {
2854
- const caminhoFazer = await this.resolverDeclaracao();
2943
+ const caminhoFazer = await this.declaracaoBloco();
2855
2944
  this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
2856
2945
  const condicaoEnquanto = await this.expressao();
2857
2946
  return {
@@ -2863,8 +2952,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2863
2952
  try {
2864
2953
  this.blocos += 1;
2865
2954
  const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
2866
- return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, // TODO: Aqui pode ser um `Bloco`?
2867
- condicaoEnquanto);
2955
+ return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
2868
2956
  }
2869
2957
  finally {
2870
2958
  this.blocos -= 1;
@@ -2948,8 +3036,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2948
3036
  }
2949
3037
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
2950
3038
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
2951
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
2952
- const corpo = await this.resolverDeclaracao();
3039
+ const corpo = await this.declaracaoBloco();
2953
3040
  return {
2954
3041
  nomeVariavelChave,
2955
3042
  nomeVariavelValor,
@@ -2987,8 +3074,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2987
3074
  tipoVariavelIteracao = tipoVetor.slice(0, -2);
2988
3075
  }
2989
3076
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
2990
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
2991
- const corpo = await this.resolverDeclaracao();
3077
+ const corpo = await this.declaracaoBloco();
2992
3078
  return {
2993
3079
  variavelIteracao,
2994
3080
  vetor: vetorOuDicionario,
@@ -3037,8 +3123,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3037
3123
  if (comParenteses) {
3038
3124
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
3039
3125
  }
3040
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
3041
- const corpo = await this.resolverDeclaracao();
3126
+ const corpo = await this.declaracaoBloco();
3042
3127
  return {
3043
3128
  inicializador,
3044
3129
  condicao,
@@ -3569,9 +3654,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3569
3654
  let superClasse = null;
3570
3655
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
3571
3656
  const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3572
- // TODO: Validar classes existentes?
3573
3657
  this.superclasseAtual = simboloSuperclasse.lexema;
3574
- // TODO: Colocar tipo aqui?
3575
3658
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
3576
3659
  }
3577
3660
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
@@ -3682,8 +3765,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3682
3765
  case delegua_2.default.AJUDA:
3683
3766
  return await this.declaracaoAjuda();
3684
3767
  case delegua_2.default.CHAVE_ESQUERDA:
3685
- const simboloInicioBloco = this.avancarEDevolverAnterior();
3686
- return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
3768
+ return await this.declaracaoBloco();
3687
3769
  case delegua_2.default.COMENTARIO:
3688
3770
  return this.declaracaoComentarioUmaLinha();
3689
3771
  case delegua_2.default.CONSTANTE:
@@ -5157,8 +5239,7 @@ class AvaliadorSintaticoPitugues {
5157
5239
  case pitugues_2.default.TEXTO:
5158
5240
  const simboloLiteral = this.avancarEDevolverAnterior();
5159
5241
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
5160
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
5161
- return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
5242
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoInferido);
5162
5243
  case pitugues_2.default.TIPO:
5163
5244
  const simboloTipo = this.avancarEDevolverAnterior();
5164
5245
  this.consumir(pitugues_2.default.PARENTESE_ESQUERDO, "Esperado '(' após 'tipo'.");
@@ -5514,11 +5595,13 @@ class AvaliadorSintaticoPitugues {
5514
5595
  // Neste caso, linha do símbolo atual é igual à linha do símbolo anterior.
5515
5596
  if (simboloAtual.linha === simboloAnterior.linha) {
5516
5597
  const declaracoesBloco = await this.resolverDeclaracaoForaDeBloco();
5517
- if (Array.isArray(declaracoesBloco)) {
5518
- declaracoes = declaracoes.concat(declaracoesBloco);
5519
- }
5520
- else {
5521
- declaracoes.push(declaracoesBloco);
5598
+ if (declaracoesBloco !== null) {
5599
+ if (Array.isArray(declaracoesBloco)) {
5600
+ declaracoes = declaracoes.concat(declaracoesBloco);
5601
+ }
5602
+ else {
5603
+ declaracoes.push(declaracoesBloco);
5604
+ }
5522
5605
  }
5523
5606
  }
5524
5607
  else {
@@ -5542,11 +5625,13 @@ class AvaliadorSintaticoPitugues {
5542
5625
  const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
5543
5626
  while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
5544
5627
  const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
5545
- if (Array.isArray(retornoDeclaracao)) {
5546
- declaracoes = declaracoes.concat(retornoDeclaracao);
5547
- }
5548
- else {
5549
- declaracoes.push(retornoDeclaracao);
5628
+ if (retornoDeclaracao !== null) {
5629
+ if (Array.isArray(retornoDeclaracao)) {
5630
+ declaracoes = declaracoes.concat(retornoDeclaracao);
5631
+ }
5632
+ else {
5633
+ declaracoes.push(retornoDeclaracao);
5634
+ }
5550
5635
  }
5551
5636
  simboloAtual = this.simboloAtual();
5552
5637
  if (!simboloAtual)
@@ -5836,7 +5921,7 @@ class AvaliadorSintaticoPitugues {
5836
5921
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
5837
5922
  */
5838
5923
  async resolverCompreensaoDeLista(retornoExpressao) {
5839
- this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificado.");
5924
+ this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificador.");
5840
5925
  this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
5841
5926
  const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
5842
5927
  // TODO: Manter essa validação aqui? Se sim, como resolver a expressão?
@@ -6047,6 +6132,9 @@ class AvaliadorSintaticoPitugues {
6047
6132
  case pitugues_2.default.CONTINUA:
6048
6133
  this.avancarEDevolverAnterior();
6049
6134
  return this.declaracaoContinua();
6135
+ case pitugues_2.default.NADA:
6136
+ this.avancarEDevolverAnterior();
6137
+ return null;
6050
6138
  case pitugues_2.default.DOIS_PONTOS:
6051
6139
  this.avancarEDevolverAnterior();
6052
6140
  const simboloInicioBloco = this.simboloAnterior();
@@ -6581,8 +6669,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
6581
6669
  case prisma_1.default.TEXTO:
6582
6670
  const simboloLiteral = this.avancarEDevolverAnterior();
6583
6671
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
6584
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
6585
- return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
6672
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoInferido);
6586
6673
  case prisma_1.default.IDENTIFICADOR:
6587
6674
  const simboloIdentificador = this.avancarEDevolverAnterior();
6588
6675
  let tipoOperando;
@@ -7407,8 +7494,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
7407
7494
  case tenda_1.default.TEXTO:
7408
7495
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
7409
7496
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
7410
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
7411
- return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
7497
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoInferido);
7412
7498
  case tenda_1.default.PARENTESE_ESQUERDO:
7413
7499
  this.avancarEDevolverAnterior();
7414
7500
  const expressao = await this.expressao();
@@ -8254,8 +8340,7 @@ class MicroAvaliadorSintaticoPitugues extends micro_avaliador_sintatico_base_1.M
8254
8340
  case pitugues_1.default.TEXTO:
8255
8341
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
8256
8342
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
8257
- const tiposDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
8258
- return new construtos_1.Literal(-1, Number(this.linha), simboloNumeroTexto.literal, tiposDadosElementar);
8343
+ return new construtos_1.Literal(-1, Number(this.linha), simboloNumeroTexto.literal, tipoInferido);
8259
8344
  case pitugues_1.default.IDENTIFICADOR:
8260
8345
  const simboloIdentificador = this.avancarEDevolverAnterior();
8261
8346
  return new construtos_1.Variavel(-1, simboloIdentificador);
@@ -8626,31 +8711,24 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
8626
8711
  const simboloAtual = this.simbolos[this.atual];
8627
8712
  let valores = [];
8628
8713
  switch (simboloAtual.tipo) {
8629
- // TODO: Verificar se vamos usar isso.
8630
- /* case tiposDeSimbolos.CHAVE_ESQUERDA:
8714
+ case delegua_1.default.CHAVE_ESQUERDA:
8631
8715
  this.avancarEDevolverAnterior();
8632
8716
  const chaves = [];
8633
8717
  valores = [];
8634
-
8635
- if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_DIREITA)) {
8636
- return new Dicionario(-1, Number(this.linha), [], []);
8718
+ if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
8719
+ return new construtos_1.Dicionario(-1, Number(this.linha), [], []);
8637
8720
  }
8638
-
8639
- while (!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_DIREITA)) {
8640
- const chave = this.atribuir();
8641
- this.consumir(tiposDeSimbolos.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
8642
- const valor = this.atribuir();
8643
-
8721
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
8722
+ const chave = this.declaracao();
8723
+ this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
8724
+ const valor = this.declaracao();
8644
8725
  chaves.push(chave);
8645
8726
  valores.push(valor);
8646
-
8647
- if (this.simbolos[this.atual].tipo !== tiposDeSimbolos.CHAVE_DIREITA) {
8648
- this.consumir(tiposDeSimbolos.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
8727
+ if (this.simbolos[this.atual].tipo !== delegua_1.default.CHAVE_DIREITA) {
8728
+ this.consumir(delegua_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
8649
8729
  }
8650
8730
  }
8651
-
8652
- return new Dicionario(-1, Number(this.linha), chaves, valores); */
8653
- // TODO: Verificar se vamos usar isso.
8731
+ return new construtos_1.Dicionario(-1, Number(this.linha), chaves, valores);
8654
8732
  case delegua_1.default.COLCHETE_ESQUERDO:
8655
8733
  this.avancarEDevolverAnterior();
8656
8734
  valores = [];
@@ -9603,20 +9681,6 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
9603
9681
  }, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
9604
9682
  const valorVetor = interpretador.resolverValor(vetor);
9605
9683
  const valorFuncaoMapeamento = interpretador.resolverValor(funcaoMapeamento);
9606
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
9607
- // na avaliação sintática. Estudar remoção.
9608
- if (!Array.isArray(valorVetor)) {
9609
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9610
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9611
- linha: interpretador.linhaDeclaracaoAtual,
9612
- }, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
9613
- }
9614
- if (valorFuncaoMapeamento.constructor !== estruturas_1.DeleguaFuncao) {
9615
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9616
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9617
- linha: interpretador.linhaDeclaracaoAtual,
9618
- }, 'Parâmetro inválido. O segundo parâmetro da função mapear() deve ser uma função.'));
9619
- }
9620
9684
  const resultados = [];
9621
9685
  for (let indice = 0; indice < valorVetor.length; ++indice) {
9622
9686
  const informacoesRetorno = await valorFuncaoMapeamento.chamar(interpretador, [
@@ -9783,20 +9847,6 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
9783
9847
  const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
9784
9848
  ? funcaoFiltragem.valor
9785
9849
  : funcaoFiltragem;
9786
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
9787
- // na avaliação sintática. Estudar remoção.
9788
- if (!Array.isArray(valorVetor)) {
9789
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9790
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9791
- linha: interpretador.linhaDeclaracaoAtual,
9792
- }, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() deve ser um vetor.'));
9793
- }
9794
- if (valorFuncaoFiltragem.constructor !== estruturas_1.DeleguaFuncao) {
9795
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9796
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9797
- linha: interpretador.linhaDeclaracaoAtual,
9798
- }, 'Parâmetro inválido. O segundo parâmetro da função paraCada() deve ser uma função.'));
9799
- }
9800
9850
  for (let indice = 0; indice < valorVetor.length; ++indice) {
9801
9851
  await valorFuncaoFiltragem.chamar(interpretador, [valorVetor[indice]]);
9802
9852
  }
@@ -10062,21 +10112,11 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
10062
10112
  */
10063
10113
  async function tupla(interpretador, vetor) {
10064
10114
  const valorVetor = interpretador.resolverValor(vetor);
10065
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
10066
- // na avaliação sintática. Estudar remoção.
10067
- if (!Array.isArray(valorVetor)) {
10068
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10069
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
10070
- linha: interpretador.linhaDeclaracaoAtual,
10071
- }, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
10072
- }
10073
10115
  const elementos = valorVetor.map(item => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
10074
10116
  return new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
10075
10117
  }
10076
10118
  async function vetor(interpretador, tupla) {
10077
10119
  const objetoTupla = interpretador.resolverValor(tupla);
10078
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
10079
- // na avaliação sintática. Estudar remoção.
10080
10120
  if (!(objetoTupla instanceof construtos_1.Tupla || objetoTupla instanceof construtos_1.TuplaN)) {
10081
10121
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10082
10122
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
@@ -10089,16 +10129,20 @@ async function vetor(interpretador, tupla) {
10089
10129
  }
10090
10130
  else {
10091
10131
  const nomeClasse = objetoTupla.constructor.name;
10092
- if (mapaPropriedadesTuplas.hasOwnProperty(nomeClasse)) {
10093
- const props = mapaPropriedadesTuplas[nomeClasse];
10132
+ const props = mapaPropriedadesTuplas[nomeClasse];
10133
+ if (props) {
10094
10134
  resultado = props.map(prop => objetoTupla[prop]);
10095
10135
  }
10096
10136
  else if (objetoTupla.elementos && Array.isArray(objetoTupla.elementos)) {
10097
10137
  resultado = objetoTupla.elementos;
10098
10138
  }
10099
10139
  }
10100
- const resultadoFinal = resultado.map(item => (item && item.hasOwnProperty('valor')) ? item.valor : item);
10101
- return Promise.resolve(resultadoFinal);
10140
+ const resultadoFinal = new Array(resultado.length);
10141
+ for (let i = 0; i < resultado.length; i++) {
10142
+ const item = resultado[i];
10143
+ resultadoFinal[i] = item && typeof item === 'object' && 'valor' in item ? item.valor : item;
10144
+ }
10145
+ return resultadoFinal;
10102
10146
  }
10103
10147
 
10104
10148
  },{"../construtos":62,"../excecoes":129,"../interpretador/estruturas":176,"../interpretador/estruturas/descritor-tipo-classe":174,"../interpretador/estruturas/funcao-padrao":175,"../interpretador/estruturas/objeto-delegua-classe":180,"../quebras":212}],28:[function(require,module,exports){
@@ -11343,19 +11387,24 @@ exports.AtribuicaoPorIndicesMatriz = AtribuicaoPorIndicesMatriz;
11343
11387
  "use strict";
11344
11388
  Object.defineProperty(exports, "__esModule", { value: true });
11345
11389
  exports.Atribuir = void 0;
11390
+ const variavel_1 = require("./variavel");
11346
11391
  /**
11347
11392
  * Construto de atribuição de um valor a um símbolo.
11348
11393
  */
11349
11394
  class Atribuir {
11350
- constructor(hashArquivo, alvo, valor,
11351
- // indice so é usado para variaveis de vetores
11352
- // TODO: criar alguma validaçao para garantir que `indice` só seja passado para variáveis de vetores
11353
- indice, simboloOperador) {
11395
+ constructor(hashArquivo, alvo, valor, indice, simboloOperador) {
11354
11396
  this.linha = Number(alvo.linha);
11355
11397
  this.hashArquivo = hashArquivo;
11356
11398
  this.alvo = alvo;
11357
11399
  this.valor = valor;
11358
11400
  if (indice !== undefined) {
11401
+ const alvoComoVariavel = alvo;
11402
+ const tipoAlvo = alvoComoVariavel === null || alvoComoVariavel === void 0 ? void 0 : alvoComoVariavel.tipo;
11403
+ const alvoSuportaIndice = alvo instanceof variavel_1.Variavel &&
11404
+ (tipoAlvo === 'vetor' || tipoAlvo === 'dicionário' || tipoAlvo === 'qualquer' || (tipoAlvo === null || tipoAlvo === void 0 ? void 0 : tipoAlvo.endsWith('[]')));
11405
+ if (!alvoSuportaIndice) {
11406
+ throw new Error("`indice` só pode ser informado quando o alvo for uma variável de vetor ou dicionário.");
11407
+ }
11359
11408
  this.indice = indice;
11360
11409
  }
11361
11410
  if (simboloOperador !== undefined) {
@@ -11378,7 +11427,7 @@ class Atribuir {
11378
11427
  }
11379
11428
  exports.Atribuir = Atribuir;
11380
11429
 
11381
- },{}],45:[function(require,module,exports){
11430
+ },{"./variavel":89}],45:[function(require,module,exports){
11382
11431
  "use strict";
11383
11432
  Object.defineProperty(exports, "__esModule", { value: true });
11384
11433
  exports.Binario = void 0;
@@ -15428,7 +15477,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15428
15477
  Object.defineProperty(exports, "__esModule", { value: true });
15429
15478
  exports.TipoNativoSimbolo = void 0;
15430
15479
  exports.inferirTipoVariavel = inferirTipoVariavel;
15431
- exports.tipoInferenciaParaTipoDadosElementar = tipoInferenciaParaTipoDadosElementar;
15432
15480
  const primitivos_1 = __importDefault(require("./tipos-de-dados/primitivos"));
15433
15481
  const delegua_1 = __importDefault(require("./tipos-de-dados/delegua"));
15434
15482
  const delegua_2 = __importDefault(require("./tipos-de-simbolos/delegua"));
@@ -15542,13 +15590,6 @@ function inferirTipoVariavel(variavel) {
15542
15590
  return 'símbolo';
15543
15591
  }
15544
15592
  }
15545
- function tipoInferenciaParaTipoDadosElementar(tipoInferencia) {
15546
- switch (tipoInferencia) {
15547
- // TODO: Colocar exceções aqui.
15548
- default:
15549
- return tipoInferencia;
15550
- }
15551
- }
15552
15593
 
15553
15594
  },{"./tipos-de-dados/delegua":213,"./tipos-de-dados/primitivos":215,"./tipos-de-simbolos/delegua":218}],136:[function(require,module,exports){
15554
15595
  "use strict";
@@ -18117,7 +18158,6 @@ class InterpretadorBase {
18117
18158
  return await this.executar(declaracao.caminhoEntao);
18118
18159
  }
18119
18160
  for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
18120
- // TODO: Qual o tipo de `atual`?
18121
18161
  const atual = declaracao.caminhosSeSenao[i];
18122
18162
  if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
18123
18163
  return await this.executar(atual.caminho);
@@ -22860,6 +22900,7 @@ exports.palavrasReservadasPitugues = {
22860
22900
  isto: pitugues_1.default.ISTO,
22861
22901
  entrada: pitugues_1.default.LEIA,
22862
22902
  leia: pitugues_1.default.LEIA,
22903
+ nada: pitugues_1.default.NADA,
22863
22904
  nao: pitugues_1.default.NAO,
22864
22905
  não: pitugues_1.default.NAO,
22865
22906
  nulo: pitugues_1.default.NULO,
@@ -24734,6 +24775,7 @@ exports.default = {
24734
24775
  Object.defineProperty(exports, "__esModule", { value: true });
24735
24776
  exports.default = {
24736
24777
  ADICAO: 'ADICAO',
24778
+ CHAVE_ESQUERDA: 'CHAVE_ESQUERDA',
24737
24779
  DIFERENTE: 'DIFERENTE',
24738
24780
  DIVISAO: 'DIVISAO',
24739
24781
  DIVISAO_INTEIRA: 'DIVISAO_INTEIRA',
@@ -25064,6 +25106,7 @@ exports.default = {
25064
25106
  MODULO: 'MODULO',
25065
25107
  MULTIPLICACAO: 'MULTIPLICACAO',
25066
25108
  MULTIPLICACAO_IGUAL: 'MULTIPLICACAO_IGUAL',
25109
+ NADA: 'NADA',
25067
25110
  NAO: 'NAO',
25068
25111
  NEGACAO: 'NEGACAO',
25069
25112
  NULO: 'NULO',
@@ -41586,14 +41629,22 @@ class TradutorJavaScript {
41586
41629
  case 'adicionar':
41587
41630
  case 'empilhar':
41588
41631
  return `${objetoResolvido}.push(${textoArgumentos})`;
41632
+ case 'concatenar':
41633
+ return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
41634
+ case 'encaixar':
41635
+ return `${objetoResolvido}.splice(${textoArgumentos})`;
41589
41636
  case 'fatiar':
41590
- return `${objetoResolvido}.slice(${argumentos[0]}, ${argumentos[1]})`;
41637
+ return `${objetoResolvido}.slice(${textoArgumentos})`;
41638
+ case 'filtrarPor':
41639
+ return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
41591
41640
  case 'inclui':
41592
41641
  return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
41593
41642
  case 'inverter':
41594
41643
  return `${objetoResolvido}.toReversed()`;
41595
41644
  case 'juntar':
41596
- return `${argumentosResolvidos[0]}.join(${objetoResolvido})`;
41645
+ return argumentosResolvidos.length > 0
41646
+ ? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
41647
+ : `${objetoResolvido}.join()`;
41597
41648
  case 'maiusculo':
41598
41649
  return `${objetoResolvido}.toUpperCase()`;
41599
41650
  case 'mapear':
@@ -41601,9 +41652,11 @@ class TradutorJavaScript {
41601
41652
  case 'minusculo':
41602
41653
  return `${objetoResolvido}.toLowerCase()`;
41603
41654
  case 'ordenar':
41604
- return `${objetoResolvido}.sort()`;
41655
+ return argumentosResolvidos.length > 0
41656
+ ? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
41657
+ : `${objetoResolvido}.sort()`;
41605
41658
  case 'remover':
41606
- return `delete ${objetoResolvido}[${argumentosResolvidos[0]}]`;
41659
+ return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
41607
41660
  case 'removerPrimeiro':
41608
41661
  return `${objetoResolvido}.shift()`;
41609
41662
  case 'removerUltimo':
@@ -42021,9 +42074,26 @@ class TradutorJavaScript {
42021
42074
  }
42022
42075
  return resultado;
42023
42076
  }
42024
- // TODO: Talvez terminar (ou remover, sei lá).
42025
42077
  traduzirFuncaoAnonimaParaLambda(argumento) {
42026
- return '';
42078
+ var _a, _b, _c;
42079
+ if (argumento instanceof construtos_1.FuncaoConstruto) {
42080
+ const params = argumento.parametros.map((p) => p.nome.lexema).join(', ');
42081
+ // Retorno de um valor → retorno conciso
42082
+ if (argumento.corpo.length === 1 && argumento.corpo[0] instanceof declaracoes_1.Retorna) {
42083
+ const retorna = argumento.corpo[0];
42084
+ const expr = this.dicionarioConstrutos[retorna.valor.constructor.name](retorna.valor);
42085
+ return `(${params}) => ${expr}`;
42086
+ }
42087
+ // O JavaScript não tem suporte nativo para blocos de função anônimos, então usamos uma função de seta com corpo de bloco.
42088
+ return `(${params}) => ${this.logicaComumBlocoEscopo(argumento.corpo)}`;
42089
+ }
42090
+ if (argumento instanceof construtos_1.Variavel) {
42091
+ return argumento.simbolo.lexema;
42092
+ }
42093
+ if (argumento instanceof construtos_1.ReferenciaFuncao || argumento instanceof construtos_1.ArgumentoReferenciaFuncao) {
42094
+ return argumento.simboloFuncao.lexema;
42095
+ }
42096
+ return (_c = (_b = (_a = this.dicionarioConstrutos)[argumento.constructor.name]) === null || _b === void 0 ? void 0 : _b.call(_a, argumento)) !== null && _c !== void 0 ? _c : '';
42027
42097
  }
42028
42098
  traduzirExpressaoAcessoMetodoVetor(objeto, nomeMetodo, argumentos) {
42029
42099
  const objetoResolvido = this.dicionarioConstrutos[objeto.constructor.name](objeto);
@@ -42032,34 +42102,43 @@ class TradutorJavaScript {
42032
42102
  const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
42033
42103
  argumentosResolvidos.push(argumentoResolvido);
42034
42104
  }
42105
+ const textoArgumentos = argumentosResolvidos.join(', ');
42035
42106
  switch (nomeMetodo) {
42036
42107
  case 'adicionar':
42037
42108
  case 'empilhar':
42038
- let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
42039
- textoArgumentos = textoArgumentos.slice(0, -2);
42040
42109
  return `${objetoResolvido}.push(${textoArgumentos})`;
42110
+ case 'concatenar':
42111
+ return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
42112
+ case 'encaixar':
42113
+ return `${objetoResolvido}.splice(${textoArgumentos})`;
42041
42114
  case 'fatiar':
42042
- return `${objetoResolvido}[${argumentos[0]}:${argumentos[1]}]`;
42115
+ return `${objetoResolvido}.slice(${textoArgumentos})`;
42116
+ case 'filtrarPor':
42117
+ return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
42043
42118
  case 'inclui':
42044
- return `${argumentos[0]} in ${objetoResolvido}`;
42119
+ return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
42045
42120
  case 'inverter':
42046
- return `reversed(${objetoResolvido})`;
42121
+ return `${objetoResolvido}.toReversed()`;
42047
42122
  case 'juntar':
42048
- return `${argumentos[0]}.join(${objetoResolvido})`;
42123
+ return argumentosResolvidos.length > 0
42124
+ ? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
42125
+ : `${objetoResolvido}.join()`;
42049
42126
  case 'mapear':
42050
- return `list(map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])}), ${objetoResolvido})`;
42127
+ return `${objetoResolvido}.map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
42051
42128
  case 'ordenar':
42052
- return `${objetoResolvido}.sort()`;
42129
+ return argumentosResolvidos.length > 0
42130
+ ? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
42131
+ : `${objetoResolvido}.sort()`;
42053
42132
  case 'remover':
42054
- return `del ${objetoResolvido}[${argumentos[0]}]`;
42133
+ return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
42055
42134
  case 'removerPrimeiro':
42056
- return `del ${objetoResolvido}[0]`;
42135
+ return `${objetoResolvido}.shift()`;
42057
42136
  case 'removerUltimo':
42058
- return `del ${objetoResolvido}[-1]`;
42137
+ return `${objetoResolvido}.pop()`;
42059
42138
  case 'somar':
42060
- return `sum(${objetoResolvido})`;
42139
+ return `${objetoResolvido}.reduce((acumulador, valorAtual) => acumulador + valorAtual, 0)`;
42061
42140
  case 'tamanho':
42062
- return `len(${objetoResolvido})`;
42141
+ return `${objetoResolvido}.length`;
42063
42142
  }
42064
42143
  }
42065
42144
  traduzirExpressaoAcessoMetodo(acessoMetodo, argumentos) {
@@ -42108,16 +42187,14 @@ class TradutorJavaScript {
42108
42187
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
42109
42188
  return `${direita} ${operador} ${esquerda}`;
42110
42189
  }
42111
- // TODO: Eliminar o soft cast para `any`.
42112
42190
  traduzirExpressaoAtribuicaoPorIndice(AtribuicaoPorIndice) {
42113
- var _a, _b;
42114
42191
  let resultado = '';
42115
42192
  resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
42116
42193
  resultado +=
42117
42194
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
42118
42195
  resultado += ' = ';
42119
- if ((_b = (_a = AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor) === null || _a === void 0 ? void 0 : _a.simbolo) === null || _b === void 0 ? void 0 : _b.lexema) {
42120
- resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
42196
+ if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
42197
+ resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
42121
42198
  }
42122
42199
  else {
42123
42200
  resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);