@designliquido/delegua 1.10.0 → 1.11.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 (252) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +2 -2
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +14 -6
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  6. package/analisador-semantico/analisador-semantico.js +56 -28
  7. package/analisador-semantico/analisador-semantico.js.map +1 -1
  8. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  9. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +41 -18
  10. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  11. package/analisador-semantico/funcao-hipotetica-interface.d.ts +1 -1
  12. package/analisador-semantico/gerenciador-escopos.d.ts +1 -1
  13. package/analisador-semantico/pilha-variaveis.d.ts.map +1 -1
  14. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  15. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  16. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  17. package/avaliador-sintatico/avaliador-sintatico.js +149 -42
  18. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  19. package/avaliador-sintatico/comum.d.ts.map +1 -1
  20. package/avaliador-sintatico/comum.js.map +1 -1
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts.map +1 -1
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +1 -1
  25. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  26. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
  27. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
  28. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  29. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  30. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +60 -50
  31. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  32. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
  33. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +5 -5
  34. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  35. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  36. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +1 -1
  37. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  38. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
  39. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
  40. package/avaliador-sintatico/erro-avaliador-sintatico.d.ts +18 -0
  41. package/avaliador-sintatico/erro-avaliador-sintatico.d.ts.map +1 -1
  42. package/avaliador-sintatico/erro-avaliador-sintatico.js.map +1 -1
  43. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
  44. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  45. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
  46. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
  47. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  48. package/bibliotecas/biblioteca-global.js +93 -31
  49. package/bibliotecas/biblioteca-global.js.map +1 -1
  50. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  51. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +12 -8
  52. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  53. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.d.ts.map +1 -1
  54. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
  55. package/bibliotecas/dialetos/pitugues/primitivas-numero.d.ts.map +1 -1
  56. package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
  57. package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts.map +1 -1
  58. package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
  59. package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts.map +1 -1
  60. package/bibliotecas/dialetos/pitugues/primitivas-tupla.js +3 -4
  61. package/bibliotecas/dialetos/pitugues/primitivas-tupla.js.map +1 -1
  62. package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
  63. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +9 -11
  64. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
  65. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  66. package/bibliotecas/primitivas-dicionario.js +1 -1
  67. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  68. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  69. package/bibliotecas/primitivas-numero.js.map +1 -1
  70. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  71. package/bibliotecas/primitivas-texto.js +70 -1
  72. package/bibliotecas/primitivas-texto.js.map +1 -1
  73. package/bibliotecas/primitivas-tupla.d.ts.map +1 -1
  74. package/bibliotecas/primitivas-tupla.js +34 -14
  75. package/bibliotecas/primitivas-tupla.js.map +1 -1
  76. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  77. package/bibliotecas/primitivas-vetor.js +19 -1
  78. package/bibliotecas/primitivas-vetor.js.map +1 -1
  79. package/bin/package.json +1 -1
  80. package/construtos/ajuda-como-construto.d.ts +2 -2
  81. package/construtos/ajuda-como-construto.js +1 -1
  82. package/construtos/atribuir.d.ts.map +1 -1
  83. package/construtos/atribuir.js +5 -2
  84. package/construtos/atribuir.js.map +1 -1
  85. package/construtos/binario.d.ts.map +1 -1
  86. package/construtos/binario.js +1 -2
  87. package/construtos/binario.js.map +1 -1
  88. package/construtos/comentario-como-construto.d.ts.map +1 -1
  89. package/construtos/comentario-como-construto.js.map +1 -1
  90. package/construtos/decorador.d.ts.map +1 -1
  91. package/construtos/decorador.js +3 -1
  92. package/construtos/decorador.js.map +1 -1
  93. package/construtos/dicionario.d.ts.map +1 -1
  94. package/construtos/dicionario.js.map +1 -1
  95. package/construtos/tupla-n.d.ts +3 -3
  96. package/construtos/tupla-n.d.ts.map +1 -1
  97. package/construtos/tupla-n.js +4 -2
  98. package/construtos/tupla-n.js.map +1 -1
  99. package/declaracoes/ajuda.d.ts +3 -3
  100. package/declaracoes/classe.d.ts +5 -2
  101. package/declaracoes/classe.d.ts.map +1 -1
  102. package/declaracoes/classe.js +13 -4
  103. package/declaracoes/classe.js.map +1 -1
  104. package/declaracoes/interface.d.ts.map +1 -1
  105. package/declaracoes/interface.js.map +1 -1
  106. package/declaracoes/texto-documentacao.d.ts.map +1 -1
  107. package/declaracoes/texto-documentacao.js.map +1 -1
  108. package/estilizador/estilizador-delegua.d.ts.map +1 -1
  109. package/estilizador/estilizador-delegua.js +5 -1
  110. package/estilizador/estilizador-delegua.js.map +1 -1
  111. package/formatadores/formatador-delegua.d.ts.map +1 -1
  112. package/formatadores/formatador-delegua.js.map +1 -1
  113. package/formatadores/formatador-pitugues.d.ts.map +1 -1
  114. package/formatadores/formatador-pitugues.js +74 -29
  115. package/formatadores/formatador-pitugues.js.map +1 -1
  116. package/geracao-identificadores/index.js +2 -2
  117. package/geracao-identificadores/index.js.map +1 -1
  118. package/interfaces/componente-modulo-classe-interface.d.ts.map +1 -1
  119. package/interfaces/componente-modulo-funcao-interface.d.ts.map +1 -1
  120. package/interfaces/interpretador-com-depuracao-interface.d.ts.map +1 -1
  121. package/interfaces/modulo-interface.d.ts +2 -2
  122. package/interfaces/modulo-interface.d.ts.map +1 -1
  123. package/interfaces/visitante-comum-interface.d.ts.map +1 -1
  124. package/interpretador/comum.d.ts.map +1 -1
  125. package/interpretador/comum.js +65 -55
  126. package/interpretador/comum.js.map +1 -1
  127. package/interpretador/depuracao/avaliador-expressao-depuracao.d.ts.map +1 -1
  128. package/interpretador/depuracao/avaliador-expressao-depuracao.js.map +1 -1
  129. package/interpretador/depuracao/comum.d.ts.map +1 -1
  130. package/interpretador/depuracao/comum.js +8 -4
  131. package/interpretador/depuracao/comum.js.map +1 -1
  132. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  133. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -3
  134. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  135. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
  136. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  137. package/interpretador/dialetos/pitugues/comum.d.ts +2 -2
  138. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  139. package/interpretador/dialetos/pitugues/comum.js +2 -3
  140. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  141. package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.d.ts +2 -2
  142. package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.d.ts.map +1 -1
  143. package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.js +1 -1
  144. package/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.js.map +1 -1
  145. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +3 -3
  146. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  147. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +3 -2
  148. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  149. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  150. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  151. package/interpretador/estruturas/classe-de-modulo.d.ts.map +1 -1
  152. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  153. package/interpretador/estruturas/delegua-funcao.js +3 -1
  154. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  155. package/interpretador/estruturas/descritor-tipo-classe.d.ts +14 -4
  156. package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
  157. package/interpretador/estruturas/descritor-tipo-classe.js +95 -35
  158. package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
  159. package/interpretador/estruturas/metodo-polimorfico.d.ts.map +1 -1
  160. package/interpretador/estruturas/metodo-polimorfico.js +13 -9
  161. package/interpretador/estruturas/metodo-polimorfico.js.map +1 -1
  162. package/interpretador/estruturas/metodo-primitiva.d.ts.map +1 -1
  163. package/interpretador/estruturas/metodo-primitiva.js.map +1 -1
  164. package/interpretador/estruturas/objeto-base.d.ts.map +1 -1
  165. package/interpretador/estruturas/objeto-base.js +8 -4
  166. package/interpretador/estruturas/objeto-base.js.map +1 -1
  167. package/interpretador/estruturas/objeto-delegua-classe.d.ts +1 -0
  168. package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
  169. package/interpretador/estruturas/objeto-delegua-classe.js +41 -23
  170. package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
  171. package/interpretador/interpretador-base.d.ts +4 -4
  172. package/interpretador/interpretador-base.d.ts.map +1 -1
  173. package/interpretador/interpretador-base.js +175 -62
  174. package/interpretador/interpretador-base.js.map +1 -1
  175. package/interpretador/interpretador.d.ts.map +1 -1
  176. package/interpretador/interpretador.js +14 -13
  177. package/interpretador/interpretador.js.map +1 -1
  178. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  179. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  180. package/lexador/dialetos/lexador-calango.d.ts.map +1 -1
  181. package/lexador/dialetos/lexador-calango.js.map +1 -1
  182. package/lexador/dialetos/lexador-egua-classico.d.ts.map +1 -1
  183. package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
  184. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  185. package/lexador/dialetos/lexador-pitugues.js +3 -1
  186. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  187. package/lexador/dialetos/lexador-portugol-ipt.d.ts.map +1 -1
  188. package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
  189. package/lexador/dialetos/lexador-prisma.d.ts.map +1 -1
  190. package/lexador/dialetos/lexador-prisma.js +25 -3
  191. package/lexador/dialetos/lexador-prisma.js.map +1 -1
  192. package/lexador/dialetos/lexador-tenda.d.ts.map +1 -1
  193. package/lexador/dialetos/lexador-tenda.js.map +1 -1
  194. package/lexador/filtro-paradigma.d.ts.map +1 -1
  195. package/lexador/filtro-paradigma.js.map +1 -1
  196. package/lexador/lexador-base-linha-unica.d.ts.map +1 -1
  197. package/lexador/lexador-base-linha-unica.js.map +1 -1
  198. package/lexador/lexador-base.d.ts.map +1 -1
  199. package/lexador/lexador-base.js.map +1 -1
  200. package/lexador/lexador.d.ts.map +1 -1
  201. package/lexador/lexador.js.map +1 -1
  202. package/lexador/mapeamento-paradigmas.d.ts.map +1 -1
  203. package/lexador/mapeamento-paradigmas.js.map +1 -1
  204. package/lexador/palavras-reservadas.d.ts +1 -0
  205. package/lexador/palavras-reservadas.d.ts.map +1 -1
  206. package/lexador/palavras-reservadas.js +3 -2
  207. package/lexador/palavras-reservadas.js.map +1 -1
  208. package/lexador/simbolo.d.ts.map +1 -1
  209. package/lexador/simbolo.js.map +1 -1
  210. package/lexador/traducao/lexador-javascript.d.ts.map +1 -1
  211. package/package.json +1 -1
  212. package/tipos-de-simbolos/delegua.d.ts +1 -0
  213. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  214. package/tipos-de-simbolos/delegua.js +1 -0
  215. package/tipos-de-simbolos/delegua.js.map +1 -1
  216. package/tradutores/mermaid/aresta-fluxograma.d.ts +1 -1
  217. package/tradutores/mermaid/subgrafo-classe.d.ts +3 -3
  218. package/tradutores/mermaid/subgrafo-funcao.d.ts +2 -2
  219. package/tradutores/mermaid/subgrafo-funcao.d.ts.map +1 -1
  220. package/tradutores/mermaid/subgrafo-funcao.js.map +1 -1
  221. package/tradutores/mermaid/subgrafo-metodo.d.ts +2 -2
  222. package/tradutores/mermaid/vertice-fluxograma.d.ts +1 -1
  223. package/tradutores/tradutor-assembly-arm.d.ts.map +1 -1
  224. package/tradutores/tradutor-assembly-arm.js +164 -156
  225. package/tradutores/tradutor-assembly-arm.js.map +1 -1
  226. package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
  227. package/tradutores/tradutor-assembly-x64.js +136 -127
  228. package/tradutores/tradutor-assembly-x64.js.map +1 -1
  229. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  230. package/tradutores/tradutor-assemblyscript.js +10 -6
  231. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  232. package/tradutores/tradutor-calango.d.ts.map +1 -1
  233. package/tradutores/tradutor-calango.js.map +1 -1
  234. package/tradutores/tradutor-elixir.d.ts.map +1 -1
  235. package/tradutores/tradutor-elixir.js +9 -7
  236. package/tradutores/tradutor-elixir.js.map +1 -1
  237. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  238. package/tradutores/tradutor-javascript.js +2 -1
  239. package/tradutores/tradutor-javascript.js.map +1 -1
  240. package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
  241. package/tradutores/tradutor-mermaidjs.js +4 -8
  242. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  243. package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
  244. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  245. package/tradutores/tradutor-python.d.ts.map +1 -1
  246. package/tradutores/tradutor-python.js +1 -1
  247. package/tradutores/tradutor-python.js.map +1 -1
  248. package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
  249. package/tradutores/tradutor-ruby.d.ts.map +1 -1
  250. package/tradutores/tradutor-ruby.js +1 -1
  251. package/tradutores/tradutor-ruby.js.map +1 -1
  252. package/umd/delegua.js +1353 -730
package/umd/delegua.js CHANGED
@@ -12,7 +12,7 @@ const interfaces_1 = require("../interfaces");
12
12
  */
13
13
  class AnalisadorSemanticoBase {
14
14
  diagnosticoJaExiste(simbolo, mensagem) {
15
- return this.diagnosticos.some(d => d.linha === simbolo.linha &&
15
+ return this.diagnosticos.some((d) => d.linha === simbolo.linha &&
16
16
  d.mensagem === mensagem &&
17
17
  d.simbolo.lexema === simbolo.lexema);
18
18
  }
@@ -63,7 +63,7 @@ class AnalisadorSemanticoBase {
63
63
  for (let [indice, parametro] of parametros.entries()) {
64
64
  const argumento = argumentos[indice];
65
65
  if (argumento) {
66
- // Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
66
+ // Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
67
67
  // independentemente de ser um `Literal` (tipo já resolvido), `Variavel` (tipo inferido do
68
68
  // escopo), `Binario`, `Agrupamento`, ou qualquer outro construto (retorna `null` quando
69
69
  // o tipo não pode ser determinado em tempo de compilação).
@@ -119,7 +119,14 @@ class AnalisadorSemanticoBase {
119
119
  */
120
120
  inferirTipoBinario(binario) {
121
121
  const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
122
- const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
122
+ const operadoresComparacao = [
123
+ 'MAIOR',
124
+ 'MAIOR_IGUAL',
125
+ 'MENOR',
126
+ 'MENOR_IGUAL',
127
+ 'IGUAL',
128
+ 'DIFERENTE',
129
+ ];
123
130
  // Operadores de comparação sempre retornam lógico
124
131
  if (operadoresComparacao.includes(binario.operador.tipo)) {
125
132
  return 'lógico';
@@ -146,8 +153,8 @@ class AnalisadorSemanticoBase {
146
153
  return 'qualquer';
147
154
  }
148
155
  /**
149
- * Marca as variáveis usadas em uma expressão.
150
- */
156
+ * Marca as variáveis usadas em uma expressão.
157
+ */
151
158
  marcarVariaveisUsadasEmExpressao(expressao) {
152
159
  if (expressao instanceof construtos_1.Variavel) {
153
160
  this.gerenciadorEscopos.marcarComoUsada(expressao.simbolo.lexema);
@@ -233,7 +240,8 @@ class AnalisadorSemanticoBase {
233
240
  if (!caminhoSenaoResolvido || ((_a = caminhoSenaoResolvido.declaracoes) === null || _a === void 0 ? void 0 : _a.length) === 0) {
234
241
  return false;
235
242
  }
236
- if (caminhoSenaoResolvido instanceof declaracoes_1.Se && ((_b = caminhoSenaoResolvido.caminhoEntao.declaracoes) === null || _b === void 0 ? void 0 : _b.length) === 1) {
243
+ if (caminhoSenaoResolvido instanceof declaracoes_1.Se &&
244
+ ((_b = caminhoSenaoResolvido.caminhoEntao.declaracoes) === null || _b === void 0 ? void 0 : _b.length) === 1) {
237
245
  const senaoSeRetorna = this.verificarSeRetorna(caminhoSenaoResolvido);
238
246
  return entaoRetorna && senaoSeRetorna;
239
247
  }
@@ -592,7 +600,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
592
600
  }
593
601
  visitarChamadaPorVariavel(entidadeChamadaVariavel, argumentos) {
594
602
  const variavel = entidadeChamadaVariavel;
595
- const funcaoChamada = this.gerenciadorEscopos.buscar(variavel.simbolo.lexema) || this.funcoes[variavel.simbolo.lexema];
603
+ const funcaoChamada = this.gerenciadorEscopos.buscar(variavel.simbolo.lexema) ||
604
+ this.funcoes[variavel.simbolo.lexema];
596
605
  if (!funcaoChamada) {
597
606
  this.erro(entidadeChamadaVariavel.simbolo, `Chamada da função '${entidadeChamadaVariavel.simbolo.lexema}' não existe.`);
598
607
  return Promise.resolve();
@@ -889,15 +898,18 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
889
898
  // Verifica se a expressão problemática é um Leia ou uma variável inicializada com Leia
890
899
  let mensagemAdicional = '';
891
900
  if (expressaoProblematica instanceof construtos_1.Leia) {
892
- mensagemAdicional = " Função 'leia()' retorna texto. Use 'inteiro(leia(...))' ou 'real(leia(...))' para converter.";
901
+ mensagemAdicional =
902
+ " Função 'leia()' retorna texto. Use 'inteiro(leia(...))' ou 'real(leia(...))' para converter.";
893
903
  }
894
904
  else if (expressaoProblematica instanceof construtos_1.Variavel) {
895
905
  const variavel = this.gerenciadorEscopos.buscar(expressaoProblematica.simbolo.lexema);
896
906
  if (variavel && variavel.valor instanceof construtos_1.Leia) {
897
- mensagemAdicional = " A variável foi inicializada com 'leia()' que retorna texto. Use 'inteiro(leia(...))' ou 'real(leia(...))' para converter.";
907
+ mensagemAdicional =
908
+ " A variável foi inicializada com 'leia()' que retorna texto. Use 'inteiro(leia(...))' ou 'real(leia(...))' para converter.";
898
909
  }
899
910
  else {
900
- mensagemAdicional = " Use 'inteiro(...)' ou 'real(...)' para converter texto em número.";
911
+ mensagemAdicional =
912
+ " Use 'inteiro(...)' ou 'real(...)' para converter texto em número.";
901
913
  }
902
914
  }
903
915
  this.erro(binario.operador, `Operação aritmética com tipo incompatível: operando ${ladoProblematico} é do tipo 'texto', mas a operação requer número.${mensagemAdicional}`);
@@ -906,8 +918,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
906
918
  }
907
919
  if (tipoEsquerda && tipoDireita && tipoEsquerda !== tipoDireita) {
908
920
  // Verificar se são tipos numéricos compatíveis
909
- const ambosNumericos = tiposNumericos.includes(tipoEsquerda) &&
910
- tiposNumericos.includes(tipoDireita);
921
+ const ambosNumericos = tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita);
911
922
  if (!ambosNumericos) {
912
923
  this.aviso(binario.operador, `Operação entre tipos diferentes: tipo esquerdo '${tipoEsquerda}' e tipo direito '${tipoDireita}'. O resultado será resolvido implicitamente.`);
913
924
  }
@@ -1015,7 +1026,15 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1015
1026
  let entidadeChamadaVariavel = chamada.entidadeChamada;
1016
1027
  const nomeFuncao = entidadeChamadaVariavel.simbolo.lexema;
1017
1028
  // Lista de funções built-in que não precisam ser declaradas
1018
- const funcoesBuiltIn = ['inteiro', 'real', 'número', 'texto', 'leia', 'escreva', 'tipo'];
1029
+ const funcoesBuiltIn = [
1030
+ 'inteiro',
1031
+ 'real',
1032
+ 'número',
1033
+ 'texto',
1034
+ 'leia',
1035
+ 'escreva',
1036
+ 'tipo',
1037
+ ];
1019
1038
  // Classes/construtores geralmente começam com letra maiúscula
1020
1039
  const pareceSerClasse = nomeFuncao[0] === nomeFuncao[0].toUpperCase();
1021
1040
  // Só verifica se a função existe se não for built-in e não parecer ser classe
@@ -1070,7 +1089,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1070
1089
  tipo: 'IDENTIFICADOR',
1071
1090
  linha: literal.linha,
1072
1091
  hashArquivo: literal.hashArquivo,
1073
- literal: null
1092
+ literal: null,
1074
1093
  }, `Variável ou função '${nomeVariavel}' usada em interpolação não existe.`);
1075
1094
  }
1076
1095
  else if (variavel) {
@@ -1083,7 +1102,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1083
1102
  tipo: 'IDENTIFICADOR',
1084
1103
  linha: literal.linha,
1085
1104
  hashArquivo: literal.hashArquivo,
1086
- literal: null
1105
+ literal: null,
1087
1106
  }, `Variável '${nomeVariavel}' usada em interpolação pode não ter sido inicializada.`);
1088
1107
  }
1089
1108
  }
@@ -1146,7 +1165,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1146
1165
  inicializada: true,
1147
1166
  usada: false,
1148
1167
  hashArquivo: declaracao.simbolo.hashArquivo,
1149
- linha: declaracao.simbolo.linha
1168
+ linha: declaracao.simbolo.linha,
1150
1169
  });
1151
1170
  // TODO: Verificar inicializador.
1152
1171
  return Promise.resolve();
@@ -1178,7 +1197,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1178
1197
  if (tipoValor === 'string' && tipoRetornoFuncao !== 'texto') {
1179
1198
  this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
1180
1199
  }
1181
- if (tipoValor === 'number' && !['inteiro', 'real', 'número'].includes(tipoRetornoFuncao)) {
1200
+ if (tipoValor === 'number' &&
1201
+ !['inteiro', 'real', 'número'].includes(tipoRetornoFuncao)) {
1182
1202
  this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
1183
1203
  }
1184
1204
  }
@@ -1203,17 +1223,21 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1203
1223
  tipoInferido = this.obterTipoExpressao(declaracao.inicializador);
1204
1224
  }
1205
1225
  // Sugestão de tipo melhor quando 'qualquer' é usado explicitamente
1206
- if (declaracao.tipoExplicito && declaracao.tipoOriginal === 'qualquer' && declaracao.inicializador) {
1226
+ if (declaracao.tipoExplicito &&
1227
+ declaracao.tipoOriginal === 'qualquer' &&
1228
+ declaracao.inicializador) {
1207
1229
  const tipoMelhor = this.obterTipoExpressao(declaracao.inicializador);
1208
1230
  if (tipoMelhor && tipoMelhor !== 'qualquer') {
1209
- this.sugestao(declaracao.simbolo, 'Um tipo melhor pode ser inferido.', [{
1231
+ this.sugestao(declaracao.simbolo, 'Um tipo melhor pode ser inferido.', [
1232
+ {
1210
1233
  titulo: `Alterar tipo para '${tipoMelhor}'`,
1211
1234
  textoOriginal: 'qualquer',
1212
1235
  textoSubstituto: tipoMelhor,
1213
1236
  linha: declaracao.simbolo.linha,
1214
1237
  colunaInicio: declaracao.simbolo.colunaInicio,
1215
1238
  colunaFim: declaracao.simbolo.colunaFim,
1216
- }]);
1239
+ },
1240
+ ]);
1217
1241
  }
1218
1242
  }
1219
1243
  const variavel = {
@@ -1224,7 +1248,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1224
1248
  inicializada: declaracao.inicializador !== null && declaracao.inicializador !== undefined,
1225
1249
  usada: false,
1226
1250
  hashArquivo: declaracao.simbolo.hashArquivo,
1227
- linha: declaracao.simbolo.linha
1251
+ linha: declaracao.simbolo.linha,
1228
1252
  };
1229
1253
  const declaradaComSucesso = this.gerenciadorEscopos.declarar(declaracao.simbolo.lexema, variavel);
1230
1254
  if (!declaradaComSucesso) {
@@ -1282,13 +1306,22 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1282
1306
  }
1283
1307
  estaEmClasseOuSubclasse(nomeClasse) {
1284
1308
  var _a;
1285
- let atual = this.classeAtualEmAnalise;
1286
- while (atual !== null) {
1309
+ const visitados = new Set();
1310
+ const pilha = [this.classeAtualEmAnalise];
1311
+ while (pilha.length > 0) {
1312
+ const atual = pilha.pop();
1313
+ if (!atual)
1314
+ continue;
1315
+ if (visitados.has(atual.simbolo.lexema))
1316
+ continue;
1317
+ visitados.add(atual.simbolo.lexema);
1287
1318
  if (atual.simbolo.lexema === nomeClasse)
1288
1319
  return true;
1289
- if (!atual.superClasse)
1290
- break;
1291
- atual = (_a = this.classesRegistradas.get(atual.superClasse.simbolo.lexema)) !== null && _a !== void 0 ? _a : null;
1320
+ for (const sc of atual.superClasses) {
1321
+ const pai = (_a = this.classesRegistradas.get(sc.simbolo.lexema)) !== null && _a !== void 0 ? _a : null;
1322
+ if (pai)
1323
+ pilha.push(pai);
1324
+ }
1292
1325
  }
1293
1326
  return false;
1294
1327
  }
@@ -1316,13 +1349,13 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1316
1349
  }
1317
1350
  }
1318
1351
  async visitarDeclaracaoClasse(declaracao) {
1319
- if (declaracao.superClasse) {
1320
- const nomeSuperclasse = declaracao.superClasse.simbolo.lexema;
1352
+ for (const superClasseVariavel of declaracao.superClasses) {
1353
+ const nomeSuperclasse = superClasseVariavel.simbolo.lexema;
1321
1354
  if (nomeSuperclasse === declaracao.simbolo.lexema) {
1322
- this.erro(declaracao.superClasse.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
1355
+ this.erro(superClasseVariavel.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
1323
1356
  }
1324
1357
  else if (!this.classesDeclararadas.has(nomeSuperclasse)) {
1325
- this.erro(declaracao.superClasse.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
1358
+ this.erro(superClasseVariavel.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
1326
1359
  }
1327
1360
  }
1328
1361
  this.classesDeclararadas.add(declaracao.simbolo.lexema);
@@ -1360,7 +1393,9 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1360
1393
  retorno.tipo === 'qualquer');
1361
1394
  // Se a função é 'vazio' e há retornos com tipo indeterminado,
1362
1395
  // tenta inferir o tipo e fornece mensagem útil ao desenvolvedor
1363
- if (tipoRetornoFuncao === 'vazio' && declaracao.funcao.tipoExplicito && retornosComTipoIndeterminado.length > 0) {
1396
+ if (tipoRetornoFuncao === 'vazio' &&
1397
+ declaracao.funcao.tipoExplicito &&
1398
+ retornosComTipoIndeterminado.length > 0) {
1364
1399
  const retornoComValor = retornosComTipoIndeterminado[0];
1365
1400
  const tipoInferido = this.obterTipoExpressao(retornoComValor.valor);
1366
1401
  if (tipoInferido && tipoInferido !== 'qualquer') {
@@ -1379,7 +1414,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1379
1414
  if (tipoValor === 'string' && tipoRetornoFuncao !== 'texto') {
1380
1415
  this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
1381
1416
  }
1382
- if (tipoValor === 'number' && !['inteiro', 'real', 'número'].includes(tipoRetornoFuncao)) {
1417
+ if (tipoValor === 'number' &&
1418
+ !['inteiro', 'real', 'número'].includes(tipoRetornoFuncao)) {
1383
1419
  this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
1384
1420
  }
1385
1421
  }
@@ -1395,7 +1431,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1395
1431
  const naoUsadas = this.gerenciadorEscopos.obterVariaveisNaoUsadas();
1396
1432
  for (let variavel of naoUsadas) {
1397
1433
  // Verifica se já existe um erro associado à variável.
1398
- const temErro = this.diagnosticos.some(d => d.severidade === erros_1.DiagnosticoSeveridade.ERRO &&
1434
+ const temErro = this.diagnosticos.some((d) => d.severidade === erros_1.DiagnosticoSeveridade.ERRO &&
1399
1435
  d.simbolo.lexema === variavel.nome);
1400
1436
  // Se a variável já tem um erro associado, não emitir aviso de não usada.
1401
1437
  if (temErro) {
@@ -1405,7 +1441,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1405
1441
  lexema: variavel.nome,
1406
1442
  linha: variavel.linha,
1407
1443
  tipo: variavel.tipo,
1408
- hashArquivo: variavel.hashArquivo
1444
+ hashArquivo: variavel.hashArquivo,
1409
1445
  }, `Variável '${variavel.nome}' foi declarada mas nunca usada.`);
1410
1446
  }
1411
1447
  }
@@ -1914,6 +1950,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1914
1950
  if (this.simbolos[this.atual].lexema in this.tiposDefinidosEmCodigo) {
1915
1951
  return this.simbolos[this.atual].lexema;
1916
1952
  }
1953
+ if (this.simbolos[this.atual].lexema in this.interfacesDeclaradas) {
1954
+ return this.simbolos[this.atual].lexema;
1955
+ }
1917
1956
  const lexemaElementar = this.simbolos[this.atual].lexema.toLowerCase();
1918
1957
  const tipoElementarResolvido = tipos.find((tipo) => tipo === lexemaElementar);
1919
1958
  if (!tipoElementarResolvido) {
@@ -1940,7 +1979,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1940
1979
  }
1941
1980
  async construtoAjuda() {
1942
1981
  const simboloAjuda = this.avancarEDevolverAnterior();
1943
- if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
1982
+ if (this.estaNoFinal() ||
1983
+ this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
1944
1984
  return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
1945
1985
  }
1946
1986
  this.avancarEDevolverAnterior(); // parêntese esquerdo
@@ -2367,7 +2407,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2367
2407
  // o analisador semântico emitir o diagnóstico quando apropriado.
2368
2408
  tipoIdentificadorCorrespondente = 'qualquer';
2369
2409
  }
2370
- if (!tipoIdentificadorCorrespondente.endsWith('[]') && !['dicionário', 'qualquer', 'texto', 'tupla', 'vetor'].includes(tipoIdentificadorCorrespondente)) {
2410
+ if (!tipoIdentificadorCorrespondente.endsWith('[]') &&
2411
+ !['dicionário', 'qualquer', 'texto', 'tupla', 'vetor'].includes(tipoIdentificadorCorrespondente)) {
2371
2412
  throw this.erro(this.simbolos[this.atual], `Tipo ${tipoIdentificadorCorrespondente} não suporta acesso por índice.`);
2372
2413
  }
2373
2414
  let tipoAcesso = 'qualquer';
@@ -2441,8 +2482,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2441
2482
  if (expressaoAnterior.tipo === 'dicionário' &&
2442
2483
  expressaoAnterior.constructor !== construtos_1.Dicionario) {
2443
2484
  const elementoMontaoTipos = this.resolverElementoMontao(expressaoAnterior);
2444
- if (elementoMontaoTipos &&
2445
- nome.lexema in elementoMontaoTipos.subElementos) {
2485
+ if (elementoMontaoTipos && nome.lexema in elementoMontaoTipos.subElementos) {
2446
2486
  tipoInferido = elementoMontaoTipos.subElementos[nome.lexema].tipo;
2447
2487
  }
2448
2488
  }
@@ -2699,7 +2739,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2699
2739
  if (construto instanceof construtos_1.Unario) {
2700
2740
  const operando = construto.operando;
2701
2741
  // Verifica se o operando é um vetor
2702
- if (operando instanceof construtos_1.Vetor || operando.tipo === 'vetor' || operando.tipo.endsWith('[]')) {
2742
+ if (operando instanceof construtos_1.Vetor ||
2743
+ operando.tipo === 'vetor' ||
2744
+ operando.tipo.endsWith('[]')) {
2703
2745
  return true;
2704
2746
  }
2705
2747
  // Verifica recursivamente para casos como !![]
@@ -3310,7 +3352,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3310
3352
  }
3311
3353
  async declaracaoSe() {
3312
3354
  const condicao = await this.expressao();
3313
- const caminhoEntao = await this.resolverDeclaracao();
3355
+ const caminhoEntao = (await this.resolverDeclaracao());
3314
3356
  let caminhoSenao = null;
3315
3357
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
3316
3358
  caminhoSenao = await this.resolverDeclaracao();
@@ -3441,20 +3483,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3441
3483
  // Uma delas é a variável/constante ser uma classe padrão.
3442
3484
  // Isso ocorre quando a importação é feita de uma biblioteca Node.js.
3443
3485
  // Nesse caso, o tipo de `entidadeChamada.objeto` começa com uma letra maiúscula.
3444
- if (entidadeChamada.objeto.tipo &&
3445
- entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
3486
+ if (entidadeChamada.objeto.tipo && entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
3446
3487
  const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[entidadeChamada.objeto.tipo];
3447
3488
  if (!tipoCorrespondente) {
3448
3489
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${entidadeChamada.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
3449
3490
  }
3450
- if (!(entidadeChamada.simbolo.lexema in
3451
- tipoCorrespondente.metodos) &&
3452
- !(entidadeChamada.simbolo.lexema in
3453
- tipoCorrespondente.propriedades)) {
3491
+ if (!(entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) &&
3492
+ !(entidadeChamada.simbolo.lexema in tipoCorrespondente.propriedades)) {
3454
3493
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Membro '${entidadeChamada.simbolo.lexema}' não existe no tipo '${entidadeChamada.objeto.tipo}'.`);
3455
3494
  }
3456
- if (entidadeChamada.simbolo.lexema in
3457
- tipoCorrespondente.metodos) {
3495
+ if (entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) {
3458
3496
  const metodoCorrespondente = tipoCorrespondente.metodos[entidadeChamada.simbolo.lexema];
3459
3497
  return metodoCorrespondente.tipoRetorno || 'qualquer';
3460
3498
  }
@@ -3807,7 +3845,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3807
3845
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo da interface.");
3808
3846
  const metodos = [];
3809
3847
  const propriedades = [];
3810
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
3848
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
3849
+ !this.estaNoFinal()) {
3811
3850
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
3812
3851
  if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA))
3813
3852
  break;
@@ -3858,13 +3897,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3858
3897
  const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
3859
3898
  // Pré-registro para permitir auto-referência no corpo da própria classe,
3860
3899
  // como em `MinhaClasse.propriedadeEstatica` dentro de métodos.
3861
- this.tiposDefinidosEmCodigo[simbolo.lexema] = (_a = this.tiposDefinidosEmCodigo[simbolo.lexema]) !== null && _a !== void 0 ? _a : {};
3900
+ this.tiposDefinidosEmCodigo[simbolo.lexema] =
3901
+ (_a = this.tiposDefinidosEmCodigo[simbolo.lexema]) !== null && _a !== void 0 ? _a : {};
3862
3902
  const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
3863
- let superClasse = null;
3903
+ // Verificar `herda SuperclasseA, SuperclasseB`
3904
+ const superClasses = [];
3864
3905
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
3865
- const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3866
- this.superclasseAtual = simboloSuperclasse.lexema;
3867
- superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
3906
+ do {
3907
+ const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3908
+ if (superClasses.length === 0) {
3909
+ this.superclasseAtual = simboloSuperclasse.lexema;
3910
+ }
3911
+ superClasses.push(new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema));
3912
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
3868
3913
  }
3869
3914
  // Verificar `implementa InterfaceA, InterfaceB`
3870
3915
  const implementaInterfaces = [];
@@ -3873,6 +3918,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3873
3918
  implementaInterfaces.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome de interface após "implementa".'));
3874
3919
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
3875
3920
  }
3921
+ // Verificar `mescla MisturávelA, MisturávelB`
3922
+ const mesclas = [];
3923
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MESCLA)) {
3924
+ do {
3925
+ const simboloMisturavel = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome de classe após "mescla".');
3926
+ mesclas.push(new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloMisturavel.lexema));
3927
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
3928
+ }
3876
3929
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
3877
3930
  this.pilhaDecoradores = [];
3878
3931
  const metodos = [];
@@ -3883,7 +3936,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3883
3936
  */
3884
3937
  const compreenderMembros = async (acessoPadrao, ehEstaticoPadrao, ehAbstratoPadrao = false) => {
3885
3938
  var _a;
3886
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
3939
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
3940
+ !this.estaNoFinal()) {
3887
3941
  // Pular comentários normais dentro do corpo da classe.
3888
3942
  if (this.simbolos[this.atual].tipo === delegua_2.default.COMENTARIO ||
3889
3943
  this.simbolos[this.atual].tipo === delegua_2.default.LINHA_COMENTARIO) {
@@ -3904,12 +3958,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3904
3958
  // Detecção de bloco de contexto: modificador seguido de '{'
3905
3959
  const tipoAtual = this.simbolos[this.atual].tipo;
3906
3960
  const tipoProximo = (_a = this.simbolos[this.atual + 1]) === null || _a === void 0 ? void 0 : _a.tipo;
3907
- const ehBlocoAcesso = [delegua_2.default.PRIVADO, delegua_2.default.PROTEGIDO].includes(tipoAtual)
3908
- && tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
3909
- const ehBlocoEstatico = tipoAtual === delegua_2.default.ESTATICO
3910
- && tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
3911
- const ehBlocoAbstrato = tipoAtual === delegua_2.default.ABSTRATO
3912
- && tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
3961
+ const ehBlocoAcesso = [delegua_2.default.PRIVADO, delegua_2.default.PROTEGIDO].includes(tipoAtual) &&
3962
+ tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
3963
+ const ehBlocoEstatico = tipoAtual === delegua_2.default.ESTATICO &&
3964
+ tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
3965
+ const ehBlocoAbstrato = tipoAtual === delegua_2.default.ABSTRATO &&
3966
+ tipoProximo === delegua_2.default.CHAVE_ESQUERDA;
3913
3967
  if (ehBlocoAcesso) {
3914
3968
  const novoAcesso = tipoAtual === delegua_2.default.PRIVADO ? 'privado' : 'protegido';
3915
3969
  this.avancarEDevolverAnterior(); // consume modificador de acesso
@@ -4006,14 +4060,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4006
4060
  for (const declaracao of corpo) {
4007
4061
  expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
4008
4062
  }
4009
- const tiposRetornos = new Set(expressoesRetorna.filter((e) => e.tipo !== 'qualquer').map((e) => e.tipo));
4063
+ const tiposRetornos = new Set(expressoesRetorna
4064
+ .filter((e) => e.tipo !== 'qualquer')
4065
+ .map((e) => e.tipo));
4010
4066
  const retornaChamadoExplicitamente = tiposRetornos.size > 0;
4011
4067
  tiposRetornos.delete('qualquer');
4012
4068
  if (tipoRetorno === 'qualquer') {
4013
4069
  if (tiposRetornos.size > 0) {
4014
4070
  tipoRetorno = tiposRetornos.values().next().value;
4015
4071
  }
4016
- else if (!retornaChamadoExplicitamente && !definicaoExplicitaDeTipo) {
4072
+ else if (!retornaChamadoExplicitamente &&
4073
+ !definicaoExplicitaDeTipo) {
4017
4074
  tipoRetorno = 'vazio';
4018
4075
  }
4019
4076
  }
@@ -4035,7 +4092,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4035
4092
  const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
4036
4093
  this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
4037
4094
  const tipoPropriedade = this.avancarEDevolverAnterior();
4038
- const prop = new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, Array.from(this.pilhaDecoradores), modificadorAcesso, ehEstatico);
4095
+ let nomeTipoPropriedade = tipoPropriedade.lexema;
4096
+ if (this.verificarTipoSimboloAtual(delegua_2.default.COLCHETE_ESQUERDO)) {
4097
+ this.avancarEDevolverAnterior(); // consume '['
4098
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após '[' na definição do tipo de propriedade.");
4099
+ nomeTipoPropriedade = `${nomeTipoPropriedade}[]`;
4100
+ }
4101
+ const prop = new declaracoes_1.PropriedadeClasse(nomePropriedade, nomeTipoPropriedade, Array.from(this.pilhaDecoradores), modificadorAcesso, ehEstatico);
4039
4102
  prop.documentacao = docAtual;
4040
4103
  // Auto-propriedade: `nome: tipo { obter; definir; }`
4041
4104
  // Ou corpo personalizado: `nome: tipo { obter() { ... } definir(valor) { ... } }`
@@ -4063,13 +4126,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4063
4126
  let tipoAcessor = 'qualquer';
4064
4127
  let expressoesRetornaAcessor = [];
4065
4128
  for (const declaracao of corpoAcessor) {
4066
- expressoesRetornaAcessor = expressoesRetornaAcessor.concat((0, comum_1.buscarRetornos)(declaracao));
4129
+ expressoesRetornaAcessor =
4130
+ expressoesRetornaAcessor.concat((0, comum_1.buscarRetornos)(declaracao));
4067
4131
  }
4068
- const tiposRetornosAcessor = new Set(expressoesRetornaAcessor.filter((e) => e.tipo !== 'qualquer').map((e) => e.tipo));
4132
+ const tiposRetornosAcessor = new Set(expressoesRetornaAcessor
4133
+ .filter((e) => e.tipo !== 'qualquer')
4134
+ .map((e) => e.tipo));
4069
4135
  const retornaExplicitamenteAcessor = tiposRetornosAcessor.size > 0;
4070
4136
  tiposRetornosAcessor.delete('qualquer');
4071
4137
  if (tiposRetornosAcessor.size > 0) {
4072
- tipoAcessor = tiposRetornosAcessor.values().next().value;
4138
+ tipoAcessor = tiposRetornosAcessor
4139
+ .values()
4140
+ .next().value;
4073
4141
  }
4074
4142
  else if (!retornaExplicitamenteAcessor) {
4075
4143
  tipoAcessor = 'vazio';
@@ -4121,28 +4189,59 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4121
4189
  await compreenderMembros('publico', false);
4122
4190
  this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
4123
4191
  // Verificação em tempo de análise: classe deve implementar todos os contratos das interfaces.
4192
+ const linhaFinalClasse = this.simbolos[this.atual - 1].linha;
4124
4193
  for (const nomeInterface of implementaInterfaces) {
4125
4194
  const interfaceDecl = this.interfacesDeclaradas[nomeInterface.lexema];
4126
4195
  if (!interfaceDecl) {
4127
4196
  this.erros.push(this.erro(nomeInterface, `Interface '${nomeInterface.lexema}' não foi declarada antes da classe '${simbolo.lexema}'.`));
4128
4197
  continue;
4129
4198
  }
4199
+ const membrosFaltando = [];
4130
4200
  for (const assinatura of interfaceDecl.metodos) {
4131
4201
  const nomeMetodo = assinatura.nome.lexema;
4132
4202
  const implementado = metodos.some((m) => m.simbolo.lexema === nomeMetodo);
4133
4203
  if (!implementado) {
4134
- this.erros.push(this.erro(simbolo, `Classe '${simbolo.lexema}' não implementa o método '${nomeMetodo}' exigido pela interface '${nomeInterface.lexema}'.`));
4204
+ membrosFaltando.push({
4205
+ tipo: 'metodo',
4206
+ nome: nomeMetodo,
4207
+ parametros: assinatura.parametros.map((p) => ({
4208
+ nome: p.nome.lexema,
4209
+ tipoDado: p.tipoDado,
4210
+ })),
4211
+ tipoRetorno: assinatura.tipoRetorno,
4212
+ });
4135
4213
  }
4136
4214
  }
4137
4215
  for (const prop of interfaceDecl.propriedades) {
4138
4216
  const nomeProp = prop.nome.lexema;
4139
4217
  const implementada = propriedades.some((p) => p.nome.lexema === nomeProp);
4140
4218
  if (!implementada) {
4141
- this.erros.push(this.erro(simbolo, `Classe '${simbolo.lexema}' não declara a propriedade '${nomeProp}' exigida pela interface '${nomeInterface.lexema}'.`));
4219
+ membrosFaltando.push({
4220
+ tipo: 'propriedade',
4221
+ nome: nomeProp,
4222
+ tipoPropriedade: prop.tipo,
4223
+ });
4224
+ }
4225
+ }
4226
+ if (membrosFaltando.length > 0) {
4227
+ const correcaoSugerida = {
4228
+ tipo: 'implementar-interface',
4229
+ nomeInterface: nomeInterface.lexema,
4230
+ nomeClasse: simbolo.lexema,
4231
+ membrosFaltando,
4232
+ linhaFinalClasse,
4233
+ };
4234
+ for (const membro of membrosFaltando) {
4235
+ const mensagem = membro.tipo === 'metodo'
4236
+ ? `Classe '${simbolo.lexema}' não implementa o método '${membro.nome}' exigido pela interface '${nomeInterface.lexema}'.`
4237
+ : `Classe '${simbolo.lexema}' não declara a propriedade '${membro.nome}' exigida pela interface '${nomeInterface.lexema}'.`;
4238
+ const erro = this.erro(simbolo, mensagem);
4239
+ erro.correcaoSugerida = correcaoSugerida;
4240
+ this.erros.push(erro);
4142
4241
  }
4143
4242
  }
4144
4243
  }
4145
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstatica, implementaInterfaces);
4244
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstatica, implementaInterfaces, mesclas);
4146
4245
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
4147
4246
  this.superclasseAtual = undefined;
4148
4247
  return definicaoClasse;
@@ -4166,7 +4265,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4166
4265
  if (!this.primitivasConhecidas[nomeTipo]) {
4167
4266
  this.primitivasConhecidas[nomeTipo] = {};
4168
4267
  }
4169
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
4268
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
4269
+ !this.estaNoFinal()) {
4170
4270
  // Pular comentários dentro do corpo da extensão.
4171
4271
  if (this.simbolos[this.atual].tipo === delegua_2.default.COMENTARIO ||
4172
4272
  this.simbolos[this.atual].tipo === delegua_2.default.LINHA_COMENTARIO) {
@@ -4214,7 +4314,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4214
4314
  const metodo = new declaracoes_1.FuncaoDeclaracao(nomeMetodo, corpoFuncao, tipoDaFuncao);
4215
4315
  metodos.push(metodo);
4216
4316
  const argumentos = params.map((parametro) => new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer', parametro.valorPadrao === undefined));
4217
- this.primitivasConhecidas[nomeTipo][nomeMetodo.lexema] = new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeMetodo.lexema, tipoRetorno, true, argumentos);
4317
+ this.primitivasConhecidas[nomeTipo][nomeMetodo.lexema] =
4318
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeMetodo.lexema, tipoRetorno, true, argumentos);
4218
4319
  }
4219
4320
  this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' ao final da extensão.");
4220
4321
  return new declaracoes_1.Extensao(simboloTipo, metodos, ehGlobal, this.hashArquivo);
@@ -4246,7 +4347,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4246
4347
  this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
4247
4348
  this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
4248
4349
  this.avancarEDevolverAnterior();
4249
- const declaracaoFuncao = await this.funcao('funcao');
4350
+ const declaracaoFuncao = (await this.funcao('funcao'));
4250
4351
  declaracaoFuncao.documentacao = docTopLevel;
4251
4352
  return declaracaoFuncao;
4252
4353
  }
@@ -4320,7 +4421,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4320
4421
  this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
4321
4422
  this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
4322
4423
  this.avancarEDevolverAnterior();
4323
- const declaracaoFuncao = await this.funcao('funcao');
4424
+ const declaracaoFuncao = (await this.funcao('funcao'));
4324
4425
  declaracaoFuncao.documentacao = new construtos_1.ComentarioComoConstruto(simboloDoc);
4325
4426
  return declaracaoFuncao;
4326
4427
  }
@@ -4390,7 +4491,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4390
4491
  }
4391
4492
  async declaracaoAjuda() {
4392
4493
  const simboloAjuda = this.avancarEDevolverAnterior();
4393
- if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
4494
+ if (this.estaNoFinal() ||
4495
+ this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
4394
4496
  return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
4395
4497
  }
4396
4498
  this.avancarEDevolverAnterior(); // parêntese esquerdo
@@ -4412,10 +4514,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4412
4514
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
4413
4515
  // Funções nativas de Delégua
4414
4516
  this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'número'));
4517
+ this.pilhaEscopos.definirInformacoesVariavel('aleatório', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatório', 'número'));
4415
4518
  this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorioEntre', 'número', true, [
4416
4519
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
4417
4520
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
4418
4521
  ]));
4522
+ this.pilhaEscopos.definirInformacoesVariavel('aleatórioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatórioEntre', 'número', true, [
4523
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
4524
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
4525
+ ]));
4419
4526
  this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('algum', 'lógico', true, [
4420
4527
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4421
4528
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
@@ -4431,14 +4538,26 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4431
4538
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4432
4539
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4433
4540
  ]));
4541
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarÍndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÍndice', 'inteiro', true, [
4542
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4543
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4544
+ ]));
4434
4545
  this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimo', 'inteiro', true, [
4435
4546
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4436
4547
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4437
4548
  ]));
4549
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarÚltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÚltimo', 'inteiro', true, [
4550
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4551
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4552
+ ]));
4438
4553
  this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimoIndice', 'inteiro', true, [
4439
4554
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4440
4555
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4441
4556
  ]));
4557
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarÚltimoÍndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÚltimoÍndice', 'inteiro', true, [
4558
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4559
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4560
+ ]));
4442
4561
  this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrarPor', 'qualquer[]', true, [
4443
4562
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4444
4563
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
@@ -4447,6 +4566,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4447
4566
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4448
4567
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
4449
4568
  ]));
4569
+ this.pilhaEscopos.definirInformacoesVariavel('incluído', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('incluído', 'lógico', true, [
4570
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4571
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
4572
+ ]));
4450
4573
  this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('inteiro', 'inteiro', true, [
4451
4574
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
4452
4575
  ]));
@@ -4462,6 +4585,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4462
4585
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4463
4586
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoMapeamento', 'função'),
4464
4587
  ]));
4588
+ this.pilhaEscopos.definirInformacoesVariavel('maximo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'qualquer', true, [
4589
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4590
+ ]));
4591
+ this.pilhaEscopos.definirInformacoesVariavel('máximo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('máximo', 'qualquer', true, [
4592
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4593
+ ]));
4594
+ this.pilhaEscopos.definirInformacoesVariavel('minimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'qualquer', true, [
4595
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4596
+ ]));
4597
+ this.pilhaEscopos.definirInformacoesVariavel('mínimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('mínimo', 'qualquer', true, [
4598
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4599
+ ]));
4465
4600
  this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
4466
4601
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
4467
4602
  ]));
@@ -4480,6 +4615,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4480
4615
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4481
4616
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
4482
4617
  ]));
4618
+ this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondição', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiroEmCondição', 'qualquer', true, [
4619
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4620
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
4621
+ ]));
4483
4622
  this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('real', 'número', true, [
4484
4623
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
4485
4624
  ]));
@@ -4495,12 +4634,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4495
4634
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
4496
4635
  ]));
4497
4636
  this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
4498
- new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer')
4637
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
4499
4638
  ]));
4500
4639
  this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
4501
4640
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
4502
4641
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
4503
4642
  ]));
4643
+ this.pilhaEscopos.definirInformacoesVariavel('todosEmCondição', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondição', 'lógico', true, [
4644
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
4645
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
4646
+ ]));
4504
4647
  this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
4505
4648
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4506
4649
  ]));
@@ -5276,7 +5419,7 @@ class AvaliadorSintaticoEguaClassico {
5276
5419
  }
5277
5420
  this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
5278
5421
  this.superclasseAtual = undefined;
5279
- return new declaracoes_1.Classe(nome, superClasse, metodos);
5422
+ return new declaracoes_1.Classe(nome, superClasse ? [superClasse] : [], metodos);
5280
5423
  }
5281
5424
  resolverDeclaracaoForaDeBloco() {
5282
5425
  try {
@@ -5370,20 +5513,16 @@ class AvaliadorSintaticoPitugues {
5370
5513
  // Uma delas é a variável/constante ser uma classe padrão.
5371
5514
  // Isso ocorre quando a importação é feita de uma biblioteca Node.js.
5372
5515
  // Nesse caso, o tipo de `entidadeChamada.objeto` começa com uma letra maiúscula.
5373
- if (entidadeChamada.objeto.tipo &&
5374
- entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
5516
+ if (entidadeChamada.objeto.tipo && entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
5375
5517
  const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[entidadeChamada.objeto.tipo];
5376
5518
  if (!tipoCorrespondente) {
5377
5519
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${entidadeChamada.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
5378
5520
  }
5379
- if (!(entidadeChamada.simbolo.lexema in
5380
- tipoCorrespondente.metodos) &&
5381
- !(entidadeChamada.simbolo.lexema in
5382
- tipoCorrespondente.propriedades)) {
5521
+ if (!(entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) &&
5522
+ !(entidadeChamada.simbolo.lexema in tipoCorrespondente.propriedades)) {
5383
5523
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Membro '${entidadeChamada.simbolo.lexema}' não existe no tipo '${entidadeChamada.objeto.tipo}'.`);
5384
5524
  }
5385
- if (entidadeChamada.simbolo.lexema in
5386
- tipoCorrespondente.metodos) {
5525
+ if (entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) {
5387
5526
  const metodoCorrespondente = tipoCorrespondente.metodos[entidadeChamada.simbolo.lexema];
5388
5527
  return metodoCorrespondente.tipoRetorno || 'qualquer';
5389
5528
  }
@@ -5516,7 +5655,8 @@ class AvaliadorSintaticoPitugues {
5516
5655
  pos++;
5517
5656
  }
5518
5657
  // Verifica se há um identificador obrigatório
5519
- if (pos >= this.simbolos.length || this.simbolos[pos].tipo !== pitugues_2.default.IDENTIFICADOR) {
5658
+ if (pos >= this.simbolos.length ||
5659
+ this.simbolos[pos].tipo !== pitugues_2.default.IDENTIFICADOR) {
5520
5660
  return false;
5521
5661
  }
5522
5662
  pos++;
@@ -5539,7 +5679,7 @@ class AvaliadorSintaticoPitugues {
5539
5679
  }
5540
5680
  temPadraoVarComoPalavraChave() {
5541
5681
  // Verifica padrão: var identificador = ...
5542
- if (this.simbolos[this.atual].lexema !== "var") {
5682
+ if (this.simbolos[this.atual].lexema !== 'var') {
5543
5683
  return false;
5544
5684
  }
5545
5685
  const proximo = this.simbolos[this.atual + 1];
@@ -5572,7 +5712,9 @@ class AvaliadorSintaticoPitugues {
5572
5712
  this.consumir(pitugues_2.default.MULTIPLICACAO, '');
5573
5713
  ehRestoAtual = true;
5574
5714
  }
5575
- const identificador = this.consumir(pitugues_2.default.IDENTIFICADOR, ehRestoAtual ? 'Esperado nome de variável após operador *.' : 'Esperado nome de variável.');
5715
+ const identificador = this.consumir(pitugues_2.default.IDENTIFICADOR, ehRestoAtual
5716
+ ? 'Esperado nome de variável após operador *.'
5717
+ : 'Esperado nome de variável.');
5576
5718
  // Verifica * no nome da variável
5577
5719
  if (identificador.lexema.startsWith('*')) {
5578
5720
  ehRestoAtual = true;
@@ -5600,10 +5742,10 @@ class AvaliadorSintaticoPitugues {
5600
5742
  }
5601
5743
  construirValidacaoDesempacotamento(identificador, origem, qtdEsperada) {
5602
5744
  const linha = identificador.linha;
5603
- const chamadaTamanho = new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(pitugues_2.default.IDENTIFICADOR, "tamanho", null, linha, -1)), [origem]);
5604
- const condicaoErro = new construtos_1.Binario(this.hashArquivo, chamadaTamanho, new lexador_1.Simbolo(pitugues_2.default.DIFERENTE, "!=", null, linha, -1), new construtos_1.Literal(this.hashArquivo, linha, qtdEsperada, 'número'));
5745
+ const chamadaTamanho = new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(pitugues_2.default.IDENTIFICADOR, 'tamanho', null, linha, -1)), [origem]);
5746
+ const condicaoErro = new construtos_1.Binario(this.hashArquivo, chamadaTamanho, new lexador_1.Simbolo(pitugues_2.default.DIFERENTE, '!=', null, linha, -1), new construtos_1.Literal(this.hashArquivo, linha, qtdEsperada, 'número'));
5605
5747
  const mensagem = `Erro de execução: Você tentou desempacotar em ${qtdEsperada} variáveis, mas o vetor possui tamanho diferente.`;
5606
- const falha = new declaracoes_1.Falhar(new lexador_1.Simbolo(pitugues_2.default.FALHAR, "falhar", null, linha, -1), new construtos_1.Literal(this.hashArquivo, linha, mensagem, 'texto'));
5748
+ const falha = new declaracoes_1.Falhar(new lexador_1.Simbolo(pitugues_2.default.FALHAR, 'falhar', null, linha, -1), new construtos_1.Literal(this.hashArquivo, linha, mensagem, 'texto'));
5607
5749
  return new declaracoes_1.Se(condicaoErro, new declaracoes_1.Bloco(this.hashArquivo, linha, [falha]), [], null);
5608
5750
  }
5609
5751
  async declaracaoDeVariaveis() {
@@ -5615,7 +5757,8 @@ class AvaliadorSintaticoPitugues {
5615
5757
  const ehDesempacotamento = qtdIdentificadores > 1 && qtdValores === 1;
5616
5758
  if (indexResto > -1) {
5617
5759
  if (qtdValores < qtdIdentificadores - 1) {
5618
- if (!ehDesempacotamento || (ehDesempacotamento && inicializadores[0] instanceof construtos_1.Literal)) {
5760
+ if (!ehDesempacotamento ||
5761
+ (ehDesempacotamento && inicializadores[0] instanceof construtos_1.Literal)) {
5619
5762
  throw this.erro(this.simboloAnterior(), 'Quantidade insuficiente de valores para desempacotamento com operador de resto.');
5620
5763
  }
5621
5764
  }
@@ -5651,7 +5794,7 @@ class AvaliadorSintaticoPitugues {
5651
5794
  for (let i = 0; i < identificadores.length; i++) {
5652
5795
  const identificador = identificadores[i];
5653
5796
  let inicializador;
5654
- let tipo = "qualquer";
5797
+ let tipo = 'qualquer';
5655
5798
  if (i === indexResto) {
5656
5799
  const valoresResto = inicializadores.slice(cursorValores, cursorValores + qtdParaResto);
5657
5800
  let tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(valoresResto);
@@ -5858,17 +6001,19 @@ class AvaliadorSintaticoPitugues {
5858
6001
  case pitugues_2.default.INTERPOLACAO:
5859
6002
  const simboloInterpolacao = this.avancarEDevolverAnterior();
5860
6003
  const conteudoOriginal = simboloInterpolacao.literal;
5861
- const codigoTransformado = '"' + conteudoOriginal.replace(/\{(.*?)\}/g, (_, miolo) => {
5862
- // 'miolo' é o texto que estava dentro das chaves. Ex: "valor" ou "valor:.2f"
5863
- if (miolo.includes(':')) {
5864
- const [variavel, formato] = miolo.split(':').map(s => s.trim());
5865
- if (variavel !== "") {
5866
- // Transforma {valor:.2f} em "{:.2f}".formatar(valor)
5867
- return '" + "{:' + formato + '}".formatar(' + variavel + ') + "';
6004
+ const codigoTransformado = '"' +
6005
+ conteudoOriginal.replace(/\{(.*?)\}/g, (_, miolo) => {
6006
+ // 'miolo' é o texto que estava dentro das chaves. Ex: "valor" ou "valor:.2f"
6007
+ if (miolo.includes(':')) {
6008
+ const [variavel, formato] = miolo.split(':').map((s) => s.trim());
6009
+ if (variavel !== '') {
6010
+ // Transforma {valor:.2f} em "{:.2f}".formatar(valor)
6011
+ return '" + "{:' + formato + '}".formatar(' + variavel + ') + "';
6012
+ }
5868
6013
  }
5869
- }
5870
- return '" + (' + miolo.trim() + ') + "';
5871
- }) + '"';
6014
+ return '" + (' + miolo.trim() + ') + "';
6015
+ }) +
6016
+ '"';
5872
6017
  const microLexador = new micro_lexador_pitugues_1.MicroLexadorPitugues();
5873
6018
  const retornoMicroLexador = microLexador.mapear(codigoTransformado);
5874
6019
  const microAvaliadorSintatico = new micro_avaliador_sintatico_pitugues_1.MicroAvaliadorSintaticoPitugues();
@@ -5881,7 +6026,7 @@ class AvaliadorSintaticoPitugues {
5881
6026
  }
5882
6027
  catch (erro) {
5883
6028
  this.erros.push(erro);
5884
- return new construtos_1.Literal(this.hashArquivo, simboloInterpolacao.linha, "");
6029
+ return new construtos_1.Literal(this.hashArquivo, simboloInterpolacao.linha, '');
5885
6030
  }
5886
6031
  const declaracao = retornoMicroAvaliador.declaracoes[0];
5887
6032
  return declaracao.expressao;
@@ -5939,11 +6084,11 @@ class AvaliadorSintaticoPitugues {
5939
6084
  let passo = null;
5940
6085
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)) {
5941
6086
  ehFatiamento = true;
5942
- if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS)
5943
- && !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
6087
+ if (!this.verificarTipoSimboloAtual(pitugues_2.default.DOIS_PONTOS) &&
6088
+ !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
5944
6089
  fim = await this.expressao();
5945
- if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS)
5946
- && !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
6090
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.DOIS_PONTOS) &&
6091
+ !this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO))
5947
6092
  passo = await this.expressao();
5948
6093
  }
5949
6094
  const simboloFechamento = this.consumir(pitugues_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
@@ -6075,11 +6220,13 @@ class AvaliadorSintaticoPitugues {
6075
6220
  }
6076
6221
  async seTernario() {
6077
6222
  let expressaoEntao = await this.ou();
6078
- if (this.simbolos[this.atual] && this.simbolos[this.atual].tipo === pitugues_2.default.SE && expressaoEntao.linha === this.simbolos[this.atual].linha) {
6223
+ if (this.simbolos[this.atual] &&
6224
+ this.simbolos[this.atual].tipo === pitugues_2.default.SE &&
6225
+ expressaoEntao.linha === this.simbolos[this.atual].linha) {
6079
6226
  while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
6080
6227
  const operador = this.simbolos[this.atual - 1];
6081
6228
  const expressaoOuCondicao = await this.seTernario();
6082
- this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
6229
+ this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
6083
6230
  ${this.simbolos[this.atual].lexema}.`);
6084
6231
  const expressaoSenao = await this.seTernario();
6085
6232
  expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
@@ -6224,7 +6371,8 @@ class AvaliadorSintaticoPitugues {
6224
6371
  simboloAtual = this.simboloAtual();
6225
6372
  if (!simboloAtual)
6226
6373
  break;
6227
- espacosIndentacaoLinhaAtual = this.localizacoes[simboloAtual.linha].espacosIndentacao;
6374
+ espacosIndentacaoLinhaAtual =
6375
+ this.localizacoes[simboloAtual.linha].espacosIndentacao;
6228
6376
  }
6229
6377
  }
6230
6378
  this.pilhaEscopos.removerUltimo();
@@ -6234,7 +6382,7 @@ class AvaliadorSintaticoPitugues {
6234
6382
  try {
6235
6383
  this.blocos += 1;
6236
6384
  const condicao = await this.expressao();
6237
- const bloco = await this.resolverDeclaracao();
6385
+ const bloco = (await this.resolverDeclaracao());
6238
6386
  return new declaracoes_1.Enquanto(condicao, bloco);
6239
6387
  }
6240
6388
  finally {
@@ -6308,7 +6456,7 @@ class AvaliadorSintaticoPitugues {
6308
6456
  }
6309
6457
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
6310
6458
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
6311
- const corpo = await this.resolverDeclaracao();
6459
+ const corpo = (await this.resolverDeclaracao());
6312
6460
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao), vetor, corpo);
6313
6461
  }
6314
6462
  async declaracaoPara() {
@@ -6340,7 +6488,7 @@ class AvaliadorSintaticoPitugues {
6340
6488
  this.pilhaEscopos.definirInformacoesVariavel(simboloSegundaVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloSegundaVariavel.lexema, 'qualquer'));
6341
6489
  }
6342
6490
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
6343
- const corpo = await this.resolverDeclaracao();
6491
+ const corpo = (await this.resolverDeclaracao());
6344
6492
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, alvoIteracao, corpo);
6345
6493
  }
6346
6494
  finally {
@@ -6369,7 +6517,7 @@ class AvaliadorSintaticoPitugues {
6369
6517
  }
6370
6518
  async declaracaoSe() {
6371
6519
  const condicao = await this.expressao();
6372
- const caminhoEntao = await this.resolverDeclaracao();
6520
+ const caminhoEntao = (await this.resolverDeclaracao());
6373
6521
  let caminhoSenao = null;
6374
6522
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SENAO, pitugues_2.default.SENÃO)) {
6375
6523
  caminhoSenao = await this.resolverDeclaracao();
@@ -6447,11 +6595,13 @@ class AvaliadorSintaticoPitugues {
6447
6595
  this.consumir(pitugues_2.default.DOIS_PONTOS, `Esperado ':' antes do escopo do bloco 'pegue'.`);
6448
6596
  this.pilhaEscopos.definirInformacoesVariavel(variavelExcecao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(variavelExcecao.lexema, 'qualquer'));
6449
6597
  const corpo = await this.blocoEscopo();
6450
- blocoPegue = new construtos_1.FuncaoConstruto(this.hashArquivo, simboloTente.linha, [{
6451
- abrangencia: "padrao",
6598
+ blocoPegue = new construtos_1.FuncaoConstruto(this.hashArquivo, simboloTente.linha, [
6599
+ {
6600
+ abrangencia: 'padrao',
6452
6601
  nome: variavelExcecao,
6453
- tipoDado: "qualquer",
6454
- }], corpo, "vazio", false);
6602
+ tipoDado: 'qualquer',
6603
+ },
6604
+ ], corpo, 'vazio', false);
6455
6605
  }
6456
6606
  else {
6457
6607
  // Caso 2: sem parâmetro de erro.
@@ -6476,7 +6626,7 @@ class AvaliadorSintaticoPitugues {
6476
6626
  const simboloFazer = this.simboloAnterior();
6477
6627
  try {
6478
6628
  this.blocos += 1;
6479
- const declaracaoOuBlocoFazer = await this.resolverDeclaracao();
6629
+ const declaracaoOuBlocoFazer = (await this.resolverDeclaracao());
6480
6630
  this.consumir(pitugues_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo da declaração 'fazer'.");
6481
6631
  const condicaoEnquanto = await this.expressao();
6482
6632
  return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), declaracaoOuBlocoFazer, condicaoEnquanto);
@@ -6642,7 +6792,7 @@ class AvaliadorSintaticoPitugues {
6642
6792
  const simboloAnterior = this.simbolos[this.atual - 1];
6643
6793
  if (simboloAnterior.tipo === pitugues_2.default.IDENTIFICADOR) {
6644
6794
  this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' antes do escopo da classe.");
6645
- const tipoPropriedade = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado tipo de propriedade após dois-pontos, em declaração de classe.");
6795
+ const tipoPropriedade = this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado tipo de propriedade após dois-pontos, em declaração de classe.');
6646
6796
  const propriedade = new declaracoes_1.PropriedadeClasse(simboloAnterior, tipoPropriedade.lexema, []);
6647
6797
  propriedades.push(propriedade);
6648
6798
  }
@@ -6651,7 +6801,7 @@ class AvaliadorSintaticoPitugues {
6651
6801
  }
6652
6802
  }
6653
6803
  this.superclasseAtual = undefined;
6654
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades);
6804
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos, propriedades);
6655
6805
  if (possivelDocumentacao) {
6656
6806
  definicaoClasse.documentacao = possivelDocumentacao;
6657
6807
  }
@@ -6797,8 +6947,10 @@ class AvaliadorSintaticoPitugues {
6797
6947
  case pitugues_2.default.DE: {
6798
6948
  const proximo = this.simbolos[this.atual + 1];
6799
6949
  const aposProximo = this.simbolos[this.atual + 2];
6800
- if (proximo && proximo.tipo === pitugues_2.default.IDENTIFICADOR &&
6801
- aposProximo && aposProximo.tipo === pitugues_2.default.IMPORTAR) {
6950
+ if (proximo &&
6951
+ proximo.tipo === pitugues_2.default.IDENTIFICADOR &&
6952
+ aposProximo &&
6953
+ aposProximo.tipo === pitugues_2.default.IMPORTAR) {
6802
6954
  this.avancarEDevolverAnterior();
6803
6955
  return this.declaracaoImportarDe();
6804
6956
  }
@@ -6913,7 +7065,7 @@ class AvaliadorSintaticoPitugues {
6913
7065
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('elemento', 'qualquer'),
6914
7066
  ]));
6915
7067
  this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
6916
- new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer')
7068
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
6917
7069
  ]));
6918
7070
  this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
6919
7071
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
@@ -6923,7 +7075,7 @@ class AvaliadorSintaticoPitugues {
6923
7075
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
6924
7076
  ]));
6925
7077
  this.pilhaEscopos.definirInformacoesVariavel('vetor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'vetor', true, [
6926
- new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'qualquer')
7078
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'qualquer'),
6927
7079
  ]));
6928
7080
  }
6929
7081
  async analisar(retornoLexador, hashArquivo) {
@@ -6950,7 +7102,8 @@ class AvaliadorSintaticoPitugues {
6950
7102
  else {
6951
7103
  declaracoes.push(retornoDeclaracao);
6952
7104
  }
6953
- if (!this.estaNoFinal() && this.verificarTipoSimboloAtual(pitugues_2.default.PONTO_E_VIRGULA)) {
7105
+ if (!this.estaNoFinal() &&
7106
+ this.verificarTipoSimboloAtual(pitugues_2.default.PONTO_E_VIRGULA)) {
6954
7107
  // Verificar se este ; está na mesma linha da declaração anterior
6955
7108
  const declaracaoAnterior = declaracoes[declaracoes.length - 1];
6956
7109
  const linhaDeclaraoAnterior = declaracaoAnterior.linha || 0;
@@ -7336,12 +7489,12 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7336
7489
  */
7337
7490
  construtoTextoMultilinhas() {
7338
7491
  const segundoColchete = this.consumir(prisma_1.default.COLCHETE_ESQUERDO, "Esperado '[' antes do texto multilinhas.");
7339
- let texto = "";
7492
+ let texto = '';
7340
7493
  let linha = segundoColchete.linha;
7341
7494
  while (!this.verificarSeSimboloAtualEIgualA(prisma_1.default.COLCHETE_DIREITO)) {
7342
- texto += this.simbolos[this.atual].lexema + " ";
7495
+ texto += this.simbolos[this.atual].lexema + ' ';
7343
7496
  if (this.simbolos[this.atual].linha !== linha) {
7344
- texto += "\n";
7497
+ texto += '\n';
7345
7498
  linha = this.simbolos[this.atual].linha;
7346
7499
  }
7347
7500
  this.avancarEDevolverAnterior();
@@ -7573,7 +7726,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7573
7726
  try {
7574
7727
  this.blocos += 1;
7575
7728
  const condicao = await this.expressao();
7576
- const bloco = await this.resolverDeclaracao();
7729
+ const bloco = (await this.resolverDeclaracao());
7577
7730
  return new declaracoes_1.Enquanto(condicao, bloco);
7578
7731
  }
7579
7732
  finally {
@@ -7829,7 +7982,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7829
7982
  }
7830
7983
  this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após métodos da classe.");
7831
7984
  this.superclasseAtual = undefined;
7832
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos);
7985
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos);
7833
7986
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
7834
7987
  return definicaoClasse;
7835
7988
  }
@@ -8599,7 +8752,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
8599
8752
  async declaracaoSe() {
8600
8753
  const condicao = await this.expressao();
8601
8754
  this.consumir(tenda_1.default.ENTÃO, "Esperado 'então' após a condição.");
8602
- const caminhoEntao = await this.resolverDeclaracao();
8755
+ const caminhoEntao = (await this.resolverDeclaracao());
8603
8756
  let caminhoSenao = null;
8604
8757
  if (this.verificarSeSimboloAtualEIgualA(tenda_1.default.SENÃO)) {
8605
8758
  caminhoSenao = await this.resolverDeclaracao();
@@ -9710,15 +9863,51 @@ const estruturas_1 = require("../interpretador/estruturas");
9710
9863
  const construtos_1 = require("../construtos");
9711
9864
  const quebras_1 = require("../quebras");
9712
9865
  const configTuplas = {
9713
- 'Dupla': { Classe: construtos_1.Dupla, props: ['primeiro', 'segundo'] },
9714
- 'Trio': { Classe: construtos_1.Trio, props: ['primeiro', 'segundo', 'terceiro'] },
9715
- 'Quarteto': { Classe: construtos_1.Quarteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto'] },
9716
- 'Quinteto': { Classe: construtos_1.Quinteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'] },
9717
- 'Sexteto': { Classe: construtos_1.Sexteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'] },
9718
- 'Septeto': { Classe: construtos_1.Septeto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'] },
9719
- 'Octeto': { Classe: construtos_1.Octeto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'] },
9720
- 'Noneto': { Classe: construtos_1.Noneto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo', 'nono'] },
9721
- 'Deceto': { Classe: construtos_1.Deceto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo', 'nono', 'decimo'] },
9866
+ Dupla: { Classe: construtos_1.Dupla, props: ['primeiro', 'segundo'] },
9867
+ Trio: { Classe: construtos_1.Trio, props: ['primeiro', 'segundo', 'terceiro'] },
9868
+ Quarteto: { Classe: construtos_1.Quarteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto'] },
9869
+ Quinteto: { Classe: construtos_1.Quinteto, props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'] },
9870
+ Sexteto: {
9871
+ Classe: construtos_1.Sexteto,
9872
+ props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'],
9873
+ },
9874
+ Septeto: {
9875
+ Classe: construtos_1.Septeto,
9876
+ props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'],
9877
+ },
9878
+ Octeto: {
9879
+ Classe: construtos_1.Octeto,
9880
+ props: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'],
9881
+ },
9882
+ Noneto: {
9883
+ Classe: construtos_1.Noneto,
9884
+ props: [
9885
+ 'primeiro',
9886
+ 'segundo',
9887
+ 'terceiro',
9888
+ 'quarto',
9889
+ 'quinto',
9890
+ 'sexto',
9891
+ 'setimo',
9892
+ 'oitavo',
9893
+ 'nono',
9894
+ ],
9895
+ },
9896
+ Deceto: {
9897
+ Classe: construtos_1.Deceto,
9898
+ props: [
9899
+ 'primeiro',
9900
+ 'segundo',
9901
+ 'terceiro',
9902
+ 'quarto',
9903
+ 'quinto',
9904
+ 'sexto',
9905
+ 'setimo',
9906
+ 'oitavo',
9907
+ 'nono',
9908
+ 'decimo',
9909
+ ],
9910
+ },
9722
9911
  };
9723
9912
  const mapaConstrutoresTupla = {
9724
9913
  2: construtos_1.Dupla,
@@ -9729,18 +9918,39 @@ const mapaConstrutoresTupla = {
9729
9918
  7: construtos_1.Septeto,
9730
9919
  8: construtos_1.Octeto,
9731
9920
  9: construtos_1.Noneto,
9732
- 10: construtos_1.Deceto
9921
+ 10: construtos_1.Deceto,
9733
9922
  };
9734
9923
  const mapaPropriedadesTuplas = {
9735
- 'Dupla': ['primeiro', 'segundo'],
9736
- 'Trio': ['primeiro', 'segundo', 'terceiro'],
9737
- 'Quarteto': ['primeiro', 'segundo', 'terceiro', 'quarto'],
9738
- 'Quinteto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'],
9739
- 'Sexteto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'],
9740
- 'Septeto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'],
9741
- 'Octeto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'],
9742
- 'Noneto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo', 'nono'],
9743
- 'Deceto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo', 'nono', 'decimo'],
9924
+ Dupla: ['primeiro', 'segundo'],
9925
+ Trio: ['primeiro', 'segundo', 'terceiro'],
9926
+ Quarteto: ['primeiro', 'segundo', 'terceiro', 'quarto'],
9927
+ Quinteto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'],
9928
+ Sexteto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'],
9929
+ Septeto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'],
9930
+ Octeto: ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'],
9931
+ Noneto: [
9932
+ 'primeiro',
9933
+ 'segundo',
9934
+ 'terceiro',
9935
+ 'quarto',
9936
+ 'quinto',
9937
+ 'sexto',
9938
+ 'setimo',
9939
+ 'oitavo',
9940
+ 'nono',
9941
+ ],
9942
+ Deceto: [
9943
+ 'primeiro',
9944
+ 'segundo',
9945
+ 'terceiro',
9946
+ 'quarto',
9947
+ 'quinto',
9948
+ 'sexto',
9949
+ 'setimo',
9950
+ 'oitavo',
9951
+ 'nono',
9952
+ 'decimo',
9953
+ ],
9744
9954
  };
9745
9955
  /**
9746
9956
  * Compara dois valores (números ou vetores).
@@ -9858,16 +10068,15 @@ async function arredondar(interpretador, numero, casasDecimais) {
9858
10068
  const valorNumero = interpretador.resolverValor(numero);
9859
10069
  const valorCasas = interpretador.resolverValor(casasDecimais);
9860
10070
  if (numero == undefined || numero == null) {
9861
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, "Erro: arredondar() deve receber um número.", interpretador.linhaDeclaracaoAtual));
10071
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, 'Erro: arredondar() deve receber um número.', interpretador.linhaDeclaracaoAtual));
9862
10072
  }
9863
- if (typeof numero !== "number") {
10073
+ if (typeof numero !== 'number') {
9864
10074
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `Erro de Tipo: arredondar() espera um número, mas recebeu '${typeof valorNumero}'.`, interpretador.linhaDeclaracaoAtual));
9865
10075
  }
9866
10076
  const fator = Math.pow(10, valorCasas);
9867
10077
  const resultado = Math.round(valorNumero * fator) / fator;
9868
10078
  return Promise.resolve(resultado);
9869
10079
  }
9870
- ;
9871
10080
  /**
9872
10081
  * Clona profundamente uma variável ou constante em Delégua.
9873
10082
  * @param {InterpretadorInterface} interpretador A instância do interpretador.
@@ -10256,8 +10465,10 @@ async function intervalo(interpretador, valorInicial, valorFinal, valorPasso) {
10256
10465
  }
10257
10466
  // intervalo(inicio, parada) ou intervalo(inicio, parada, passo)
10258
10467
  else {
10259
- if (typeof primeiroParam !== 'number' || isNaN(primeiroParam) ||
10260
- typeof segundoParam !== 'number' || isNaN(segundoParam)) {
10468
+ if (typeof primeiroParam !== 'number' ||
10469
+ isNaN(primeiroParam) ||
10470
+ typeof segundoParam !== 'number' ||
10471
+ isNaN(segundoParam)) {
10261
10472
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10262
10473
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
10263
10474
  linha: interpretador.linhaDeclaracaoAtual,
@@ -10640,14 +10851,18 @@ async function tamanho(interpretador, objeto) {
10640
10851
  const metodos = valorObjeto.metodos;
10641
10852
  let tamanho = 0;
10642
10853
  const metodoInicializacao = metodos.inicializacao;
10643
- if (metodoInicializacao && !Array.isArray(metodoInicializacao) && metodoInicializacao.eInicializador) {
10854
+ if (metodoInicializacao &&
10855
+ !Array.isArray(metodoInicializacao) &&
10856
+ metodoInicializacao.eInicializador) {
10644
10857
  tamanho = metodoInicializacao.declaracao.parametros.length;
10645
10858
  }
10646
10859
  else if (Array.isArray(metodoInicializacao)) {
10647
10860
  // Em caso de construtores sobrecarregados, `metodos.inicializacao` pode ser um array.
10648
10861
  // Usamos o maior número de parâmetros entre as sobrecargas que são inicializadores.
10649
10862
  for (const inicializador of metodoInicializacao) {
10650
- if (inicializador && inicializador.eInicializador && ((_a = inicializador.declaracao) === null || _a === void 0 ? void 0 : _a.parametros)) {
10863
+ if (inicializador &&
10864
+ inicializador.eInicializador &&
10865
+ ((_a = inicializador.declaracao) === null || _a === void 0 ? void 0 : _a.parametros)) {
10651
10866
  const aridade = inicializador.declaracao.parametros.length;
10652
10867
  if (aridade > tamanho) {
10653
10868
  tamanho = aridade;
@@ -10717,8 +10932,7 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
10717
10932
  }, 'Parâmetro inválido. O primeiro parâmetro deve ser um iterável.'));
10718
10933
  }
10719
10934
  const valorFuncao = interpretador.resolverValor(funcaoCondicional);
10720
- const ehFuncaoValida = valorFuncao instanceof estruturas_1.DeleguaFuncao ||
10721
- valorFuncao instanceof funcao_padrao_1.FuncaoPadrao;
10935
+ const ehFuncaoValida = valorFuncao instanceof estruturas_1.DeleguaFuncao || valorFuncao instanceof funcao_padrao_1.FuncaoPadrao;
10722
10936
  if (!ehFuncaoValida) {
10723
10937
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10724
10938
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
@@ -10743,7 +10957,7 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
10743
10957
  */
10744
10958
  async function tupla(interpretador, vetor) {
10745
10959
  const valorVetor = interpretador.resolverValor(vetor);
10746
- const elementos = valorVetor.map(item => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
10960
+ const elementos = valorVetor.map((item) => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
10747
10961
  return new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
10748
10962
  }
10749
10963
  async function vetor(interpretador, tupla) {
@@ -10762,9 +10976,10 @@ async function vetor(interpretador, tupla) {
10762
10976
  const nomeClasse = objetoTupla.constructor.name;
10763
10977
  const props = mapaPropriedadesTuplas[nomeClasse];
10764
10978
  if (props) {
10765
- resultado = props.map(prop => objetoTupla[prop]);
10979
+ resultado = props.map((prop) => objetoTupla[prop]);
10766
10980
  }
10767
- else if (objetoTupla.elementos && Array.isArray(objetoTupla.elementos)) {
10981
+ else if (objetoTupla.elementos &&
10982
+ Array.isArray(objetoTupla.elementos)) {
10768
10983
  resultado = objetoTupla.elementos;
10769
10984
  }
10770
10985
  }
@@ -10790,14 +11005,13 @@ exports.default = {
10790
11005
  if (!(objetoTupla instanceof construtos_1.TuplaN)) {
10791
11006
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `A função "paraVetor" só pode ser chamada em tuplas.`, interpretador.linhaDeclaracaoAtual));
10792
11007
  }
10793
- const valoresPuros = objetoTupla.elementos.map(elemento => interpretador.resolverValor(elemento));
11008
+ const valoresPuros = objetoTupla.elementos.map((elemento) => interpretador.resolverValor(elemento));
10794
11009
  return Promise.resolve(valoresPuros);
10795
11010
  },
10796
11011
  assinaturaFormato: 'tupla.paraVetor()',
10797
- documentacao: '# `tupla.paraVetor()` \n \n' +
10798
- 'Converte a tupla atual em um array.',
11012
+ documentacao: '# `tupla.paraVetor()` \n \n' + 'Converte a tupla atual em um array.',
10799
11013
  exemploCodigo: 'tupla.paraVetor()',
10800
- }
11014
+ },
10801
11015
  };
10802
11016
 
10803
11017
  },{"../../../construtos":62,"../../../excecoes":131}],29:[function(require,module,exports){
@@ -10879,7 +11093,7 @@ exports.default = {
10879
11093
  implementacao: (interpretador, valor) => {
10880
11094
  return Promise.resolve(Object.values(valor));
10881
11095
  },
10882
- }
11096
+ },
10883
11097
  };
10884
11098
 
10885
11099
  },{"../construtos":62,"../informacao-elemento-sintatico":138}],30:[function(require,module,exports){
@@ -11000,7 +11214,7 @@ const implementacaoParticao = (interpretador, texto, separador, ...args) => {
11000
11214
  const depois = texto.substring(indice + separador.length);
11001
11215
  partes = [antes, separador, depois];
11002
11216
  }
11003
- const elementos = partes.map(p => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, p, 'texto'));
11217
+ const elementos = partes.map((p) => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, p, 'texto'));
11004
11218
  const tupla = new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
11005
11219
  return Promise.resolve(tupla);
11006
11220
  };
@@ -11295,6 +11509,75 @@ exports.default = {
11295
11509
  '\n\n ### Formas de uso \n',
11296
11510
  exemploCodigo: 'texto.tudoMinusculo()',
11297
11511
  },
11512
+ apararInício: {
11513
+ tipoRetorno: 'texto',
11514
+ argumentos: [],
11515
+ implementacao: (interpretador, texto) => Promise.resolve(texto.trimStart()),
11516
+ assinaturaFormato: 'texto.apararInício()',
11517
+ documentacao: '# `texto.apararInício()` \n \n' +
11518
+ 'Remover espaços em branco no início e no fim de um texto.' +
11519
+ '\n\n ## Exemplo de Código\n' +
11520
+ '\n\n```delegua\nvar t = " meu texto com espaços no início e no fim "\n' +
11521
+ 'escreva("|" + t.apararInício() + "|") // "|meu texto com espaços no início e no fim |"\n```' +
11522
+ '\n\n ### Formas de uso \n',
11523
+ exemploCodigo: 'texto.apararInício()',
11524
+ },
11525
+ maiúsculo: {
11526
+ tipoRetorno: 'texto',
11527
+ argumentos: [],
11528
+ implementacao: (interpretador, texto) => Promise.resolve(texto.toUpperCase()),
11529
+ assinaturaFormato: 'texto.maiúsculo()',
11530
+ documentacao: '# `texto.maiúsculo()` \n \n' +
11531
+ 'Converte todos os caracteres alfabéticos para suas respectivas formas em maiúsculo.' +
11532
+ '\n\n ## Exemplo de Código\n' +
11533
+ '\n\n```delegua\nvar t = "tudo em minúsculo"\n' +
11534
+ 'escreva(t.maiúsculo()) // "TUDO EM MINÚSCULO"\n```' +
11535
+ '\n\n ### Formas de uso \n',
11536
+ exemploCodigo: 'texto.maiúsculo()',
11537
+ },
11538
+ minúsculo: {
11539
+ tipoRetorno: 'texto',
11540
+ argumentos: [],
11541
+ implementacao: (interpretador, texto) => Promise.resolve(texto.toLowerCase()),
11542
+ assinaturaFormato: 'texto.minúsculo()',
11543
+ documentacao: '# `texto.minúsculo()` \n \n' +
11544
+ 'Converte todos os caracteres alfabéticos para suas respectivas formas em minúsculo.' +
11545
+ '\n\n ## Exemplo de Código\n' +
11546
+ '\n\n```delegua\nvar t = "TUDO EM MAIÚSCULO"\n' +
11547
+ 'escreva(t.minúsculo()) // "tudo em maiúsculo"\n```' +
11548
+ '\n\n ### Formas de uso \n',
11549
+ exemploCodigo: 'texto.minúsculo()',
11550
+ },
11551
+ tudoMaiúsculo: {
11552
+ tipoRetorno: 'lógico',
11553
+ argumentos: [],
11554
+ implementacao: (interpretador, texto) => Promise.resolve(texto === texto.toUpperCase()),
11555
+ assinaturaFormato: 'texto.tudoMaiúsculo()',
11556
+ documentacao: '# `texto.tudoMaiúsculo()` \n\n' +
11557
+ 'Devolve verdadeiro se todos os caracteres alfabéticos do texto estão em maiúsculo, e falso em caso contrário.' +
11558
+ '\n\n ## Exemplo de Código\n' +
11559
+ '\n\n```delegua\nvar t1 = "TUDO EM MAIÚSCULO"\n' +
11560
+ 'var t2 = "Tudo em Maiúsculo"\n' +
11561
+ 't1.tudoMaiúsculo() // verdadeiro\n' +
11562
+ 't2.tudoMaiúsculo() // falso\n```' +
11563
+ '\n\n ### Formas de uso \n',
11564
+ exemploCodigo: 'texto.tudoMaiúsculo()',
11565
+ },
11566
+ tudoMinúsculo: {
11567
+ tipoRetorno: 'lógico',
11568
+ argumentos: [],
11569
+ implementacao: (interpretador, texto) => Promise.resolve(texto === texto.toLowerCase()),
11570
+ assinaturaFormato: 'texto.tudoMinúsculo()',
11571
+ documentacao: '# `texto.tudoMinúsculo()` \n\n' +
11572
+ 'Devolve verdadeiro se todos os caracteres alfabéticos do texto estão em minúsculo, e falso em caso contrário.' +
11573
+ '\n\n ## Exemplo de Código\n' +
11574
+ '\n\n```delegua\nvar t1 = "tudo em minúsculo"\n' +
11575
+ 'var t2 = "Tudo em Minúsculo"\n' +
11576
+ 't1.tudoMinúsculo() // verdadeiro\n' +
11577
+ 't2.tudoMinúsculo() // falso\n```' +
11578
+ '\n\n ### Formas de uso \n',
11579
+ exemploCodigo: 'texto.tudoMinúsculo()',
11580
+ },
11298
11581
  };
11299
11582
 
11300
11583
  },{"../construtos":62,"../excecoes":131,"../informacao-elemento-sintatico":138}],32:[function(require,module,exports){
@@ -11313,7 +11596,7 @@ const mapaConstrutoresTupla = {
11313
11596
  7: construtos_1.Septeto,
11314
11597
  8: construtos_1.Octeto,
11315
11598
  9: construtos_1.Noneto,
11316
- 10: construtos_1.Deceto
11599
+ 10: construtos_1.Deceto,
11317
11600
  };
11318
11601
  exports.default = {
11319
11602
  adicionar: {
@@ -11660,6 +11943,24 @@ exports.default = {
11660
11943
  '\n\n ### Formas de uso \n',
11661
11944
  exemploCodigo: 'vetor.removerUltimo()',
11662
11945
  },
11946
+ removerÚltimo: {
11947
+ tipoRetorno: 'qualquer',
11948
+ argumentos: [],
11949
+ implementacao: (interpretador, vetor) => {
11950
+ let elemento = vetor.pop();
11951
+ return Promise.resolve(elemento);
11952
+ },
11953
+ assinaturaFormato: 'vetor.removerÚltimo()',
11954
+ documentacao: '# `vetor.removerÚltimo()` \n \n' +
11955
+ 'Remove o último elemento do vetor caso o elemento exista no vetor.\n' +
11956
+ '\n\n ## Exemplo de Código\n' +
11957
+ '\n\n```delegua\nvar vetor = [1, 2, 3]\n' +
11958
+ 'var ultimoElemento = vetor.removerÚltimo()\n' +
11959
+ 'escreva(ultimoElemento) // 3\n' +
11960
+ 'escreva(vetor) // [1, 2]\n```' +
11961
+ '\n\n ### Formas de uso \n',
11962
+ exemploCodigo: 'vetor.removerÚltimo()',
11963
+ },
11663
11964
  somar: {
11664
11965
  tipoRetorno: 'qualquer',
11665
11966
  argumentos: [],
@@ -11926,7 +12227,7 @@ class AjudaComoConstruto {
11926
12227
  return retorno;
11927
12228
  }
11928
12229
  paraTextoSaida() {
11929
- throw new Error("Method not implemented.");
12230
+ throw new Error('Method not implemented.');
11930
12231
  }
11931
12232
  }
11932
12233
  exports.AjudaComoConstruto = AjudaComoConstruto;
@@ -12032,9 +12333,12 @@ class Atribuir {
12032
12333
  const alvoComoVariavel = alvo;
12033
12334
  const tipoAlvo = alvoComoVariavel === null || alvoComoVariavel === void 0 ? void 0 : alvoComoVariavel.tipo;
12034
12335
  const alvoSuportaIndice = alvo instanceof variavel_1.Variavel &&
12035
- (tipoAlvo === 'vetor' || tipoAlvo === 'dicionário' || tipoAlvo === 'qualquer' || (tipoAlvo === null || tipoAlvo === void 0 ? void 0 : tipoAlvo.endsWith('[]')));
12336
+ (tipoAlvo === 'vetor' ||
12337
+ tipoAlvo === 'dicionário' ||
12338
+ tipoAlvo === 'qualquer' ||
12339
+ (tipoAlvo === null || tipoAlvo === void 0 ? void 0 : tipoAlvo.endsWith('[]')));
12036
12340
  if (!alvoSuportaIndice) {
12037
- throw new Error("`indice` só pode ser informado quando o alvo for uma variável de vetor ou dicionário.");
12341
+ throw new Error('`indice` só pode ser informado quando o alvo for uma variável de vetor ou dicionário.');
12038
12342
  }
12039
12343
  this.indice = indice;
12040
12344
  }
@@ -12103,8 +12407,7 @@ class Binario {
12103
12407
  ['logico', 'lógico'].includes(this.direita.tipo)) {
12104
12408
  return 'lógico';
12105
12409
  }
12106
- if (this.esquerda.tipo === 'texto' ||
12107
- this.direita.tipo === 'texto') {
12410
+ if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
12108
12411
  return 'texto';
12109
12412
  }
12110
12413
  if (['numero', 'número'].includes(this.esquerda.tipo) ||
@@ -12270,7 +12573,9 @@ class Decorador {
12270
12573
  continue;
12271
12574
  }
12272
12575
  const valor = this.atributos[chave];
12273
- const valorTexto = valor && typeof valor === 'object' && typeof valor.paraTexto === 'function' ? valor.paraTexto() : valor;
12576
+ const valorTexto = valor && typeof valor === 'object' && typeof valor.paraTexto === 'function'
12577
+ ? valor.paraTexto()
12578
+ : valor;
12274
12579
  atributos += `${chave}=${valorTexto} `;
12275
12580
  }
12276
12581
  if (atributos.length > 0) {
@@ -12971,11 +13276,13 @@ class TuplaN extends tupla_1.Tupla {
12971
13276
  return await visitante.visitarExpressaoTuplaN(this);
12972
13277
  }
12973
13278
  paraTexto() {
12974
- const elementosTexto = this.elementos.map(elemento => elemento.paraTexto()).join(', ');
13279
+ const elementosTexto = this.elementos.map((elemento) => elemento.paraTexto()).join(', ');
12975
13280
  return `(${elementosTexto})`;
12976
13281
  }
12977
13282
  paraTextoSaida() {
12978
- const elementosTexto = this.elementos.map(elemento => elemento.paraTextoSaida()).join(', ');
13283
+ const elementosTexto = this.elementos
13284
+ .map((elemento) => elemento.paraTextoSaida())
13285
+ .join(', ');
12979
13286
  return `(${elementosTexto})`;
12980
13287
  }
12981
13288
  }
@@ -13522,10 +13829,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
13522
13829
  exports.Classe = void 0;
13523
13830
  const declaracao_1 = require("./declaracao");
13524
13831
  class Classe extends declaracao_1.Declaracao {
13525
- constructor(simbolo, superClasse, metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = []) {
13832
+ /** Compat com tradutores e analisador semântico que ainda usam .superClasse */
13833
+ get superClasse() {
13834
+ var _a;
13835
+ return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
13836
+ }
13837
+ constructor(simbolo, superClasses = [], metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = [], mesclas = []) {
13526
13838
  super(Number(simbolo.linha), simbolo.hashArquivo);
13527
13839
  this.simbolo = simbolo;
13528
- this.superClasse = superClasse;
13840
+ this.superClasses = superClasses;
13841
+ this.mesclas = mesclas;
13529
13842
  this.metodos = metodos;
13530
13843
  this.propriedades = propriedades;
13531
13844
  this.decoradores = decoradores;
@@ -13538,8 +13851,11 @@ class Classe extends declaracao_1.Declaracao {
13538
13851
  }
13539
13852
  paraTexto() {
13540
13853
  let resultado = `<classe nome=${this.simbolo.lexema} `;
13541
- if (this.superClasse) {
13542
- resultado += `herda=${this.superClasse} `;
13854
+ if (this.superClasses.length > 0) {
13855
+ resultado += `herda=${this.superClasses.map((s) => { var _a, _b; return (_b = (_a = s === null || s === void 0 ? void 0 : s.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : s; }).join(', ')} `;
13856
+ }
13857
+ if (this.mesclas.length > 0) {
13858
+ resultado += `mescla=${this.mesclas.map((m) => { var _a, _b; return (_b = (_a = m === null || m === void 0 ? void 0 : m.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : m; }).join(', ')} `;
13543
13859
  }
13544
13860
  resultado += '>';
13545
13861
  for (const propriedade of this.propriedades) {
@@ -14507,7 +14823,11 @@ class EstilizadorDelegua {
14507
14823
  * Verifica se um objeto é uma Declaração.
14508
14824
  */
14509
14825
  ehDeclaracao(obj) {
14510
- return obj && typeof obj === 'object' && 'paraTexto' in obj && 'linha' in obj && 'hashArquivo' in obj;
14826
+ return (obj &&
14827
+ typeof obj === 'object' &&
14828
+ 'paraTexto' in obj &&
14829
+ 'linha' in obj &&
14830
+ 'hashArquivo' in obj);
14511
14831
  }
14512
14832
  /**
14513
14833
  * Verifica se um objeto é um Construto.
@@ -15734,24 +16054,60 @@ class FormatadorPitugues {
15734
16054
  this.nívelIndentação -= this.tamanhoIndentação;
15735
16055
  }
15736
16056
  // Métodos obrigatórios da interface, não usados no Pituguês.
15737
- visitarDeclaracaoCabecalhoPrograma() { return Promise.resolve(); }
15738
- visitarDeclaracaoConstMultiplo() { return Promise.resolve(); }
15739
- visitarDeclaracaoEscrevaMesmaLinha() { return Promise.resolve(); }
15740
- visitarDeclaracaoInicioAlgoritmo() { return Promise.resolve(); }
15741
- visitarDeclaracaoTendoComo() { return Promise.resolve(); }
15742
- visitarDeclaracaoVarMultiplo() { return Promise.resolve(); }
15743
- visitarExpressaoAcessoElementoMatriz() { return Promise.resolve(); }
15744
- visitarExpressaoAcessoMetodo() { return Promise.resolve(); }
15745
- visitarExpressaoAcessoPropriedade() { return Promise.resolve(); }
15746
- visitarExpressaoArgumentoReferenciaFuncao() { return Promise.resolve(); }
15747
- visitarExpressaoAtribuicaoPorIndicesMatriz() { return Promise.resolve(); }
15748
- visitarExpressaoComentario() { return Promise.resolve(); }
15749
- visitarExpressaoExpressaoRegular() { return Promise.resolve(); }
15750
- visitarExpressaoFimPara() { return Promise.resolve(); }
15751
- visitarExpressaoFormatacaoEscrita() { return Promise.resolve(); }
15752
- visitarExpressaoReferenciaFuncao() { return Promise.resolve(); }
15753
- visitarExpressaoSeparador() { return Promise.resolve(); }
15754
- visitarExpressaoTupla() { return Promise.resolve(); }
16057
+ visitarDeclaracaoCabecalhoPrograma() {
16058
+ return Promise.resolve();
16059
+ }
16060
+ visitarDeclaracaoConstMultiplo() {
16061
+ return Promise.resolve();
16062
+ }
16063
+ visitarDeclaracaoEscrevaMesmaLinha() {
16064
+ return Promise.resolve();
16065
+ }
16066
+ visitarDeclaracaoInicioAlgoritmo() {
16067
+ return Promise.resolve();
16068
+ }
16069
+ visitarDeclaracaoTendoComo() {
16070
+ return Promise.resolve();
16071
+ }
16072
+ visitarDeclaracaoVarMultiplo() {
16073
+ return Promise.resolve();
16074
+ }
16075
+ visitarExpressaoAcessoElementoMatriz() {
16076
+ return Promise.resolve();
16077
+ }
16078
+ visitarExpressaoAcessoMetodo() {
16079
+ return Promise.resolve();
16080
+ }
16081
+ visitarExpressaoAcessoPropriedade() {
16082
+ return Promise.resolve();
16083
+ }
16084
+ visitarExpressaoArgumentoReferenciaFuncao() {
16085
+ return Promise.resolve();
16086
+ }
16087
+ visitarExpressaoAtribuicaoPorIndicesMatriz() {
16088
+ return Promise.resolve();
16089
+ }
16090
+ visitarExpressaoComentario() {
16091
+ return Promise.resolve();
16092
+ }
16093
+ visitarExpressaoExpressaoRegular() {
16094
+ return Promise.resolve();
16095
+ }
16096
+ visitarExpressaoFimPara() {
16097
+ return Promise.resolve();
16098
+ }
16099
+ visitarExpressaoFormatacaoEscrita() {
16100
+ return Promise.resolve();
16101
+ }
16102
+ visitarExpressaoReferenciaFuncao() {
16103
+ return Promise.resolve();
16104
+ }
16105
+ visitarExpressaoSeparador() {
16106
+ return Promise.resolve();
16107
+ }
16108
+ visitarExpressaoTupla() {
16109
+ return Promise.resolve();
16110
+ }
15755
16111
  async visitarExpressaoTuplaN(expressao) {
15756
16112
  this.códigoFormatado += '(';
15757
16113
  for (let i = 0; i < expressao.elementos.length; i++) {
@@ -15765,7 +16121,7 @@ class FormatadorPitugues {
15765
16121
  }
15766
16122
  async visitarDeclaracaoDeExpressao(declaracao) {
15767
16123
  this.códigoFormatado += this.indentar();
15768
- this.códigoFormatado += await declaracao.expressao.aceitar(this) + `\n`;
16124
+ this.códigoFormatado += (await declaracao.expressao.aceitar(this)) + `\n`;
15769
16125
  }
15770
16126
  async visitarDeclaracaoClasse(declaração) {
15771
16127
  this.adicionarLinha(`classe ${declaração.simbolo.lexema}:`);
@@ -15920,7 +16276,9 @@ class FormatadorPitugues {
15920
16276
  if (declaração.caminhoPegue) {
15921
16277
  this.adicionarLinha('pegue como erro:');
15922
16278
  this.aumentarIndentação();
15923
- const declaracoes = declaração.caminhoPegue instanceof construtos_1.FuncaoConstruto ? declaração.caminhoPegue.corpo : declaração.caminhoPegue;
16279
+ const declaracoes = declaração.caminhoPegue instanceof construtos_1.FuncaoConstruto
16280
+ ? declaração.caminhoPegue.corpo
16281
+ : declaração.caminhoPegue;
15924
16282
  for (const instrução of declaracoes) {
15925
16283
  await instrução.aceitar(this);
15926
16284
  }
@@ -15935,7 +16293,9 @@ class FormatadorPitugues {
15935
16293
  }
15936
16294
  }
15937
16295
  async visitarDeclaracaoEscreva(declaração) {
15938
- this.códigoFormatado += this.indentar() + `${declaração.simboloEscreva ? declaração.simboloEscreva.lexema : 'imprima'}(`;
16296
+ this.códigoFormatado +=
16297
+ this.indentar() +
16298
+ `${declaração.simboloEscreva ? declaração.simboloEscreva.lexema : 'imprima'}(`;
15939
16299
  for (let i = 0; i < declaração.argumentos.length; i++) {
15940
16300
  this.códigoFormatado += await declaração.argumentos[i].aceitar(this);
15941
16301
  if (i < declaração.argumentos.length - 1)
@@ -16010,8 +16370,10 @@ class FormatadorPitugues {
16010
16370
  return `(${await expressão.expressao.aceitar(this)})`;
16011
16371
  }
16012
16372
  async visitarExpressaoUnaria(expressão) {
16013
- const operador = expressão.operador.tipo === pitugues_1.default.SUBTRACAO ? '-'
16014
- : expressão.operador.tipo === pitugues_1.default.NEGACAO ? 'não '
16373
+ const operador = expressão.operador.tipo === pitugues_1.default.SUBTRACAO
16374
+ ? '-'
16375
+ : expressão.operador.tipo === pitugues_1.default.NEGACAO
16376
+ ? 'não '
16015
16377
  : '';
16016
16378
  const operando = await expressão.operando.aceitar(this);
16017
16379
  return expressão.incidenciaOperador === 'ANTES'
@@ -16020,7 +16382,7 @@ class FormatadorPitugues {
16020
16382
  }
16021
16383
  async visitarExpressaoDeChamada(expressão) {
16022
16384
  const função = await expressão.entidadeChamada.aceitar(this);
16023
- const argumentos = await Promise.all(expressão.argumentos.map(a => a.aceitar(this)));
16385
+ const argumentos = await Promise.all(expressão.argumentos.map((a) => a.aceitar(this)));
16024
16386
  return `${função}(${argumentos.join(', ')})`;
16025
16387
  }
16026
16388
  visitarExpressaoIsto() {
@@ -16030,7 +16392,7 @@ class FormatadorPitugues {
16030
16392
  return 'super()';
16031
16393
  }
16032
16394
  async visitarExpressaoVetor(expressão) {
16033
- const valores = await Promise.all(expressão.valores.map(v => v.aceitar(this)));
16395
+ const valores = await Promise.all(expressão.valores.map((v) => v.aceitar(this)));
16034
16396
  return `[${valores.join(', ')}]`;
16035
16397
  }
16036
16398
  async visitarExpressaoDicionario(expressão) {
@@ -16068,15 +16430,18 @@ class FormatadorPitugues {
16068
16430
  return `${objeto}.${expressão.nome.lexema} = ${valor}`;
16069
16431
  }
16070
16432
  async visitarExpressaoFuncaoConstruto(expressão) {
16071
- const parâmetros = expressão.parametros.map(p => {
16433
+ const parâmetros = expressão.parametros
16434
+ .map((p) => {
16072
16435
  const tipo = p.tipoDado ? `: ${p.tipoDado}` : '';
16073
16436
  return p.nome.lexema + tipo;
16074
- }).join(', ');
16437
+ })
16438
+ .join(', ');
16075
16439
  let funçãoStr = `função(${parâmetros || ''}):\n`;
16076
16440
  this.aumentarIndentação();
16077
16441
  for (const instrução of expressão.corpo) {
16078
16442
  const linha = await instrução.aceitar(this);
16079
- if (linha) { // Only add if it returns something
16443
+ if (linha) {
16444
+ // Only add if it returns something
16080
16445
  funçãoStr += this.indentar() + linha;
16081
16446
  if (!linha.endsWith('\n'))
16082
16447
  funçãoStr += '\n';
@@ -16086,7 +16451,7 @@ class FormatadorPitugues {
16086
16451
  return funçãoStr.trimEnd();
16087
16452
  }
16088
16453
  async visitarExpressaoLeia(expressão) {
16089
- const argumentos = await Promise.all(expressão.argumentos.map(a => a.aceitar(this)));
16454
+ const argumentos = await Promise.all(expressão.argumentos.map((a) => a.aceitar(this)));
16090
16455
  return argumentos.length > 0 ? `input(${argumentos.join(', ')})` : 'input()';
16091
16456
  }
16092
16457
  async visitarExpressaoTipoDe(expressão) {
@@ -16172,12 +16537,12 @@ function uuidv4() {
16172
16537
  let r = Math.random() * 16; // random number between 0 and 16
16173
16538
  if (d > 0) {
16174
16539
  // Use timestamp until depleted
16175
- r = (d + r) % 16 | 0;
16540
+ r = ((d + r) % 16) | 0;
16176
16541
  d = Math.floor(d / 16);
16177
16542
  }
16178
16543
  else {
16179
16544
  // Use microseconds since page-load if supported
16180
- r = (d2 + r) % 16 | 0;
16545
+ r = ((d2 + r) % 16) | 0;
16181
16546
  d2 = Math.floor(d2 / 16);
16182
16547
  }
16183
16548
  return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
@@ -16606,27 +16971,36 @@ const bibliotecaGlobal = __importStar(require("../bibliotecas/biblioteca-global"
16606
16971
  const construtos_1 = require("../construtos");
16607
16972
  function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
16608
16973
  pilhaEscoposExecucao.definirVariavel('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
16974
+ pilhaEscoposExecucao.definirVariavel('aleatório', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
16609
16975
  pilhaEscoposExecucao.definirVariavel('aleatorioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
16976
+ pilhaEscoposExecucao.definirVariavel('aleatórioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
16610
16977
  pilhaEscoposExecucao.definirVariavel('algum', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.algum));
16611
16978
  pilhaEscoposExecucao.definirVariavel('arredondar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.arredondar));
16612
16979
  pilhaEscoposExecucao.definirVariavel('clonar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.clonar));
16613
16980
  pilhaEscoposExecucao.definirVariavel('encontrar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrar));
16614
16981
  pilhaEscoposExecucao.definirVariavel('encontrarIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
16982
+ pilhaEscoposExecucao.definirVariavel('encontrarÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
16615
16983
  pilhaEscoposExecucao.definirVariavel('encontrarUltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
16984
+ pilhaEscoposExecucao.definirVariavel('encontrarÚltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
16616
16985
  pilhaEscoposExecucao.definirVariavel('encontrarUltimoIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
16986
+ pilhaEscoposExecucao.definirVariavel('encontrarÚltimoÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
16617
16987
  pilhaEscoposExecucao.definirVariavel('filtrarPor', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.filtrarPor));
16618
16988
  pilhaEscoposExecucao.definirVariavel('incluido', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
16989
+ pilhaEscoposExecucao.definirVariavel('incluído', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
16619
16990
  pilhaEscoposExecucao.definirVariavel('inteiro', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.inteiro));
16620
16991
  pilhaEscoposExecucao.definirVariavel('longo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.longo));
16621
16992
  pilhaEscoposExecucao.definirVariavel('intervalo', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.intervalo));
16622
16993
  pilhaEscoposExecucao.definirVariavel('mapear', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.mapear));
16623
16994
  pilhaEscoposExecucao.definirVariavel('maximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
16995
+ pilhaEscoposExecucao.definirVariavel('máximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
16624
16996
  pilhaEscoposExecucao.definirVariavel('minimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
16997
+ pilhaEscoposExecucao.definirVariavel('mínimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
16625
16998
  pilhaEscoposExecucao.definirVariavel('numero', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero));
16626
16999
  pilhaEscoposExecucao.definirVariavel('número', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero));
16627
17000
  pilhaEscoposExecucao.definirVariavel('ordenar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.ordenar));
16628
17001
  pilhaEscoposExecucao.definirVariavel('paraCada', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.paraCada));
16629
17002
  pilhaEscoposExecucao.definirVariavel('primeiroEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
17003
+ pilhaEscoposExecucao.definirVariavel('primeiroEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
16630
17004
  pilhaEscoposExecucao.definirVariavel('real', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.real));
16631
17005
  pilhaEscoposExecucao.definirVariavel('reduzir', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.reduzir));
16632
17006
  pilhaEscoposExecucao.definirVariavel('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
@@ -16634,28 +17008,29 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
16634
17008
  pilhaEscoposExecucao.definirVariavel('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
16635
17009
  pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
16636
17010
  pilhaEscoposExecucao.definirVariavel('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
17011
+ pilhaEscoposExecucao.definirVariavel('todosEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
16637
17012
  pilhaEscoposExecucao.definirVariavel('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
16638
17013
  pilhaEscoposExecucao.definirVariavel('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
16639
17014
  }
16640
17015
  function pontoEntradaAjuda(funcao, topico) {
16641
17016
  if (!funcao) {
16642
- return "Para usar a ajuda, use como uma função: ajuda(objeto).";
17017
+ return 'Para usar a ajuda, use como uma função: ajuda(objeto).';
16643
17018
  }
16644
17019
  if (!topico) {
16645
- return "Te damos as boas-vindas ao utilitário de ajuda de Delégua!\n\n" +
16646
- "Use ajuda(objeto) para obter informações sobre um objeto, função, classe ou módulo.\n" +
16647
- "Use ajuda('tópico') para obter informações sobre um tópico específico.\n\n";
17020
+ return ('Te damos as boas-vindas ao utilitário de ajuda de Delégua!\n\n' +
17021
+ 'Use ajuda(objeto) para obter informações sobre um objeto, função, classe ou módulo.\n' +
17022
+ "Use ajuda('tópico') para obter informações sobre um tópico específico.\n\n");
16648
17023
  }
16649
17024
  return obterTopicoAjuda(topico);
16650
17025
  }
16651
17026
  function obterTopicoAjuda(topico) {
16652
17027
  switch (topico.constructor) {
16653
17028
  case construtos_1.Leia:
16654
- return `A instrução 'leia' permite capturar a entrada do usuário durante a execução do programa. ` +
17029
+ return (`A instrução 'leia' permite capturar a entrada do usuário durante a execução do programa. ` +
16655
17030
  `Você pode usar 'leia()' para ler uma linha de entrada do usuário e armazená-la em uma variável. ` +
16656
17031
  `Exemplo de uso:\n\n` +
16657
17032
  `\tvar minhaVariavel = leia()\n\n` +
16658
- `Isto irá ler a entrada do usuário e atribuí-la à variável 'minhaVariavel'.`;
17033
+ `Isto irá ler a entrada do usuário e atribuí-la à variável 'minhaVariavel'.`);
16659
17034
  case funcao_padrao_1.FuncaoPadrao:
16660
17035
  return obterAjudaFuncaoPadrao(topico);
16661
17036
  case delegua_funcao_1.DeleguaFuncao:
@@ -16710,21 +17085,21 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16710
17085
  const aridade = funcaoPadrao.valorAridade;
16711
17086
  const implementacao = funcaoPadrao.funcao;
16712
17087
  // Mapeamento de funções por nome
16713
- const nomeFuncao = Object.keys(bibliotecaGlobal).find(key => bibliotecaGlobal[key] === implementacao);
17088
+ const nomeFuncao = Object.keys(bibliotecaGlobal).find((key) => bibliotecaGlobal[key] === implementacao);
16714
17089
  if (!nomeFuncao) {
16715
17090
  return 'Função não identificada. Não há documentação disponível.';
16716
17091
  }
16717
17092
  switch (nomeFuncao) {
16718
17093
  case 'aleatorio':
16719
- return `# aleatorio()\n\n` +
17094
+ return (`# aleatorio()\n\n` +
16720
17095
  `Retorna um número aleatório entre 0 e 1.\n\n` +
16721
17096
  `**Sintaxe:** aleatorio()\n\n` +
16722
17097
  `**Retorno:** Número real entre 0 (inclusivo) e 1 (exclusivo).\n\n` +
16723
17098
  `**Exemplo:**\n` +
16724
17099
  `\tvar numeroSorteado = aleatorio()\n` +
16725
- `\tescreva(numeroSorteado) // Pode retornar algo como 0.4829374657\n`;
17100
+ `\tescreva(numeroSorteado) // Pode retornar algo como 0.4829374657\n`);
16726
17101
  case 'aleatorioEntre':
16727
- return `# aleatorioEntre(minimo, maximo)\n\n` +
17102
+ return (`# aleatorioEntre(minimo, maximo)\n\n` +
16728
17103
  `Retorna um número aleatório inteiro de acordo com os parâmetros passados.\n` +
16729
17104
  `Mínimo (inclusivo) - Máximo (exclusivo).\n\n` +
16730
17105
  `**Sintaxe:** aleatorioEntre(minimo: número, maximo: número)\n\n` +
@@ -16734,9 +17109,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16734
17109
  `**Retorno:** Número inteiro entre minimo e maximo-1.\n\n` +
16735
17110
  `**Exemplo:**\n` +
16736
17111
  `\tvar dado = aleatorioEntre(1, 7)\n` +
16737
- `\tescreva(dado) // Retorna um número entre 1 e 6\n`;
17112
+ `\tescreva(dado) // Retorna um número entre 1 e 6\n`);
16738
17113
  case 'algum':
16739
- return `# algum(vetor, funcaoPesquisa)\n\n` +
17114
+ return (`# algum(vetor, funcaoPesquisa)\n\n` +
16740
17115
  `Verifica se algum dos elementos do vetor satisfaz a condição definida pela função de pesquisa.\n\n` +
16741
17116
  `**Sintaxe:** algum(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
16742
17117
  `**Parâmetros:**\n` +
@@ -16746,9 +17121,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16746
17121
  `**Exemplo:**\n` +
16747
17122
  `\tvar numeros = [1, 2, 3, 4, 5]\n` +
16748
17123
  `\tvar temPar = algum(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
16749
- `\tescreva(temPar) // verdadeiro\n`;
17124
+ `\tescreva(temPar) // verdadeiro\n`);
16750
17125
  case 'clonar':
16751
- return `# clonar(valor)\n\n` +
17126
+ return (`# clonar(valor)\n\n` +
16752
17127
  `Clona profundamente uma variável ou constante em Delégua, criando uma cópia independente.\n\n` +
16753
17128
  `**Sintaxe:** clonar(valor: qualquer)\n\n` +
16754
17129
  `**Parâmetros:**\n` +
@@ -16759,9 +17134,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16759
17134
  `\tvar copia = clonar(original)\n` +
16760
17135
  `\tcopia[2][0] = 99\n` +
16761
17136
  `\tescreva(original[2][0]) // 3 (não foi modificado)\n` +
16762
- `\tescreva(copia[2][0]) // 99\n`;
17137
+ `\tescreva(copia[2][0]) // 99\n`);
16763
17138
  case 'encontrar':
16764
- return `# encontrar(vetor, funcaoPesquisa)\n\n` +
17139
+ return (`# encontrar(vetor, funcaoPesquisa)\n\n` +
16765
17140
  `Encontra o primeiro elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
16766
17141
  `**Sintaxe:** encontrar(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
16767
17142
  `**Parâmetros:**\n` +
@@ -16771,9 +17146,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16771
17146
  `**Exemplo:**\n` +
16772
17147
  `\tvar numeros = [1, 3, 5, 8, 10]\n` +
16773
17148
  `\tvar primeiroPar = encontrar(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
16774
- `\tescreva(primeiroPar) // 8\n`;
17149
+ `\tescreva(primeiroPar) // 8\n`);
16775
17150
  case 'encontrarIndice':
16776
- return `# encontrarIndice(vetor, funcaoPesquisa)\n\n` +
17151
+ return (`# encontrarIndice(vetor, funcaoPesquisa)\n\n` +
16777
17152
  `Encontra o índice do primeiro elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
16778
17153
  `**Sintaxe:** encontrarIndice(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
16779
17154
  `**Parâmetros:**\n` +
@@ -16783,9 +17158,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16783
17158
  `**Exemplo:**\n` +
16784
17159
  `\tvar frutas = ["maçã", "banana", "laranja"]\n` +
16785
17160
  `\tvar indice = encontrarIndice(frutas, funcao(f) { retorna f == "banana" })\n` +
16786
- `\tescreva(indice) // 1\n`;
17161
+ `\tescreva(indice) // 1\n`);
16787
17162
  case 'encontrarUltimo':
16788
- return `# encontrarUltimo(vetor, funcaoPesquisa)\n\n` +
17163
+ return (`# encontrarUltimo(vetor, funcaoPesquisa)\n\n` +
16789
17164
  `Encontra o último elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
16790
17165
  `**Sintaxe:** encontrarUltimo(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
16791
17166
  `**Parâmetros:**\n` +
@@ -16795,9 +17170,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16795
17170
  `**Exemplo:**\n` +
16796
17171
  `\tvar numeros = [2, 4, 6, 7, 9]\n` +
16797
17172
  `\tvar ultimoPar = encontrarUltimo(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
16798
- `\tescreva(ultimoPar) // 6\n`;
17173
+ `\tescreva(ultimoPar) // 6\n`);
16799
17174
  case 'encontrarUltimoIndice':
16800
- return `# encontrarUltimoIndice(vetor, funcaoPesquisa)\n\n` +
17175
+ return (`# encontrarUltimoIndice(vetor, funcaoPesquisa)\n\n` +
16801
17176
  `Encontra o índice do último elemento de um vetor cuja função de pesquisa retorne verdadeiro.\n\n` +
16802
17177
  `**Sintaxe:** encontrarUltimoIndice(vetor: qualquer[], funcaoPesquisa: função)\n\n` +
16803
17178
  `**Parâmetros:**\n` +
@@ -16807,9 +17182,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16807
17182
  `**Exemplo:**\n` +
16808
17183
  `\tvar numeros = [2, 4, 6, 7, 9]\n` +
16809
17184
  `\tvar indiceUltimoPar = encontrarUltimoIndice(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
16810
- `\tescreva(indiceUltimoPar) // 2\n`;
17185
+ `\tescreva(indiceUltimoPar) // 2\n`);
16811
17186
  case 'filtrarPor':
16812
- return `# filtrarPor(vetor, funcaoFiltragem)\n\n` +
17187
+ return (`# filtrarPor(vetor, funcaoFiltragem)\n\n` +
16813
17188
  `Cria um novo vetor com todos os elementos que passam no teste implementado pela função de filtragem.\n\n` +
16814
17189
  `**Sintaxe:** filtrarPor(vetor: qualquer[], funcaoFiltragem: função)\n\n` +
16815
17190
  `**Parâmetros:**\n` +
@@ -16819,9 +17194,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16819
17194
  `**Exemplo:**\n` +
16820
17195
  `\tvar numeros = [1, 2, 3, 4, 5, 6]\n` +
16821
17196
  `\tvar pares = filtrarPor(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
16822
- `\tescreva(pares) // [2, 4, 6]\n`;
17197
+ `\tescreva(pares) // [2, 4, 6]\n`);
16823
17198
  case 'incluido':
16824
- return `# incluido(vetor, valor)\n\n` +
17199
+ return (`# incluido(vetor, valor)\n\n` +
16825
17200
  `Verifica se um valor está incluído em um vetor.\n\n` +
16826
17201
  `**Sintaxe:** incluido(vetor: qualquer[], valor: qualquer)\n\n` +
16827
17202
  `**Parâmetros:**\n` +
@@ -16831,9 +17206,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16831
17206
  `**Exemplo:**\n` +
16832
17207
  `\tvar frutas = ["maçã", "banana", "laranja"]\n` +
16833
17208
  `\tescreva(incluido(frutas, "banana")) // verdadeiro\n` +
16834
- `\tescreva(incluido(frutas, "uva")) // falso\n`;
17209
+ `\tescreva(incluido(frutas, "uva")) // falso\n`);
16835
17210
  case 'inteiro':
16836
- return `# inteiro(valor)\n\n` +
17211
+ return (`# inteiro(valor)\n\n` +
16837
17212
  `Converte um valor em um número inteiro.\n\n` +
16838
17213
  `**Sintaxe:** inteiro(valor: número | texto)\n\n` +
16839
17214
  `**Parâmetros:**\n` +
@@ -16842,9 +17217,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16842
17217
  `**Exemplo:**\n` +
16843
17218
  `\tescreva(inteiro(3.14)) // 3\n` +
16844
17219
  `\tescreva(inteiro("42")) // 42\n` +
16845
- `\tescreva(inteiro("3.99")) // 3\n`;
17220
+ `\tescreva(inteiro("3.99")) // 3\n`);
16846
17221
  case 'intervalo':
16847
- return `# intervalo(valorInicial, valorFinal)\n\n` +
17222
+ return (`# intervalo(valorInicial, valorFinal)\n\n` +
16848
17223
  `Cria um vetor com números inteiros no intervalo especificado.\n` +
16849
17224
  `O valor inicial é inclusivo e o valor final é exclusivo.\n\n` +
16850
17225
  `**Sintaxe:** intervalo(valorInicial: número, valorFinal: número)\n\n` +
@@ -16854,9 +17229,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16854
17229
  `**Retorno:** Vetor com os números no intervalo especificado.\n\n` +
16855
17230
  `**Exemplo:**\n` +
16856
17231
  `\tvar numeros = intervalo(1, 6)\n` +
16857
- `\tescreva(numeros) // [1, 2, 3, 4, 5]\n`;
17232
+ `\tescreva(numeros) // [1, 2, 3, 4, 5]\n`);
16858
17233
  case 'mapear':
16859
- return `# mapear(vetor, funcaoMapeamento)\n\n` +
17234
+ return (`# mapear(vetor, funcaoMapeamento)\n\n` +
16860
17235
  `Cria um novo vetor com os resultados da aplicação de uma função a cada elemento do vetor original.\n\n` +
16861
17236
  `**Sintaxe:** mapear(vetor: qualquer[], funcaoMapeamento: função)\n\n` +
16862
17237
  `**Parâmetros:**\n` +
@@ -16866,13 +17241,13 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16866
17241
  `**Exemplo:**\n` +
16867
17242
  `\tvar numeros = [1, 2, 3, 4]\n` +
16868
17243
  `\tvar quadrados = mapear(numeros, funcao(n) { retorna n * n })\n` +
16869
- `\tescreva(quadrados) // [1, 4, 9, 16]\n`;
17244
+ `\tescreva(quadrados) // [1, 4, 9, 16]\n`);
16870
17245
  case 'maximo':
16871
17246
  return `# maximo(vetor)\n\nRetorna o maior valor encontrado em um vetor de números.`;
16872
17247
  case 'minimo':
16873
17248
  return `# minimo(vetor)\n\nRetorna o menor valor encontrado em um vetor de números.`;
16874
17249
  case 'numero':
16875
- return `# numero(valor)\n\n` +
17250
+ return (`# numero(valor)\n\n` +
16876
17251
  `Converte um valor em um número (pode ter parte decimal).\n\n` +
16877
17252
  `**Sintaxe:** numero(valor: número | texto)\n\n` +
16878
17253
  `**Parâmetros:**\n` +
@@ -16881,9 +17256,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16881
17256
  `**Exemplo:**\n` +
16882
17257
  `\tescreva(numero("3.14")) // 3.14\n` +
16883
17258
  `\tescreva(numero("42")) // 42\n` +
16884
- `\tescreva(numero(5)) // 5\n`;
17259
+ `\tescreva(numero(5)) // 5\n`);
16885
17260
  case 'ordenar':
16886
- return `# ordenar(vetor)\n\n` +
17261
+ return (`# ordenar(vetor)\n\n` +
16887
17262
  `Ordena os elementos de um vetor em ordem crescente (números) ou alfabética (textos).\n\n` +
16888
17263
  `**Sintaxe:** ordenar(vetor: qualquer[])\n\n` +
16889
17264
  `**Parâmetros:**\n` +
@@ -16892,9 +17267,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16892
17267
  `**Exemplo:**\n` +
16893
17268
  `\tvar numeros = [5, 2, 8, 1, 9]\n` +
16894
17269
  `\tordenar(numeros)\n` +
16895
- `\tescreva(numeros) // [1, 2, 5, 8, 9]\n`;
17270
+ `\tescreva(numeros) // [1, 2, 5, 8, 9]\n`);
16896
17271
  case 'paraCada':
16897
- return `# paraCada(vetor, funcao)\n\n` +
17272
+ return (`# paraCada(vetor, funcao)\n\n` +
16898
17273
  `Executa uma função para cada elemento do vetor.\n\n` +
16899
17274
  `**Sintaxe:** paraCada(vetor: qualquer[], funcao: função)\n\n` +
16900
17275
  `**Parâmetros:**\n` +
@@ -16905,9 +17280,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16905
17280
  `\tvar nomes = ["Ana", "Bruno", "Carlos"]\n` +
16906
17281
  `\tparaCada(nomes, funcao(nome) {\n` +
16907
17282
  `\t\tescreva("Olá, " + nome)\n` +
16908
- `\t})\n`;
17283
+ `\t})\n`);
16909
17284
  case 'primeiroEmCondicao':
16910
- return `# primeiroEmCondicao(vetor, funcaoFiltragem)\n\n` +
17285
+ return (`# primeiroEmCondicao(vetor, funcaoFiltragem)\n\n` +
16911
17286
  `Retorna o primeiro elemento que satisfaz a condição especificada pela função de filtragem.\n\n` +
16912
17287
  `**Sintaxe:** primeiroEmCondicao(vetor: qualquer[], funcaoFiltragem: função)\n\n` +
16913
17288
  `**Parâmetros:**\n` +
@@ -16917,9 +17292,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16917
17292
  `**Exemplo:**\n` +
16918
17293
  `\tvar numeros = [1, 3, 5, 8, 10]\n` +
16919
17294
  `\tvar resultado = primeiroEmCondicao(numeros, funcao(n) { retorna n > 5 })\n` +
16920
- `\tescreva(resultado) // 8\n`;
17295
+ `\tescreva(resultado) // 8\n`);
16921
17296
  case 'real':
16922
- return `# real(valor)\n\n` +
17297
+ return (`# real(valor)\n\n` +
16923
17298
  `Converte um valor em um número real (ponto flutuante).\n\n` +
16924
17299
  `**Sintaxe:** real(valor: número | texto)\n\n` +
16925
17300
  `**Parâmetros:**\n` +
@@ -16927,9 +17302,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16927
17302
  `**Retorno:** Número real correspondente ao valor fornecido.\n\n` +
16928
17303
  `**Exemplo:**\n` +
16929
17304
  `\tescreva(real("3.14")) // 3.14\n` +
16930
- `\tescreva(real(42)) // 42.0\n`;
17305
+ `\tescreva(real(42)) // 42.0\n`);
16931
17306
  case 'reduzir':
16932
- return `# reduzir(vetor, funcaoReducao, valorInicial)\n\n` +
17307
+ return (`# reduzir(vetor, funcaoReducao, valorInicial)\n\n` +
16933
17308
  `Aplica uma função a um acumulador e cada elemento do vetor para reduzi-lo a um único valor.\n\n` +
16934
17309
  `**Sintaxe:** reduzir(vetor: qualquer[], funcaoReducao: função, valorInicial?: qualquer)\n\n` +
16935
17310
  `**Parâmetros:**\n` +
@@ -16940,11 +17315,11 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16940
17315
  `**Exemplo:**\n` +
16941
17316
  `\tvar numeros = [1, 2, 3, 4]\n` +
16942
17317
  `\tvar soma = reduzir(numeros, funcao(acc, n) { retorna acc + n }, 0)\n` +
16943
- `\tescreva(soma) // 10\n`;
17318
+ `\tescreva(soma) // 10\n`);
16944
17319
  case 'somar':
16945
17320
  return `# somar(vetor)\n\nRetorna a soma de todos os elementos de um vetor numérico.`;
16946
17321
  case 'tamanho':
16947
- return `# tamanho(objeto)\n\n` +
17322
+ return (`# tamanho(objeto)\n\n` +
16948
17323
  `Retorna o tamanho de um objeto (vetor, texto, função, etc.).\n\n` +
16949
17324
  `**Sintaxe:** tamanho(objeto: qualquer)\n\n` +
16950
17325
  `**Parâmetros:**\n` +
@@ -16953,9 +17328,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16953
17328
  `Para funções, retorna o número de parâmetros.\n\n` +
16954
17329
  `**Exemplo:**\n` +
16955
17330
  `\tescreva(tamanho([1, 2, 3])) // 3\n` +
16956
- `\tescreva(tamanho("Delégua")) // 7\n`;
17331
+ `\tescreva(tamanho("Delégua")) // 7\n`);
16957
17332
  case 'texto':
16958
- return `# texto(valor)\n\n` +
17333
+ return (`# texto(valor)\n\n` +
16959
17334
  `Transforma o valor ou variável em texto.\n\n` +
16960
17335
  `**Sintaxe:** texto(valor: qualquer)\n\n` +
16961
17336
  `**Parâmetros:**\n` +
@@ -16964,9 +17339,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16964
17339
  `**Exemplo:**\n` +
16965
17340
  `\tescreva(texto(42)) // "42"\n` +
16966
17341
  `\tescreva(texto(verdadeiro)) // "verdadeiro"\n` +
16967
- `\tescreva(texto([1, 2, 3])) // "[1, 2, 3]"\n`;
17342
+ `\tescreva(texto([1, 2, 3])) // "[1, 2, 3]"\n`);
16968
17343
  case 'todosEmCondicao':
16969
- return `# todosEmCondicao(vetor, funcaoCondicional)\n\n` +
17344
+ return (`# todosEmCondicao(vetor, funcaoCondicional)\n\n` +
16970
17345
  `Retorna verdadeiro se todos os elementos do vetor satisfazem a condição especificada pela função.\n\n` +
16971
17346
  `**Sintaxe:** todosEmCondicao(vetor: qualquer[], funcaoCondicional: função)\n\n` +
16972
17347
  `**Parâmetros:**\n` +
@@ -16976,9 +17351,9 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16976
17351
  `**Exemplo:**\n` +
16977
17352
  `\tvar numeros = [2, 4, 6, 8]\n` +
16978
17353
  `\tvar todosPares = todosEmCondicao(numeros, funcao(n) { retorna n % 2 == 0 })\n` +
16979
- `\tescreva(todosPares) // verdadeiro\n`;
17354
+ `\tescreva(todosPares) // verdadeiro\n`);
16980
17355
  case 'tupla':
16981
- return `# tupla(vetor)\n\n` +
17356
+ return (`# tupla(vetor)\n\n` +
16982
17357
  `Transforma um vetor de elementos em uma tupla de N elementos, sendo N a largura do vetor.\n` +
16983
17358
  `Tuplas são estruturas imutáveis de tamanho fixo.\n\n` +
16984
17359
  `**Sintaxe:** tupla(vetor: qualquer[])\n\n` +
@@ -16988,10 +17363,10 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
16988
17363
  `**Exemplo:**\n` +
16989
17364
  `\tvar coordenadas = tupla([10, 20])\n` +
16990
17365
  `\tescreva(coordenadas.primeiro) // 10\n` +
16991
- `\tescreva(coordenadas.segundo) // 20\n`;
17366
+ `\tescreva(coordenadas.segundo) // 20\n`);
16992
17367
  default:
16993
- return `Função global identificada, mas documentação específica não disponível.\n` +
16994
- `Aridade: ${aridade} parâmetro(s).`;
17368
+ return (`Função global identificada, mas documentação específica não disponível.\n` +
17369
+ `Aridade: ${aridade} parâmetro(s).`);
16995
17370
  }
16996
17371
  }
16997
17372
 
@@ -17248,7 +17623,9 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
17248
17623
  if (this.instancia !== undefined) {
17249
17624
  ambiente.valores['isto'] = {
17250
17625
  valor: this.instancia,
17251
- tipo: this.instancia instanceof objeto_delegua_classe_1.ObjetoDeleguaClasse ? 'objeto' : tipoDeDados(this.instancia),
17626
+ tipo: this.instancia instanceof objeto_delegua_classe_1.ObjetoDeleguaClasse
17627
+ ? 'objeto'
17628
+ : tipoDeDados(this.instancia),
17252
17629
  imutavel: false,
17253
17630
  };
17254
17631
  }
@@ -17331,11 +17708,11 @@ const chamavel_1 = require("./chamavel");
17331
17708
  const metodo_polimorfico_1 = require("./metodo-polimorfico");
17332
17709
  const objeto_delegua_classe_1 = require("./objeto-delegua-classe");
17333
17710
  const mapaDeNormalizacao = {
17334
- 'numero': 'número',
17335
- 'logico': 'lógico',
17336
- 'funcao': 'função',
17337
- 'dicionario': 'dicionário',
17338
- 'modulo': 'módulo',
17711
+ numero: 'número',
17712
+ logico: 'lógico',
17713
+ funcao: 'função',
17714
+ dicionario: 'dicionário',
17715
+ modulo: 'módulo',
17339
17716
  };
17340
17717
  function normalizarTipo(tipo) {
17341
17718
  if (!tipo || tipo === 'qualquer')
@@ -17362,10 +17739,28 @@ function assinaturasIguais(a, b) {
17362
17739
  * de classe é criada, a referência para a instância é implementada aqui.
17363
17740
  */
17364
17741
  class DescritorTipoClasse extends chamavel_1.Chamavel {
17365
- constructor(simboloOriginal, superClasse, metodos, propriedades) {
17742
+ /** Obtenedor de compat: primeiro pai direto (usado por tradutores e partes do interpretador). */
17743
+ get superClasse() {
17744
+ var _a;
17745
+ return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
17746
+ }
17747
+ /** Definidor de compat: atribui um único pai direto (usado pela atribuição implícita de OBJETO_BASE). */
17748
+ set superClasse(v) {
17749
+ this.superClasses = v ? [v] : [];
17750
+ }
17751
+ constructor(simboloOriginal, superClasses, metodos, propriedades) {
17366
17752
  super();
17367
17753
  this.simboloOriginal = simboloOriginal;
17368
- this.superClasse = superClasse;
17754
+ if (Array.isArray(superClasses)) {
17755
+ this.superClasses = superClasses;
17756
+ }
17757
+ else if (superClasses) {
17758
+ this.superClasses = [superClasses];
17759
+ }
17760
+ else {
17761
+ this.superClasses = [];
17762
+ }
17763
+ this.orem = [this];
17369
17764
  this.metodos = metodos || {};
17370
17765
  this.metodosEstaticos = {};
17371
17766
  this.membrosEstaticos = {};
@@ -17381,6 +17776,44 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17381
17776
  this.acessoMetodos = {};
17382
17777
  this.acessoPropriedades = {};
17383
17778
  }
17779
+ // ─── C3 OReM ──────────────────────────────────────────────────────────────
17780
+ static mesclaC3(listas) {
17781
+ const resultado = [];
17782
+ while (true) {
17783
+ const listasNaoVazias = listas.filter((l) => l.length > 0);
17784
+ if (listasNaoVazias.length === 0)
17785
+ break;
17786
+ let candidato = null;
17787
+ for (const lista of listasNaoVazias) {
17788
+ const cabeca = lista[0];
17789
+ const naCauda = listasNaoVazias.some((l) => l.slice(1).indexOf(cabeca) >= 0);
17790
+ if (!naCauda) {
17791
+ candidato = cabeca;
17792
+ break;
17793
+ }
17794
+ }
17795
+ if (candidato === null) {
17796
+ throw new excecoes_1.ErroEmTempoDeExecucao(null, 'Hierarquia de classes inconsistente: não foi possível calcular o OReM (C3).');
17797
+ }
17798
+ resultado.push(candidato);
17799
+ for (const lista of listas) {
17800
+ const idx = lista.indexOf(candidato);
17801
+ if (idx === 0)
17802
+ lista.shift();
17803
+ }
17804
+ }
17805
+ return resultado;
17806
+ }
17807
+ /** Calcula e armazena o OReM (linearização C3) para esta classe e retorna a lista resultante. */
17808
+ static computarOReM(cls) {
17809
+ if (cls.superClasses.length === 0) {
17810
+ return [cls];
17811
+ }
17812
+ const oremsDePais = cls.superClasses.map((p) => DescritorTipoClasse.computarOReM(p));
17813
+ const listas = [...oremsDePais.map((m) => [...m]), [...cls.superClasses]];
17814
+ return [cls, ...DescritorTipoClasse.mesclaC3(listas)];
17815
+ }
17816
+ // ─── Verificação abstrata ─────────────────────────────────────────────────
17384
17817
  /**
17385
17818
  * Verifica se todos os métodos abstratos da superclasse estão implementados
17386
17819
  * na subclasse fornecida. Lança erro em tempo de execução se algum faltar.
@@ -17395,13 +17828,17 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17395
17828
  }
17396
17829
  }
17397
17830
  }
17831
+ // ─── Obtenedores e definidores ────────────────────────────────────────────
17398
17832
  encontrarObtenedor(nome, estatico = false) {
17399
17833
  const mapa = estatico ? this.obtenedoresEstaticos : this.obtenedores;
17400
17834
  if (Object.prototype.hasOwnProperty.call(mapa, nome)) {
17401
17835
  return mapa[nome];
17402
17836
  }
17403
- if (this.superClasse !== null && this.superClasse !== undefined) {
17404
- return this.superClasse.encontrarObtenedor(nome, estatico);
17837
+ for (const ancestral of this.orem.slice(1)) {
17838
+ const mapaAnc = estatico ? ancestral.obtenedoresEstaticos : ancestral.obtenedores;
17839
+ if (Object.prototype.hasOwnProperty.call(mapaAnc, nome)) {
17840
+ return mapaAnc[nome];
17841
+ }
17405
17842
  }
17406
17843
  return undefined;
17407
17844
  }
@@ -17410,11 +17847,15 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17410
17847
  if (Object.prototype.hasOwnProperty.call(mapa, nome)) {
17411
17848
  return mapa[nome];
17412
17849
  }
17413
- if (this.superClasse !== null && this.superClasse !== undefined) {
17414
- return this.superClasse.encontrarDefinidor(nome, estatico);
17850
+ for (const ancestral of this.orem.slice(1)) {
17851
+ const mapaAnc = estatico ? ancestral.definidoresEstaticos : ancestral.definidores;
17852
+ if (Object.prototype.hasOwnProperty.call(mapaAnc, nome)) {
17853
+ return mapaAnc[nome];
17854
+ }
17415
17855
  }
17416
17856
  return undefined;
17417
17857
  }
17858
+ // ─── Membros estáticos ────────────────────────────────────────────────────
17418
17859
  async obterEstatico(nome, visitante) {
17419
17860
  var _a;
17420
17861
  const obtenedor = this.encontrarObtenedor(nome, true);
@@ -17443,9 +17884,10 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17443
17884
  }
17444
17885
  this.membrosEstaticos[nome] = valor;
17445
17886
  }
17887
+ // ─── Resolução de métodos via OReM ─────────────────────────────────────────
17446
17888
  /**
17447
- * Mescla sobrecargas da classe atual com as da superclasse.
17448
- * Sobrecargas da subclasse com mesma assinatura substituem as da superclasse.
17889
+ * Mescla sobrecargas da classe atual com as de ancestrais (respeitando MRO).
17890
+ * Sobrecargas da subclasse com mesma assinatura substituem as do ancestral.
17449
17891
  */
17450
17892
  mesclarComSuperclasse(metodosAtuais, metodosSuperclasse) {
17451
17893
  const resultado = [...metodosAtuais];
@@ -17458,28 +17900,20 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17458
17900
  return resultado;
17459
17901
  }
17460
17902
  obterSobrecargasDaSuperclasse(nome) {
17461
- if (!this.superClasse)
17462
- return [];
17463
- const metodoSuper = this.superClasse.metodos.hasOwnProperty(nome)
17464
- ? this.superClasse.metodos[nome]
17465
- : undefined;
17466
- let sobrecargasSuper = [];
17467
- if (metodoSuper) {
17468
- sobrecargasSuper = Array.isArray(metodoSuper) ? metodoSuper : [metodoSuper];
17469
- }
17470
- // Recursivamente mesclar com a superclasse da superclasse
17471
- const sobrecargasAncestral = this.superClasse.obterSobrecargasDaSuperclasse(nome);
17472
- if (sobrecargasAncestral.length > 0) {
17473
- const resultado = [...sobrecargasSuper];
17474
- for (const metodoAnc of sobrecargasAncestral) {
17475
- const jaSobrescrito = resultado.some((m) => assinaturasIguais(m, metodoAnc));
17476
- if (!jaSobrescrito) {
17477
- resultado.push(metodoAnc);
17903
+ let sobrecarga = [];
17904
+ // Percorre a OReM[1:] na ordem do OReM — o primeiro ancestral vence
17905
+ for (const ancestral of this.orem.slice(1)) {
17906
+ if (!ancestral.metodos.hasOwnProperty(nome))
17907
+ continue;
17908
+ const metodo = ancestral.metodos[nome];
17909
+ const novos = Array.isArray(metodo) ? metodo : [metodo];
17910
+ for (const m of novos) {
17911
+ if (!sobrecarga.some((s) => assinaturasIguais(s, m))) {
17912
+ sobrecarga.push(m);
17478
17913
  }
17479
17914
  }
17480
- sobrecargasSuper = resultado;
17481
17915
  }
17482
- return sobrecargasSuper;
17916
+ return sobrecarga;
17483
17917
  }
17484
17918
  encontrarMetodo(nome) {
17485
17919
  let metodosAtuais = [];
@@ -17510,14 +17944,17 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17510
17944
  if (nome in this.propriedades) {
17511
17945
  return this.propriedades[nome];
17512
17946
  }
17513
- if (this.superClasse !== null && this.superClasse !== undefined) {
17514
- return this.superClasse.encontrarPropriedade(nome);
17947
+ for (const ancestral of this.orem.slice(1)) {
17948
+ if (nome in ancestral.propriedades) {
17949
+ return ancestral.propriedades[nome];
17950
+ }
17515
17951
  }
17516
17952
  if (this.dialetoRequerDeclaracaoPropriedades) {
17517
17953
  throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${this.simboloOriginal.lexema}.`);
17518
17954
  }
17519
17955
  return undefined;
17520
17956
  }
17957
+ // ─── Representação textual ────────────────────────────────────────────────
17521
17958
  /**
17522
17959
  * Método utilizado por Delégua para representar esta classe quando impressa.
17523
17960
  * @returns {string} A representação da classe como texto.
@@ -17526,7 +17963,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17526
17963
  var _a, _b;
17527
17964
  const nome = (_b = (_a = this.simboloOriginal) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : 'Objeto';
17528
17965
  const nomesMetodos = Object.keys(this.metodos).join(', ');
17529
- const nomesPropriedades = this.propriedades.map(p => p.nome.lexema).join(', ');
17966
+ const nomesPropriedades = this.propriedades.map((p) => p.nome.lexema).join(', ');
17530
17967
  return `<[ ${nome} estático métodos=[${nomesMetodos}] propriedades=[${nomesPropriedades}] ]>`;
17531
17968
  }
17532
17969
  /**
@@ -17655,11 +18092,11 @@ const excecoes_1 = require("../../excecoes");
17655
18092
  const chamavel_1 = require("./chamavel");
17656
18093
  const tiposNumericos = ['inteiro', 'número', 'real', 'longo'];
17657
18094
  const mapaDeNormalizacao = {
17658
- 'numero': 'número',
17659
- 'logico': 'lógico',
17660
- 'funcao': 'função',
17661
- 'dicionario': 'dicionário',
17662
- 'modulo': 'módulo',
18095
+ numero: 'número',
18096
+ logico: 'lógico',
18097
+ funcao: 'função',
18098
+ dicionario: 'dicionário',
18099
+ modulo: 'módulo',
17663
18100
  };
17664
18101
  function normalizarTipo(tipo) {
17665
18102
  if (!tipo || tipo === 'qualquer')
@@ -17749,8 +18186,10 @@ class MetodoPolimorfico extends chamavel_1.Chamavel {
17749
18186
  ? argumentos[i].valor
17750
18187
  : argumentos[i];
17751
18188
  // Se o valor é uma VariavelInterface, extrair o valor real
17752
- if (valorArgumento && typeof valorArgumento === 'object'
17753
- && valorArgumento.hasOwnProperty('valor') && valorArgumento.hasOwnProperty('tipo')) {
18189
+ if (valorArgumento &&
18190
+ typeof valorArgumento === 'object' &&
18191
+ valorArgumento.hasOwnProperty('valor') &&
18192
+ valorArgumento.hasOwnProperty('tipo')) {
17754
18193
  valorArgumento = valorArgumento.valor;
17755
18194
  }
17756
18195
  const tipoArgumento = (0, inferenciador_1.inferirTipoVariavel)(valorArgumento);
@@ -17771,8 +18210,10 @@ class MetodoPolimorfico extends chamavel_1.Chamavel {
17771
18210
  if (!melhorSobrecarga) {
17772
18211
  const tiposArgs = argumentos.map((a) => {
17773
18212
  let val = a && a.hasOwnProperty('valor') ? a.valor : a;
17774
- if (val && typeof val === 'object'
17775
- && val.hasOwnProperty('valor') && val.hasOwnProperty('tipo')) {
18213
+ if (val &&
18214
+ typeof val === 'object' &&
18215
+ val.hasOwnProperty('valor') &&
18216
+ val.hasOwnProperty('tipo')) {
17776
18217
  val = val.valor;
17777
18218
  }
17778
18219
  return normalizarTipo((0, inferenciador_1.inferirTipoVariavel)(val));
@@ -17926,7 +18367,7 @@ function criarDescritorObjeto() {
17926
18367
  descritor.metodos['igual'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('igual', 1, (instancia, args) => {
17927
18368
  return instancia === args[0];
17928
18369
  });
17929
- descritor.metodos['eInstanciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('eInstanciaDe', 1, (instancia, args) => {
18370
+ const implementacaoEInstanciaDe = (instancia, args) => {
17930
18371
  if (!instancia)
17931
18372
  return false;
17932
18373
  const classeAlvo = args[0];
@@ -17939,8 +18380,10 @@ function criarDescritorObjeto() {
17939
18380
  cls = cls.superClasse;
17940
18381
  }
17941
18382
  return false;
17942
- });
17943
- descritor.metodos['metodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('metodos', 0, (instancia) => {
18383
+ };
18384
+ descritor.metodos['eInstanciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('eInstanciaDe', 1, implementacaoEInstanciaDe);
18385
+ descritor.metodos['éInstânciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('éInstânciaDe', 1, implementacaoEInstanciaDe);
18386
+ const implementacaoMetodos = (instancia) => {
17944
18387
  if (!instancia)
17945
18388
  return [];
17946
18389
  const nomes = [];
@@ -17953,7 +18396,9 @@ function criarDescritorObjeto() {
17953
18396
  cls = cls.superClasse;
17954
18397
  }
17955
18398
  return nomes;
17956
- });
18399
+ };
18400
+ descritor.metodos['metodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('metodos', 0, implementacaoMetodos);
18401
+ descritor.metodos['métodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('métodos', 0, implementacaoMetodos);
17957
18402
  descritor.metodos['propriedades'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('propriedades', 0, (instancia) => {
17958
18403
  if (!instancia)
17959
18404
  return [];
@@ -17980,55 +18425,73 @@ const excecoes_1 = require("../../excecoes");
17980
18425
  * Métodos são extraídos do descritor da classe, uma `DeleguaClasse`.
17981
18426
  */
17982
18427
  class ObjetoDeleguaClasse {
18428
+ valorPadraoParaTipo(tipo) {
18429
+ switch (tipo) {
18430
+ case 'numero':
18431
+ return 0;
18432
+ case 'texto':
18433
+ return '';
18434
+ case 'logico':
18435
+ return false;
18436
+ default:
18437
+ return undefined;
18438
+ }
18439
+ }
17983
18440
  constructor(classe) {
17984
18441
  this.classe = classe;
17985
18442
  this.propriedades = {};
17986
- if (this.classe.superClasse) {
17987
- for (let propriedade of this.classe.superClasse.propriedades) {
18443
+ // Inicializar propriedades herdadas do OReM (do mais genérico ao mais específico)
18444
+ // para que ancestrais mais próximos sobrescrevam os mais distantes.
18445
+ const ancestrais = classe.orem.slice(1).reverse();
18446
+ for (const ancestral of ancestrais) {
18447
+ for (const propriedade of ancestral.propriedades) {
17988
18448
  if (propriedade.estatico)
17989
18449
  continue;
17990
18450
  if (propriedade.autoObter || propriedade.autoDefinir) {
17991
- this.propriedades['_' + propriedade.nome.lexema] = undefined;
18451
+ this.propriedades['_' + propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
17992
18452
  }
17993
18453
  else {
17994
- this.propriedades[propriedade.nome.lexema] = undefined;
18454
+ this.propriedades[propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
17995
18455
  }
17996
18456
  }
17997
18457
  }
17998
- for (let propriedade of classe.propriedades) {
18458
+ // Propriedades da própria classe (têm prioridade máxima no valor padrão)
18459
+ for (const propriedade of classe.propriedades) {
17999
18460
  if (propriedade.estatico)
18000
18461
  continue;
18001
18462
  if (propriedade.autoObter || propriedade.autoDefinir) {
18002
- this.propriedades['_' + propriedade.nome.lexema] = undefined;
18463
+ this.propriedades['_' + propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
18003
18464
  }
18004
18465
  else {
18005
- this.propriedades[propriedade.nome.lexema] = undefined;
18466
+ this.propriedades[propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
18006
18467
  }
18007
18468
  }
18008
18469
  }
18009
18470
  verificarAcessoLeitura(nome, simbolo, visitante) {
18010
- var _a, _b, _c, _d, _e;
18011
- const acesso = (_b = (_a = this.classe.acessoPropriedades) === null || _a === void 0 ? void 0 : _a[nome]) !== null && _b !== void 0 ? _b : (_c = this.classe.acessoMetodos) === null || _c === void 0 ? void 0 : _c[nome];
18471
+ var _a, _b, _c, _d, _e, _f, _g;
18472
+ // Percorre o OReM para encontrar a classe que declarou o membro com um modificador de acesso.
18473
+ let declaradorClasse = undefined;
18474
+ let acesso = undefined;
18475
+ for (const cls of this.classe.orem) {
18476
+ const acessoCls = (_b = (_a = cls.acessoPropriedades) === null || _a === void 0 ? void 0 : _a[nome]) !== null && _b !== void 0 ? _b : (_c = cls.acessoMetodos) === null || _c === void 0 ? void 0 : _c[nome];
18477
+ if (acessoCls) {
18478
+ acesso = acessoCls;
18479
+ declaradorClasse = cls;
18480
+ break;
18481
+ }
18482
+ }
18012
18483
  if (!acesso || acesso === 'publico')
18013
18484
  return;
18014
18485
  const classeAtual = visitante === null || visitante === void 0 ? void 0 : visitante.classeAtualEmExecucao;
18015
18486
  if (acesso === 'privado') {
18016
- if (classeAtual !== this.classe) {
18017
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é privado e não pode ser acessado fora da classe '${(_d = this.classe.simboloOriginal) === null || _d === void 0 ? void 0 : _d.lexema}'.`);
18487
+ if (classeAtual !== declaradorClasse) {
18488
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é privado e não pode ser acessado fora da classe '${(_d = declaradorClasse.simboloOriginal) === null || _d === void 0 ? void 0 : _d.lexema}'.`);
18018
18489
  }
18019
18490
  }
18020
18491
  else if (acesso === 'protegido') {
18021
- let cls = classeAtual;
18022
- let eAcessivel = false;
18023
- while (cls) {
18024
- if (cls === this.classe) {
18025
- eAcessivel = true;
18026
- break;
18027
- }
18028
- cls = cls.superClasse;
18029
- }
18492
+ const eAcessivel = (_f = (_e = classeAtual === null || classeAtual === void 0 ? void 0 : classeAtual.orem) === null || _e === void 0 ? void 0 : _e.includes(declaradorClasse)) !== null && _f !== void 0 ? _f : false;
18030
18493
  if (!eAcessivel) {
18031
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é protegido e não pode ser acessado fora da hierarquia da classe '${(_e = this.classe.simboloOriginal) === null || _e === void 0 ? void 0 : _e.lexema}'.`);
18494
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é protegido e não pode ser acessado fora da hierarquia da classe '${(_g = declaradorClasse.simboloOriginal) === null || _g === void 0 ? void 0 : _g.lexema}'.`);
18032
18495
  }
18033
18496
  }
18034
18497
  }
@@ -18042,7 +18505,7 @@ class ObjetoDeleguaClasse {
18042
18505
  return await metodoObtenedor.chamar(visitante, []);
18043
18506
  }
18044
18507
  // Auto-property: acessa o campo de armazenamento interno '_nome'
18045
- const propAuto = this.classe.propriedades.find(p => p.nome.lexema === simbolo.lexema);
18508
+ const propAuto = this.classe.propriedades.find((p) => p.nome.lexema === simbolo.lexema);
18046
18509
  if (propAuto === null || propAuto === void 0 ? void 0 : propAuto.autoObter) {
18047
18510
  this.verificarAcessoLeitura(simbolo.lexema, simbolo, visitante);
18048
18511
  return this.propriedades['_' + simbolo.lexema];
@@ -18087,7 +18550,7 @@ class ObjetoDeleguaClasse {
18087
18550
  return;
18088
18551
  }
18089
18552
  // Auto-property: armazena no campo interno '_nome'
18090
- const propAuto = this.classe.propriedades.find(p => p.nome.lexema === simbolo.lexema);
18553
+ const propAuto = this.classe.propriedades.find((p) => p.nome.lexema === simbolo.lexema);
18091
18554
  if (propAuto === null || propAuto === void 0 ? void 0 : propAuto.autoDefinir) {
18092
18555
  this.verificarAcessoLeitura(simbolo.lexema, simbolo, visitante);
18093
18556
  this.propriedades['_' + simbolo.lexema] = valor;
@@ -18384,7 +18847,7 @@ class InterpretadorBase {
18384
18847
  }
18385
18848
  // Se é array, resolve recursivamente todos os elementos
18386
18849
  if (Array.isArray(objeto)) {
18387
- return objeto.map(elemento => this.resolverValorRecursivo(elemento));
18850
+ return objeto.map((elemento) => this.resolverValorRecursivo(elemento));
18388
18851
  }
18389
18852
  // Se é objeto plano, resolve recursivamente todas as propriedades
18390
18853
  if (objeto && objeto.constructor && objeto.constructor === Object) {
@@ -18427,8 +18890,18 @@ class InterpretadorBase {
18427
18890
  async visitarExpressaoTupla(expressao) {
18428
18891
  // Lista de propriedades válidas para tuplas (ignorar propriedades de controle)
18429
18892
  const propriedadesValidas = [
18430
- 'primeiro', 'segundo', 'terceiro', 'quarto', 'quinto',
18431
- 'sexto', 'sétimo', 'setimo', 'oitavo', 'nono', 'décimo', 'decimo'
18893
+ 'primeiro',
18894
+ 'segundo',
18895
+ 'terceiro',
18896
+ 'quarto',
18897
+ 'quinto',
18898
+ 'sexto',
18899
+ 'sétimo',
18900
+ 'setimo',
18901
+ 'oitavo',
18902
+ 'nono',
18903
+ 'décimo',
18904
+ 'decimo',
18432
18905
  ];
18433
18906
  const valores = [];
18434
18907
  for (let propriedade of propriedadesValidas) {
@@ -18445,7 +18918,7 @@ class InterpretadorBase {
18445
18918
  const res = await this.avaliar(expressao.elementos[i]);
18446
18919
  elementos.push(this.resolverValor(res));
18447
18920
  }
18448
- const elementosComoConstrutos = elementos.map(valor => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
18921
+ const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
18449
18922
  return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
18450
18923
  }
18451
18924
  async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
@@ -18787,8 +19260,12 @@ class InterpretadorBase {
18787
19260
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18788
19261
  // Auto-promove para BigInt se qualquer operando for BigInt
18789
19262
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18790
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18791
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19263
+ const esq = typeof valorEsquerdo === 'bigint'
19264
+ ? valorEsquerdo
19265
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19266
+ const dir = typeof valorDireito === 'bigint'
19267
+ ? valorDireito
19268
+ : BigInt(Math.floor(Number(valorDireito)));
18792
19269
  return esq ** dir;
18793
19270
  }
18794
19271
  const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
@@ -18816,8 +19293,12 @@ class InterpretadorBase {
18816
19293
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18817
19294
  // Auto-promove para BigInt se qualquer operando for BigInt
18818
19295
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18819
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18820
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19296
+ const esq = typeof valorEsquerdo === 'bigint'
19297
+ ? valorEsquerdo
19298
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19299
+ const dir = typeof valorDireito === 'bigint'
19300
+ ? valorDireito
19301
+ : BigInt(Math.floor(Number(valorDireito)));
18821
19302
  return esq - dir;
18822
19303
  }
18823
19304
  return Number(valorEsquerdo) - Number(valorDireito);
@@ -18829,8 +19310,12 @@ class InterpretadorBase {
18829
19310
  }
18830
19311
  // Auto-promove para BigInt se qualquer operando for BigInt
18831
19312
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18832
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18833
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19313
+ const esq = typeof valorEsquerdo === 'bigint'
19314
+ ? valorEsquerdo
19315
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19316
+ const dir = typeof valorDireito === 'bigint'
19317
+ ? valorDireito
19318
+ : BigInt(Math.floor(Number(valorDireito)));
18834
19319
  return esq + dir;
18835
19320
  }
18836
19321
  if (this.tiposNumericos.includes(tipoEsquerdo) &&
@@ -18860,8 +19345,12 @@ class InterpretadorBase {
18860
19345
  }
18861
19346
  // Retorna BigInt se qualquer operando for BigInt
18862
19347
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18863
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18864
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19348
+ const esq = typeof valorEsquerdo === 'bigint'
19349
+ ? valorEsquerdo
19350
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19351
+ const dir = typeof valorDireito === 'bigint'
19352
+ ? valorDireito
19353
+ : BigInt(Math.floor(Number(valorDireito)));
18865
19354
  return esq / dir; // Trunca automaticamente
18866
19355
  }
18867
19356
  return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
@@ -18871,8 +19360,12 @@ class InterpretadorBase {
18871
19360
  if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
18872
19361
  tipoEsquerdo !== delegua_2.default.TEXTO &&
18873
19362
  tipoDireito !== delegua_2.default.TEXTO) {
18874
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18875
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19363
+ const esq = typeof valorEsquerdo === 'bigint'
19364
+ ? valorEsquerdo
19365
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19366
+ const dir = typeof valorDireito === 'bigint'
19367
+ ? valorDireito
19368
+ : BigInt(Math.floor(Number(valorDireito)));
18876
19369
  return esq * dir;
18877
19370
  }
18878
19371
  if (tipoEsquerdo === delegua_2.default.TEXTO ||
@@ -18905,7 +19398,8 @@ class InterpretadorBase {
18905
19398
  case delegua_1.default.MODULO:
18906
19399
  case delegua_1.default.MODULO_IGUAL:
18907
19400
  // Se o operando esquerdo é uma string, usar formatação de string
18908
- if (tipoEsquerdo === delegua_2.default.TEXTO || typeof valorEsquerdo === 'string') {
19401
+ if (tipoEsquerdo === delegua_2.default.TEXTO ||
19402
+ typeof valorEsquerdo === 'string') {
18909
19403
  return this.formatarStringComOperadorPorcentagem(String(valorEsquerdo), direita, // Passar 'direita' ao invés de 'valorDireito' para preservar arrays de tuplas
18910
19404
  expressao.operador);
18911
19405
  }
@@ -18919,8 +19413,12 @@ class InterpretadorBase {
18919
19413
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18920
19414
  // Auto-promove para BigInt se qualquer operando for BigInt
18921
19415
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18922
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18923
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19416
+ const esq = typeof valorEsquerdo === 'bigint'
19417
+ ? valorEsquerdo
19418
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19419
+ const dir = typeof valorDireito === 'bigint'
19420
+ ? valorDireito
19421
+ : BigInt(Math.floor(Number(valorDireito)));
18924
19422
  return esq & dir;
18925
19423
  }
18926
19424
  return Number(valorEsquerdo) & Number(valorDireito);
@@ -18931,8 +19429,12 @@ class InterpretadorBase {
18931
19429
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18932
19430
  // Auto-promove para BigInt se qualquer operando for BigInt
18933
19431
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18934
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18935
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19432
+ const esq = typeof valorEsquerdo === 'bigint'
19433
+ ? valorEsquerdo
19434
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19435
+ const dir = typeof valorDireito === 'bigint'
19436
+ ? valorDireito
19437
+ : BigInt(Math.floor(Number(valorDireito)));
18936
19438
  return esq ^ dir;
18937
19439
  }
18938
19440
  return Number(valorEsquerdo) ^ Number(valorDireito);
@@ -18943,8 +19445,12 @@ class InterpretadorBase {
18943
19445
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18944
19446
  // Auto-promove para BigInt se qualquer operando for BigInt
18945
19447
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
18946
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18947
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19448
+ const esq = typeof valorEsquerdo === 'bigint'
19449
+ ? valorEsquerdo
19450
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19451
+ const dir = typeof valorDireito === 'bigint'
19452
+ ? valorDireito
19453
+ : BigInt(Math.floor(Number(valorDireito)));
18948
19454
  return esq | dir;
18949
19455
  }
18950
19456
  return Number(valorEsquerdo) | Number(valorDireito);
@@ -18952,9 +19458,15 @@ class InterpretadorBase {
18952
19458
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18953
19459
  // Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
18954
19460
  const tamanhoDeslocamentoEsquerda = Number(valorDireito);
18955
- if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || tamanhoDeslocamentoEsquerda >= 32) {
18956
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18957
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19461
+ if (typeof valorEsquerdo === 'bigint' ||
19462
+ typeof valorDireito === 'bigint' ||
19463
+ tamanhoDeslocamentoEsquerda >= 32) {
19464
+ const esq = typeof valorEsquerdo === 'bigint'
19465
+ ? valorEsquerdo
19466
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19467
+ const dir = typeof valorDireito === 'bigint'
19468
+ ? valorDireito
19469
+ : BigInt(Math.floor(Number(valorDireito)));
18958
19470
  return esq << dir;
18959
19471
  }
18960
19472
  return Number(valorEsquerdo) << Number(valorDireito);
@@ -18962,9 +19474,15 @@ class InterpretadorBase {
18962
19474
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
18963
19475
  // Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
18964
19476
  const tamanhoDeslocamentoDireita = Number(valorDireito);
18965
- if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || tamanhoDeslocamentoDireita >= 32) {
18966
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
18967
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19477
+ if (typeof valorEsquerdo === 'bigint' ||
19478
+ typeof valorDireito === 'bigint' ||
19479
+ tamanhoDeslocamentoDireita >= 32) {
19480
+ const esq = typeof valorEsquerdo === 'bigint'
19481
+ ? valorEsquerdo
19482
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19483
+ const dir = typeof valorDireito === 'bigint'
19484
+ ? valorDireito
19485
+ : BigInt(Math.floor(Number(valorDireito)));
18968
19486
  return esq >> dir;
18969
19487
  }
18970
19488
  return Number(valorEsquerdo) >> Number(valorDireito);
@@ -19085,7 +19603,8 @@ class InterpretadorBase {
19085
19603
  // Casos que passam aqui: chamadas a métodos de bibliotecas de Delégua.
19086
19604
  if (typeof entidadeChamada === primitivos_1.default.FUNCAO) {
19087
19605
  let objeto = null;
19088
- if (expressao.entidadeChamada.objeto) { // TODO: Qual o tipo certo aqui?
19606
+ if (expressao.entidadeChamada.objeto) {
19607
+ // TODO: Qual o tipo certo aqui?
19089
19608
  objeto = await this.avaliar(expressao.entidadeChamada.objeto);
19090
19609
  }
19091
19610
  return entidadeChamada.apply(this.resolverValor(objeto), argumentos);
@@ -19144,7 +19663,8 @@ class InterpretadorBase {
19144
19663
  }
19145
19664
  logicaContemOuEm(esquerda, direita, expressao) {
19146
19665
  const valorDireitoResolvido = this.resolverValor(direita);
19147
- if (Array.isArray(valorDireitoResolvido) || typeof valorDireitoResolvido === primitivos_1.default.TEXTO) {
19666
+ if (Array.isArray(valorDireitoResolvido) ||
19667
+ typeof valorDireitoResolvido === primitivos_1.default.TEXTO) {
19148
19668
  const avaliacao = valorDireitoResolvido.includes(esquerda);
19149
19669
  return expressao.negado ? !avaliacao : avaliacao;
19150
19670
  }
@@ -19176,13 +19696,19 @@ class InterpretadorBase {
19176
19696
  const valorDireito = this.resolverValor(direita);
19177
19697
  if (typeof valorDireito === 'number' || typeof valorDireito === 'bigint') {
19178
19698
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
19179
- const esq = typeof valorEsquerdo === 'bigint' ? valorEsquerdo : BigInt(Math.floor(Number(valorEsquerdo)));
19180
- const dir = typeof valorDireito === 'bigint' ? valorDireito : BigInt(Math.floor(Number(valorDireito)));
19181
- return expressao.operador.tipo === delegua_1.default.E ? (esq & dir) : (esq | dir);
19699
+ const esq = typeof valorEsquerdo === 'bigint'
19700
+ ? valorEsquerdo
19701
+ : BigInt(Math.floor(Number(valorEsquerdo)));
19702
+ const dir = typeof valorDireito === 'bigint'
19703
+ ? valorDireito
19704
+ : BigInt(Math.floor(Number(valorDireito)));
19705
+ return expressao.operador.tipo === delegua_1.default.E
19706
+ ? esq & dir
19707
+ : esq | dir;
19182
19708
  }
19183
19709
  return expressao.operador.tipo === delegua_1.default.E
19184
- ? (Number(valorEsquerdo) & Number(valorDireito))
19185
- : (Number(valorEsquerdo) | Number(valorDireito));
19710
+ ? Number(valorEsquerdo) & Number(valorDireito)
19711
+ : Number(valorEsquerdo) | Number(valorDireito);
19186
19712
  }
19187
19713
  // Demais casos sem diferença de tipos
19188
19714
  if (expressao.operador.tipo === delegua_1.default.OU) {
@@ -19276,7 +19802,7 @@ class InterpretadorBase {
19276
19802
  const valorComoDupla = valorVetorResolvido[declaracao.posicaoAtual];
19277
19803
  const promises = await Promise.all([
19278
19804
  this.avaliar(declaracao.variavelIteracao.primeiro),
19279
- this.avaliar(declaracao.variavelIteracao.segundo)
19805
+ this.avaliar(declaracao.variavelIteracao.segundo),
19280
19806
  ]);
19281
19807
  // TODO: O que fazer quando não forem literais?
19282
19808
  this.pilhaEscoposExecucao.definirVariavel(String(promises[0].valor), valorComoDupla.primeiro);
@@ -19456,7 +19982,9 @@ class InterpretadorBase {
19456
19982
  let formatoTexto = '';
19457
19983
  for (const argumento of argumentos) {
19458
19984
  let resultadoAvaliacao = await this.avaliar(argumento);
19459
- if (resultadoAvaliacao && resultadoAvaliacao.hasOwnProperty && resultadoAvaliacao.hasOwnProperty('valorRetornado')) {
19985
+ if (resultadoAvaliacao &&
19986
+ resultadoAvaliacao.hasOwnProperty &&
19987
+ resultadoAvaliacao.hasOwnProperty('valorRetornado')) {
19460
19988
  resultadoAvaliacao = resultadoAvaliacao.valorRetornado;
19461
19989
  }
19462
19990
  let valor = this.resolverValor(resultadoAvaliacao);
@@ -19697,12 +20225,12 @@ class InterpretadorBase {
19697
20225
  }, 'Somente listas, dicionários, classes e objetos podem ter seus valores indexados.', expressao.linha));
19698
20226
  }
19699
20227
  /**
19700
- * Método base para acesso a intervalo.
19701
- * Por padrão lança erro, pois a maioria dos dialetos (como Delégua padrão)
19702
- * ainda não suporta isso nativamente, apenas Pituguês.
19703
- */
20228
+ * Método base para acesso a intervalo.
20229
+ * Por padrão lança erro, pois a maioria dos dialetos (como Delégua padrão)
20230
+ * ainda não suporta isso nativamente, apenas Pituguês.
20231
+ */
19704
20232
  visitarExpressaoAcessoIntervaloVariavel(expressao) {
19705
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, "Acesso por intervalo não implementado para este dialeto.", expressao.linha));
20233
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Acesso por intervalo não implementado para este dialeto.', expressao.linha));
19706
20234
  }
19707
20235
  async visitarExpressaoDefinirValor(expressao) {
19708
20236
  const variavelObjeto = await this.avaliar(expressao.objeto);
@@ -19735,18 +20263,30 @@ class InterpretadorBase {
19735
20263
  * @returns Sempre retorna nulo, por ser requerido pelo contrato de visita.
19736
20264
  */
19737
20265
  async visitarDeclaracaoClasse(declaracao) {
19738
- let superClasse = null;
19739
- if (declaracao.superClasse !== null && declaracao.superClasse !== undefined) {
19740
- const variavelSuperClasse = await this.avaliar(declaracao.superClasse);
19741
- superClasse = variavelSuperClasse.valor;
20266
+ // Resolver cada superclasse listada em `herda A, B, ...`
20267
+ const superClassesResolvidas = [];
20268
+ for (const superClasseVariavel of declaracao.superClasses) {
20269
+ const variavelSuperClasse = await this.avaliar(superClasseVariavel);
20270
+ const superClasse = variavelSuperClasse.valor;
19742
20271
  if (!(superClasse instanceof estruturas_1.DescritorTipoClasse)) {
19743
- throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.superClasse.nome, 'Superclasse precisa ser uma classe.', declaracao.linha);
20272
+ throw new excecoes_1.ErroEmTempoDeExecucao(superClasseVariavel.nome, 'Superclasse precisa ser uma classe.', declaracao.linha);
20273
+ }
20274
+ superClassesResolvidas.push(superClasse);
20275
+ }
20276
+ // Resolver cada misturável listado em `mescla X, Y, ...`
20277
+ const mesclaResolvidas = [];
20278
+ for (const mesclaVariavel of declaracao.mesclas) {
20279
+ const variavelMisturavel = await this.avaliar(mesclaVariavel);
20280
+ const misturável = variavelMisturavel.valor;
20281
+ if (!(misturável instanceof estruturas_1.DescritorTipoClasse)) {
20282
+ throw new excecoes_1.ErroEmTempoDeExecucao(mesclaVariavel.nome, 'Misturável precisa ser uma classe.', declaracao.linha);
19744
20283
  }
20284
+ mesclaResolvidas.push(misturável);
19745
20285
  }
19746
20286
  // TODO: Precisamos disso?
19747
20287
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, declaracao);
19748
- if (declaracao.superClasse !== null && declaracao.superClasse !== undefined) {
19749
- this.pilhaEscoposExecucao.definirVariavel('super', superClasse);
20288
+ if (superClassesResolvidas.length > 0) {
20289
+ this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
19750
20290
  }
19751
20291
  const metodos = {};
19752
20292
  const metodosEstaticos = {};
@@ -19774,9 +20314,7 @@ class InterpretadorBase {
19774
20314
  const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
19775
20315
  funcao.documentacao = metodoAtual.documentacao;
19776
20316
  // Numa classe estática, todos os métodos (exceto construtor) são estáticos.
19777
- const ehEstatico = declaracao.classeEstatica
19778
- ? !eInicializador
19779
- : metodoAtual.estatico;
20317
+ const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
19780
20318
  if (metodoAtual.eObtenedor) {
19781
20319
  if (ehEstatico) {
19782
20320
  obtenedoresEstaticos[nomeMetodo] = funcao;
@@ -19817,7 +20355,7 @@ class InterpretadorBase {
19817
20355
  acessoPropriedades[prop.nome.lexema] = prop.acesso;
19818
20356
  }
19819
20357
  }
19820
- const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClasse, metodos, declaracao.propriedades);
20358
+ const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
19821
20359
  descritorTipoClasse.metodosEstaticos = metodosEstaticos;
19822
20360
  descritorTipoClasse.membrosEstaticos = membrosEstaticos;
19823
20361
  descritorTipoClasse.obtenedores = obtenedores;
@@ -19832,13 +20370,45 @@ class InterpretadorBase {
19832
20370
  // Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
19833
20371
  // Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
19834
20372
  // atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
19835
- if (!descritorTipoClasse.superClasse && estruturas_1.OBJETO_BASE && descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
19836
- descritorTipoClasse.superClasse = estruturas_1.OBJETO_BASE;
20373
+ if (descritorTipoClasse.superClasses.length === 0 &&
20374
+ estruturas_1.OBJETO_BASE &&
20375
+ descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
20376
+ descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
20377
+ }
20378
+ // Calcular o OReM (linearização C3) após os pais estarem definidos.
20379
+ descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
20380
+ // Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
20381
+ for (const misturável of mesclaResolvidas) {
20382
+ for (const [nome, funcao] of Object.entries(misturável.metodos)) {
20383
+ if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
20384
+ descritorTipoClasse.metodos[nome] = funcao;
20385
+ }
20386
+ }
20387
+ for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
20388
+ if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
20389
+ descritorTipoClasse.obtenedores[nome] = funcao;
20390
+ }
20391
+ }
20392
+ for (const [nome, funcao] of Object.entries(misturável.definidores)) {
20393
+ if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
20394
+ descritorTipoClasse.definidores[nome] = funcao;
20395
+ }
20396
+ }
20397
+ for (const prop of misturável.propriedades) {
20398
+ const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
20399
+ if (!jaDeclarada) {
20400
+ descritorTipoClasse.propriedades.push(prop);
20401
+ }
20402
+ }
19837
20403
  }
19838
20404
  // Verifica se a subclasse concreta implementa todos os métodos abstratos
19839
- // da superclasse abstrata.
19840
- if (!declaracao.abstrata && superClasse && superClasse.abstrata) {
19841
- superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
20405
+ // da(s) superclasse(s) abstrata(s).
20406
+ if (!declaracao.abstrata) {
20407
+ for (const superClasse of superClassesResolvidas) {
20408
+ if (superClasse.abstrata) {
20409
+ superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
20410
+ }
20411
+ }
19842
20412
  }
19843
20413
  // TODO: Até então, a única exceção a isso é Égua Clássico.
19844
20414
  // Por enquanto, tudo bem deixar isso aqui.
@@ -20065,21 +20635,25 @@ class InterpretadorBase {
20065
20635
  let valoresArray;
20066
20636
  // Verificar se é uma TuplaN (verifica instanceof OU propriedade elementos/tipo para maior compatibilidade)
20067
20637
  if (valores instanceof construtos_1.TuplaN ||
20068
- (valores && valores.tipo === 'tupla' && valores.elementos && Array.isArray(valores.elementos))) {
20638
+ (valores &&
20639
+ valores.tipo === 'tupla' &&
20640
+ valores.elementos &&
20641
+ Array.isArray(valores.elementos))) {
20069
20642
  valoresArray = valores.elementos.map((elem) => {
20070
- if (elem instanceof construtos_1.Literal || (elem && typeof elem === 'object' && elem.hasOwnProperty('valor'))) {
20643
+ if (elem instanceof construtos_1.Literal ||
20644
+ (elem && typeof elem === 'object' && elem.hasOwnProperty('valor'))) {
20071
20645
  return this.resolverValor(elem.valor);
20072
20646
  }
20073
20647
  return this.resolverValor(elem);
20074
20648
  });
20075
20649
  }
20076
20650
  else if (Array.isArray(valores)) {
20077
- valoresArray = valores.map(v => this.resolverValor(v));
20651
+ valoresArray = valores.map((v) => this.resolverValor(v));
20078
20652
  }
20079
20653
  else {
20080
20654
  const valorResolvido = this.resolverValor(valores);
20081
20655
  if (Array.isArray(valorResolvido)) {
20082
- valoresArray = valorResolvido.map(v => this.resolverValor(v));
20656
+ valoresArray = valorResolvido.map((v) => this.resolverValor(v));
20083
20657
  }
20084
20658
  else {
20085
20659
  valoresArray = [valorResolvido];
@@ -20201,7 +20775,9 @@ class InterpretadorBase {
20201
20775
  return objeto.valor.paraTexto();
20202
20776
  if (objeto instanceof construtos_1.Literal)
20203
20777
  return this.paraTexto(objeto.valor);
20204
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
20778
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
20779
+ objeto instanceof estruturas_1.DeleguaFuncao ||
20780
+ objeto instanceof estruturas_1.DescritorTipoClasse)
20205
20781
  return objeto.paraTexto();
20206
20782
  if (objeto instanceof quebras_1.RetornoQuebra) {
20207
20783
  if (typeof objeto.valor === 'boolean')
@@ -20466,10 +21042,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
20466
21042
  return objeto;
20467
21043
  }
20468
21044
  serializarSemEspacos(objeto) {
20469
- return JSON
20470
- .stringify(objeto)
20471
- .replace(/,\s+/g, ',')
20472
- .replace(/:\s+/g, ':');
21045
+ return JSON.stringify(objeto).replace(/,\s+/g, ',').replace(/:\s+/g, ':');
20473
21046
  }
20474
21047
  paraTexto(objeto) {
20475
21048
  if (objeto === null || objeto === undefined)
@@ -20484,7 +21057,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
20484
21057
  return objeto.valor.paraTexto();
20485
21058
  if (objeto instanceof construtos_1.Literal || objeto instanceof construtos_1.Tupla)
20486
21059
  return objeto.paraTextoSaida();
20487
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
21060
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
21061
+ objeto instanceof estruturas_1.DeleguaFuncao ||
21062
+ objeto instanceof estruturas_1.DescritorTipoClasse)
20488
21063
  return objeto.paraTexto();
20489
21064
  if (objeto instanceof quebras_1.RetornoQuebra) {
20490
21065
  if (typeof objeto.valor === 'boolean')
@@ -20760,11 +21335,11 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
20760
21335
  const valorComoDupla = valorVetorOuDicionarioResolvido[paraCada.posicaoAtual];
20761
21336
  const nomesVariaveis = await Promise.all([
20762
21337
  this.avaliar(paraCada.variavelIteracao.primeiro),
20763
- this.avaliar(paraCada.variavelIteracao.segundo)
21338
+ this.avaliar(paraCada.variavelIteracao.segundo),
20764
21339
  ]);
20765
21340
  const valoresDupla = await Promise.all([
20766
21341
  this.avaliar(valorComoDupla.primeiro),
20767
- this.avaliar(valorComoDupla.segundo)
21342
+ this.avaliar(valorComoDupla.segundo),
20768
21343
  ]);
20769
21344
  // nomesVariaveis são strings (nomes das variáveis)
20770
21345
  this.pilhaEscoposExecucao.definirVariavel(String(nomesVariaveis[0]), valoresDupla[0]);
@@ -21510,18 +22085,20 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
21510
22085
  // Tratamento especial para expressões unárias aplicadas a chamadas de método em literais numéricos.
21511
22086
  // Por exemplo: -5.absoluto() deve ser avaliado como (-5).absoluto(), não como -(5.absoluto())
21512
22087
  // Isso garante que o operador unário seja aplicado ao literal antes de chamar o método.
21513
- if ((expressao.operador.tipo === delegua_2.default.SUBTRACAO || expressao.operador.tipo === delegua_2.default.ADICAO) &&
22088
+ if ((expressao.operador.tipo === delegua_2.default.SUBTRACAO ||
22089
+ expressao.operador.tipo === delegua_2.default.ADICAO) &&
21514
22090
  expressao.operando instanceof construtos_1.Chamada) {
21515
22091
  const entidadeChamada = expressao.operando.entidadeChamada;
21516
22092
  // Verifica se é AcessoMetodo ou AcessoMetodoOuPropriedade
21517
- if (entidadeChamada instanceof construtos_1.AcessoMetodo || entidadeChamada instanceof construtos_1.AcessoMetodoOuPropriedade) {
22093
+ if (entidadeChamada instanceof construtos_1.AcessoMetodo ||
22094
+ entidadeChamada instanceof construtos_1.AcessoMetodoOuPropriedade) {
21518
22095
  const objetoAcesso = entidadeChamada.objeto;
21519
22096
  // Verifica se o objeto do método é um literal numérico
21520
22097
  if (objetoAcesso instanceof construtos_1.Literal && typeof objetoAcesso.valor === 'number') {
21521
22098
  // Cria um novo literal com o sinal aplicado
21522
- const novoLiteral = new construtos_1.Literal(objetoAcesso.hashArquivo, objetoAcesso.linha, expressao.operador.tipo === delegua_2.default.SUBTRACAO ?
21523
- -objetoAcesso.valor :
21524
- +objetoAcesso.valor);
22099
+ const novoLiteral = new construtos_1.Literal(objetoAcesso.hashArquivo, objetoAcesso.linha, expressao.operador.tipo === delegua_2.default.SUBTRACAO
22100
+ ? -objetoAcesso.valor
22101
+ : +objetoAcesso.valor);
21525
22102
  // Cria um novo acesso com o literal modificado
21526
22103
  let novoAcesso;
21527
22104
  if (entidadeChamada instanceof construtos_1.AcessoMetodo) {
@@ -21543,7 +22120,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
21543
22120
  async visitarExpressaoVetor(expressao) {
21544
22121
  // Delega ao interpretador base para processar o vetor
21545
22122
  const vetor = await super.visitarExpressaoVetor(expressao);
21546
- // Adiciona referência no montão (comportamento específico deste interpretador)
22123
+ // Adiciona referência no montão (comportamento específico deste interpretador)
21547
22124
  const enderecoVetorMontao = this.montao.adicionarReferencia(vetor);
21548
22125
  this.pilhaEscoposExecucao.registrarReferenciaMontao(enderecoVetorMontao);
21549
22126
  return new estruturas_1.ReferenciaMontao(enderecoVetorMontao);
@@ -22877,7 +23454,9 @@ class LexadorPitugues {
22877
23454
  }
22878
23455
  const deslocamento = ehFString ? 2 : 1;
22879
23456
  const textoCompleto = this.codigo[this.linha].substring(this.inicioSimbolo + deslocamento, this.atual);
22880
- if (textoCompleto.length === 0 && !this.eFinalDoCodigo() && this.codigo[this.linha].charAt(this.atual + 1) === delimitador) {
23457
+ if (textoCompleto.length === 0 &&
23458
+ !this.eFinalDoCodigo() &&
23459
+ this.codigo[this.linha].charAt(this.atual + 1) === delimitador) {
22881
23460
  this.avancar(); // Avança para o próximo delimitador
22882
23461
  this.analisarTextoMultilinha(delimitador);
22883
23462
  return;
@@ -23488,9 +24067,31 @@ class LexadorPrisma {
23488
24067
  }
23489
24068
  eAlfabeto(caractere) {
23490
24069
  const acentuacoes = [
23491
- 'á', 'Á', 'ã', 'Ã', 'â', 'Â', 'à', 'À',
23492
- 'é', 'É', 'ê', 'Ê', 'í', 'Í', 'ó', 'Ó',
23493
- 'õ', 'Õ', 'ô', 'Ô', 'ú', 'Ú', 'ç', 'Ç', '_',
24070
+ 'á',
24071
+ 'Á',
24072
+ 'ã',
24073
+ 'Ã',
24074
+ 'â',
24075
+ 'Â',
24076
+ 'à',
24077
+ 'À',
24078
+ 'é',
24079
+ 'É',
24080
+ 'ê',
24081
+ 'Ê',
24082
+ 'í',
24083
+ 'Í',
24084
+ 'ó',
24085
+ 'Ó',
24086
+ 'õ',
24087
+ 'Õ',
24088
+ 'ô',
24089
+ 'Ô',
24090
+ 'ú',
24091
+ 'Ú',
24092
+ 'ç',
24093
+ 'Ç',
24094
+ '_',
23494
24095
  ];
23495
24096
  return ((caractere >= 'a' && caractere <= 'z') ||
23496
24097
  (caractere >= 'A' && caractere <= 'Z') ||
@@ -26010,13 +26611,14 @@ exports.palavrasReservadasDelegua = {
26010
26611
  falso: delegua_1.default.FALSO,
26011
26612
  faca: delegua_1.default.FAZER,
26012
26613
  fazer: delegua_1.default.FAZER,
26013
- 'faça': delegua_1.default.FAZER,
26614
+ faça: delegua_1.default.FAZER,
26014
26615
  finalmente: delegua_1.default.FINALMENTE,
26015
26616
  fixo: delegua_1.default.CONSTANTE,
26016
26617
  funcao: delegua_1.default.FUNCAO,
26017
26618
  função: delegua_1.default.FUNÇÃO,
26018
26619
  herda: delegua_1.default.HERDA,
26019
26620
  implementa: delegua_1.default.IMPLEMENTA,
26621
+ mescla: delegua_1.default.MESCLA,
26020
26622
  importar: delegua_1.default.IMPORTAR,
26021
26623
  importe: delegua_1.default.IMPORTAR,
26022
26624
  interface: delegua_1.default.INTERFACE,
@@ -26055,7 +26657,7 @@ exports.palavrasReservadasDelegua = {
26055
26657
  var: delegua_1.default.VARIAVEL,
26056
26658
  variavel: delegua_1.default.VARIAVEL,
26057
26659
  variável: delegua_1.default.VARIAVEL,
26058
- verdadeiro: delegua_1.default.VERDADEIRO
26660
+ verdadeiro: delegua_1.default.VERDADEIRO,
26059
26661
  };
26060
26662
  exports.palavrasReservadasMicroGramatica = {
26061
26663
  e: delegua_1.default.E,
@@ -26318,6 +26920,7 @@ exports.default = {
26318
26920
  HERDA: 'HERDA',
26319
26921
  IDENTIFICADOR: 'IDENTIFICADOR',
26320
26922
  IMPLEMENTA: 'IMPLEMENTA',
26923
+ MESCLA: 'MESCLA',
26321
26924
  INTERFACE: 'INTERFACE',
26322
26925
  IGUAL: 'IGUAL',
26323
26926
  IGUAL_IGUAL: 'IGUAL_IGUAL',
@@ -39540,10 +40143,10 @@ class TradutorAssemblyARM {
39540
40143
  // Para android: ainda é um binário standalone, mas com rótulo Delegua_main
39541
40144
  // para deixar claro que não é o _start do CRT padrão.
39542
40145
  const entryLabel = this.alvo === 'android' ? 'Delegua_main' : '_start';
39543
- this.text = `
39544
- .text
39545
- .global ${entryLabel}
39546
-
40146
+ this.text = `
40147
+ .text
40148
+ .global ${entryLabel}
40149
+
39547
40150
  ${entryLabel}:`;
39548
40151
  }
39549
40152
  gerarDigitoAleatorio() {
@@ -39585,11 +40188,11 @@ ${entryLabel}:`;
39585
40188
  }
39586
40189
  const indice = this.dicionarioConstrutos[construto.indice.constructor.name](construto.indice);
39587
40190
  const reg = this.obterRegistrador();
39588
- this.text += `
39589
- ldr ${reg}, =${nomeVar}
39590
- ldr r0, =${indice}
39591
- lsl r0, r0, #2 @ multiply index by 4 (word size)
39592
- add ${reg}, ${reg}, r0
40191
+ this.text += `
40192
+ ldr ${reg}, =${nomeVar}
40193
+ ldr r0, =${indice}
40194
+ lsl r0, r0, #2 @ multiply index by 4 (word size)
40195
+ add ${reg}, ${reg}, r0
39593
40196
  ldr r0, [${reg}]`;
39594
40197
  this.liberarRegistrador(reg);
39595
40198
  return 'r0';
@@ -39613,12 +40216,12 @@ ${entryLabel}:`;
39613
40216
  const indice = this.dicionarioConstrutos[construto.indice.constructor.name](construto.indice);
39614
40217
  const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
39615
40218
  const reg = this.obterRegistrador();
39616
- this.text += `
39617
- ldr ${reg}, =${nomeVar}
39618
- ldr r1, =${indice}
39619
- lsl r1, r1, #2 @ multiply by 4
39620
- add ${reg}, ${reg}, r1
39621
- ldr r1, =${valor}
40219
+ this.text += `
40220
+ ldr ${reg}, =${nomeVar}
40221
+ ldr r1, =${indice}
40222
+ lsl r1, r1, #2 @ multiply by 4
40223
+ add ${reg}, ${reg}, r1
40224
+ ldr r1, =${valor}
39622
40225
  str r1, [${reg}]`;
39623
40226
  this.liberarRegistrador(reg);
39624
40227
  }
@@ -39637,9 +40240,9 @@ ${entryLabel}:`;
39637
40240
  this.bss += ` ${varLabel}: .space 4\n`;
39638
40241
  this.variaveis.set(nomeVar, varLabel);
39639
40242
  }
39640
- this.text += `
39641
- ldr r0, =${valor}
39642
- ldr r1, =${this.variaveis.get(nomeVar)}
40243
+ this.text += `
40244
+ ldr r0, =${valor}
40245
+ ldr r1, =${this.variaveis.get(nomeVar)}
39643
40246
  str r0, [r1]`;
39644
40247
  }
39645
40248
  traduzirConstrutoBinario(construto) {
@@ -39649,75 +40252,75 @@ ${entryLabel}:`;
39649
40252
  const reg = this.obterRegistrador();
39650
40253
  // Load left operand into r0
39651
40254
  if (esquerda !== 'r0') {
39652
- this.text += `
40255
+ this.text += `
39653
40256
  ldr r0, =${esquerda}`;
39654
40257
  }
39655
40258
  // Load right operand into reg
39656
- this.text += `
40259
+ this.text += `
39657
40260
  ldr ${reg}, =${direita}`;
39658
40261
  switch (operador) {
39659
40262
  case '+':
39660
- this.text += `
40263
+ this.text += `
39661
40264
  add r0, r0, ${reg}`;
39662
40265
  break;
39663
40266
  case '-':
39664
- this.text += `
40267
+ this.text += `
39665
40268
  sub r0, r0, ${reg}`;
39666
40269
  break;
39667
40270
  case '*':
39668
- this.text += `
40271
+ this.text += `
39669
40272
  mul r0, r0, ${reg}`;
39670
40273
  break;
39671
40274
  case '/':
39672
- this.text += `
40275
+ this.text += `
39673
40276
  sdiv r0, r0, ${reg}`;
39674
40277
  break;
39675
40278
  case '%':
39676
- this.text += `
39677
- sdiv r1, r0, ${reg}
39678
- mul r1, r1, ${reg}
40279
+ this.text += `
40280
+ sdiv r1, r0, ${reg}
40281
+ mul r1, r1, ${reg}
39679
40282
  sub r0, r0, r1 @ r0 = r0 - (r0/reg)*reg`;
39680
40283
  break;
39681
40284
  case '<':
39682
- this.text += `
39683
- cmp r0, ${reg}
39684
- movlt r0, #1
40285
+ this.text += `
40286
+ cmp r0, ${reg}
40287
+ movlt r0, #1
39685
40288
  movge r0, #0`;
39686
40289
  break;
39687
40290
  case '>':
39688
- this.text += `
39689
- cmp r0, ${reg}
39690
- movgt r0, #1
40291
+ this.text += `
40292
+ cmp r0, ${reg}
40293
+ movgt r0, #1
39691
40294
  movle r0, #0`;
39692
40295
  break;
39693
40296
  case '<=':
39694
- this.text += `
39695
- cmp r0, ${reg}
39696
- movle r0, #1
40297
+ this.text += `
40298
+ cmp r0, ${reg}
40299
+ movle r0, #1
39697
40300
  movgt r0, #0`;
39698
40301
  break;
39699
40302
  case '>=':
39700
- this.text += `
39701
- cmp r0, ${reg}
39702
- movge r0, #1
40303
+ this.text += `
40304
+ cmp r0, ${reg}
40305
+ movge r0, #1
39703
40306
  movlt r0, #0`;
39704
40307
  break;
39705
40308
  case '==':
39706
40309
  case '===':
39707
- this.text += `
39708
- cmp r0, ${reg}
39709
- moveq r0, #1
40310
+ this.text += `
40311
+ cmp r0, ${reg}
40312
+ moveq r0, #1
39710
40313
  movne r0, #0`;
39711
40314
  break;
39712
40315
  case '!=':
39713
40316
  case '!==':
39714
- this.text += `
39715
- cmp r0, ${reg}
39716
- movne r0, #1
40317
+ this.text += `
40318
+ cmp r0, ${reg}
40319
+ movne r0, #1
39717
40320
  moveq r0, #0`;
39718
40321
  break;
39719
40322
  default:
39720
- this.text += `
40323
+ this.text += `
39721
40324
  @ Operador ${operador} não implementado`;
39722
40325
  }
39723
40326
  this.liberarRegistrador(reg);
@@ -39735,35 +40338,35 @@ ${entryLabel}:`;
39735
40338
  if (index < registrosArgs.length) {
39736
40339
  const valorArg = this.dicionarioConstrutos[arg.constructor.name](arg);
39737
40340
  if (valorArg !== registrosArgs[index]) {
39738
- this.text += `
40341
+ this.text += `
39739
40342
  ldr ${registrosArgs[index]}, =${valorArg}`;
39740
40343
  }
39741
40344
  }
39742
40345
  else {
39743
40346
  // Push extra args on stack
39744
40347
  const valorArg = this.dicionarioConstrutos[arg.constructor.name](arg);
39745
- this.text += `
39746
- ldr r0, =${valorArg}
40348
+ this.text += `
40349
+ ldr r0, =${valorArg}
39747
40350
  push {r0}`;
39748
40351
  }
39749
40352
  });
39750
- this.text += `
40353
+ this.text += `
39751
40354
  bl ${nomeFuncao}`;
39752
40355
  }
39753
40356
  traduzirConstrutoDefinirValor(construto) {
39754
40357
  const objeto = this.dicionarioConstrutos[construto.objeto.constructor.name](construto.objeto);
39755
40358
  const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
39756
- this.text += `
39757
- ldr r0, =${valor}
39758
- ldr r1, =${objeto}
40359
+ this.text += `
40360
+ ldr r0, =${valor}
40361
+ ldr r1, =${objeto}
39759
40362
  str r0, [r1]`;
39760
40363
  }
39761
40364
  traduzirFuncaoConstruto(construto) {
39762
40365
  const labelFuncao = `func_${this.gerarDigitoAleatorio()}`;
39763
- this.text += `
39764
-
39765
- ${labelFuncao}:
39766
- push {fp, lr}
40366
+ this.text += `
40367
+
40368
+ ${labelFuncao}:
40369
+ push {fp, lr}
39767
40370
  mov fp, sp`;
39768
40371
  // Traduzir corpo da função
39769
40372
  if (construto.corpo && Array.isArray(construto.corpo)) {
@@ -39773,8 +40376,8 @@ ${labelFuncao}:
39773
40376
  }
39774
40377
  });
39775
40378
  }
39776
- this.text += `
39777
- mov sp, fp
40379
+ this.text += `
40380
+ mov sp, fp
39778
40381
  pop {fp, pc}`;
39779
40382
  }
39780
40383
  traduzirConstrutoLiteral(construto) {
@@ -39789,29 +40392,29 @@ ${labelFuncao}:
39789
40392
  const operador = construto.operador.lexema;
39790
40393
  const labelVerdadeiro = this.gerarLabel();
39791
40394
  const labelFim = this.gerarLabel();
39792
- this.text += `
39793
- ldr r0, =${esquerda}
40395
+ this.text += `
40396
+ ldr r0, =${esquerda}
39794
40397
  cmp r0, #0`;
39795
40398
  if (operador === 'e' || operador === '&&') {
39796
- this.text += `
39797
- beq ${labelFim}
39798
- ldr r0, =${direita}
39799
- cmp r0, #0
39800
- beq ${labelFim}
39801
- ${labelVerdadeiro}:
39802
- mov r0, #1
40399
+ this.text += `
40400
+ beq ${labelFim}
40401
+ ldr r0, =${direita}
40402
+ cmp r0, #0
40403
+ beq ${labelFim}
40404
+ ${labelVerdadeiro}:
40405
+ mov r0, #1
39803
40406
  ${labelFim}:`;
39804
40407
  }
39805
40408
  else if (operador === 'ou' || operador === '||') {
39806
- this.text += `
39807
- bne ${labelVerdadeiro}
39808
- ldr r0, =${direita}
39809
- cmp r0, #0
39810
- bne ${labelVerdadeiro}
39811
- mov r0, #0
39812
- b ${labelFim}
39813
- ${labelVerdadeiro}:
39814
- mov r0, #1
40409
+ this.text += `
40410
+ bne ${labelVerdadeiro}
40411
+ ldr r0, =${direita}
40412
+ cmp r0, #0
40413
+ bne ${labelVerdadeiro}
40414
+ mov r0, #0
40415
+ b ${labelFim}
40416
+ ${labelVerdadeiro}:
40417
+ mov r0, #1
39815
40418
  ${labelFim}:`;
39816
40419
  }
39817
40420
  return 'r0';
@@ -39823,16 +40426,16 @@ ${labelFim}:`;
39823
40426
  traduzirConstrutoUnario(construto) {
39824
40427
  const operando = this.dicionarioConstrutos[construto.operando.constructor.name](construto.operando);
39825
40428
  const operador = construto.operador.lexema;
39826
- this.text += `
40429
+ this.text += `
39827
40430
  ldr r0, =${operando}`;
39828
40431
  if (operador === '-') {
39829
- this.text += `
40432
+ this.text += `
39830
40433
  neg r0, r0`;
39831
40434
  }
39832
40435
  else if (operador === '!' || operador === 'nao') {
39833
- this.text += `
39834
- cmp r0, #0
39835
- moveq r0, #1
40436
+ this.text += `
40437
+ cmp r0, #0
40438
+ moveq r0, #1
39836
40439
  movne r0, #0`;
39837
40440
  }
39838
40441
  return 'r0';
@@ -39842,8 +40445,8 @@ ${labelFim}:`;
39842
40445
  const nomeVar = (_a = construto.simbolo) === null || _a === void 0 ? void 0 : _a.lexema;
39843
40446
  if (nomeVar && this.variaveis.has(nomeVar)) {
39844
40447
  const varLabel = this.variaveis.get(nomeVar);
39845
- this.text += `
39846
- ldr r0, =${varLabel}
40448
+ this.text += `
40449
+ ldr r0, =${varLabel}
39847
40450
  ldr r0, [r0]`;
39848
40451
  return 'r0';
39849
40452
  }
@@ -39858,9 +40461,9 @@ ${labelFim}:`;
39858
40461
  construto.valores.forEach((valor, index) => {
39859
40462
  if (this.dicionarioConstrutos[valor.constructor.name]) {
39860
40463
  const valorTraduzido = this.dicionarioConstrutos[valor.constructor.name](valor);
39861
- this.text += `
39862
- ldr r0, =${valorTraduzido}
39863
- ldr r1, =${labelVetor}
40464
+ this.text += `
40465
+ ldr r0, =${valorTraduzido}
40466
+ ldr r1, =${labelVetor}
39864
40467
  str r0, [r1, #${index * 4}]`;
39865
40468
  }
39866
40469
  });
@@ -39880,17 +40483,17 @@ ${labelFim}:`;
39880
40483
  traduzirDeclaracaoEnquanto(declaracao) {
39881
40484
  const labelInicio = this.gerarLabel();
39882
40485
  const labelFim = this.gerarLabel();
39883
- this.text += `
40486
+ this.text += `
39884
40487
  ${labelInicio}:`;
39885
40488
  const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
39886
- this.text += `
39887
- cmp ${condicao}, #0
40489
+ this.text += `
40490
+ cmp ${condicao}, #0
39888
40491
  beq ${labelFim}`;
39889
40492
  if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
39890
40493
  this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
39891
40494
  }
39892
- this.text += `
39893
- b ${labelInicio}
40495
+ this.text += `
40496
+ b ${labelInicio}
39894
40497
  ${labelFim}:`;
39895
40498
  }
39896
40499
  traduzirDeclaracaoEscolha(declaracao) {
@@ -39901,10 +40504,10 @@ ${labelFim}:`;
39901
40504
  const labelProximo = this.gerarLabel();
39902
40505
  if (caminho.condicoes && caminho.condicoes[0]) {
39903
40506
  const valorCaso = this.dicionarioConstrutos[caminho.condicoes[0].constructor.name](caminho.condicoes[0]);
39904
- this.text += `
39905
- ldr r0, =${valorEscolha}
39906
- ldr r1, =${valorCaso}
39907
- cmp r0, r1
40507
+ this.text += `
40508
+ ldr r0, =${valorEscolha}
40509
+ ldr r1, =${valorCaso}
40510
+ cmp r0, r1
39908
40511
  bne ${labelProximo}`;
39909
40512
  if (caminho.declaracoes && Array.isArray(caminho.declaracoes)) {
39910
40513
  caminho.declaracoes.forEach((decl) => {
@@ -39913,23 +40516,24 @@ ${labelFim}:`;
39913
40516
  }
39914
40517
  });
39915
40518
  }
39916
- this.text += `
39917
- b ${labelFim}
40519
+ this.text += `
40520
+ b ${labelFim}
39918
40521
  ${labelProximo}:`;
39919
40522
  }
39920
40523
  });
39921
40524
  }
39922
- this.text += `
40525
+ this.text += `
39923
40526
  ${labelFim}:`;
39924
40527
  }
39925
40528
  traduzirDeclaracaoExpressao(declaracao) {
39926
- if (declaracao.expressao && this.dicionarioConstrutos[declaracao.expressao.constructor.name]) {
40529
+ if (declaracao.expressao &&
40530
+ this.dicionarioConstrutos[declaracao.expressao.constructor.name]) {
39927
40531
  this.dicionarioConstrutos[declaracao.expressao.constructor.name](declaracao.expressao);
39928
40532
  }
39929
40533
  }
39930
40534
  traduzirDeclaracaoFazer(declaracao) {
39931
40535
  const labelInicio = this.gerarLabel();
39932
- this.text += `
40536
+ this.text += `
39933
40537
  ${labelInicio}:`;
39934
40538
  if (declaracao.caminhoFazer && declaracao.caminhoFazer.declaracoes) {
39935
40539
  declaracao.caminhoFazer.declaracoes.forEach((decl) => {
@@ -39940,52 +40544,58 @@ ${labelInicio}:`;
39940
40544
  }
39941
40545
  if (declaracao.condicaoEnquanto) {
39942
40546
  const condicao = this.dicionarioConstrutos[declaracao.condicaoEnquanto.constructor.name](declaracao.condicaoEnquanto);
39943
- this.text += `
39944
- cmp ${condicao}, #0
40547
+ this.text += `
40548
+ cmp ${condicao}, #0
39945
40549
  bne ${labelInicio}`;
39946
40550
  }
39947
40551
  }
39948
40552
  traduzirDeclaracaoFalhar(declaracao) {
39949
40553
  let mensagem = '"Erro"';
39950
- if (declaracao.explicacao && typeof declaracao.explicacao === 'object' && 'constructor' in declaracao.explicacao) {
40554
+ if (declaracao.explicacao &&
40555
+ typeof declaracao.explicacao === 'object' &&
40556
+ 'constructor' in declaracao.explicacao) {
39951
40557
  const explicacao = declaracao.explicacao;
39952
40558
  if (explicacao.constructor && this.dicionarioConstrutos[explicacao.constructor.name]) {
39953
40559
  mensagem = this.dicionarioConstrutos[explicacao.constructor.name](explicacao);
39954
40560
  }
39955
40561
  }
39956
- this.text += `
39957
- @ Falhar com mensagem: ${mensagem}
39958
- mov r0, #1
39959
- mov r7, #1 @ sys_exit
40562
+ this.text += `
40563
+ @ Falhar com mensagem: ${mensagem}
40564
+ mov r0, #1
40565
+ mov r7, #1 @ sys_exit
39960
40566
  swi 0`;
39961
40567
  }
39962
40568
  traduzirDeclaracaoFuncao(declaracao) {
39963
40569
  var _a;
39964
40570
  const nomeFuncao = ((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'funcao';
39965
- this.text += `
39966
-
39967
- ${nomeFuncao}:
39968
- push {fp, lr}
40571
+ this.text += `
40572
+
40573
+ ${nomeFuncao}:
40574
+ push {fp, lr}
39969
40575
  mov fp, sp`;
39970
- if (declaracao.funcao && declaracao.funcao.corpo && Array.isArray(declaracao.funcao.corpo)) {
40576
+ if (declaracao.funcao &&
40577
+ declaracao.funcao.corpo &&
40578
+ Array.isArray(declaracao.funcao.corpo)) {
39971
40579
  declaracao.funcao.corpo.forEach((decl) => {
39972
40580
  if (this.dicionarioDeclaracoes[decl.constructor.name]) {
39973
40581
  this.dicionarioDeclaracoes[decl.constructor.name](decl);
39974
40582
  }
39975
40583
  });
39976
40584
  }
39977
- this.text += `
39978
- mov sp, fp
40585
+ this.text += `
40586
+ mov sp, fp
39979
40587
  pop {fp, pc}`;
39980
40588
  }
39981
40589
  traduzirDeclaracaoImportar(declaracao) {
39982
- this.text += `
40590
+ this.text += `
39983
40591
  @ Importar: ${declaracao.caminho || 'unknown'}`;
39984
40592
  }
39985
40593
  traduzirDeclaracaoLeia(declaracao) {
39986
40594
  var _a;
39987
40595
  let nomeVar;
39988
- if (declaracao.argumentos && declaracao.argumentos[0] && declaracao.argumentos[0] instanceof construtos_1.Variavel) {
40596
+ if (declaracao.argumentos &&
40597
+ declaracao.argumentos[0] &&
40598
+ declaracao.argumentos[0] instanceof construtos_1.Variavel) {
39989
40599
  nomeVar = (_a = declaracao.argumentos[0].simbolo) === null || _a === void 0 ? void 0 : _a.lexema;
39990
40600
  }
39991
40601
  if (!nomeVar)
@@ -39995,11 +40605,11 @@ ${nomeFuncao}:
39995
40605
  this.bss += ` ${varLabel}: .space 256\n`;
39996
40606
  this.variaveis.set(nomeVar, varLabel);
39997
40607
  }
39998
- this.text += `
39999
- ldr r1, =${this.variaveis.get(nomeVar)}
40000
- mov r2, #256
40001
- mov r0, #0 @ stdin
40002
- mov r7, #3 @ sys_read
40608
+ this.text += `
40609
+ ldr r1, =${this.variaveis.get(nomeVar)}
40610
+ mov r2, #256
40611
+ mov r0, #0 @ stdin
40612
+ mov r7, #3 @ sys_read
40003
40613
  swi 0`;
40004
40614
  }
40005
40615
  traduzirDeclaracaoPara(declaracao) {
@@ -40014,12 +40624,12 @@ ${nomeFuncao}:
40014
40624
  this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
40015
40625
  }
40016
40626
  }
40017
- this.text += `
40627
+ this.text += `
40018
40628
  ${labelInicio}:`;
40019
40629
  if (declaracao.condicao) {
40020
40630
  const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
40021
- this.text += `
40022
- cmp ${condicao}, #0
40631
+ this.text += `
40632
+ cmp ${condicao}, #0
40023
40633
  beq ${labelFim}`;
40024
40634
  }
40025
40635
  if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
@@ -40030,8 +40640,8 @@ ${labelInicio}:`;
40030
40640
  this.dicionarioConstrutos[declaracao.incrementar.constructor.name](declaracao.incrementar);
40031
40641
  }
40032
40642
  }
40033
- this.text += `
40034
- b ${labelInicio}
40643
+ this.text += `
40644
+ b ${labelInicio}
40035
40645
  ${labelFim}:`;
40036
40646
  }
40037
40647
  traduzirDeclaracaoParaCada(declaracao) {
@@ -40047,55 +40657,56 @@ ${labelFim}:`;
40047
40657
  if (vetor instanceof construtos_1.Vetor) {
40048
40658
  tamanhoVetor = vetor.tamanho || 0;
40049
40659
  }
40050
- this.text += `
40051
- mov r4, #0 @ counter
40052
- ${labelInicio}:
40053
- cmp r4, #${tamanhoVetor}
40660
+ this.text += `
40661
+ mov r4, #0 @ counter
40662
+ ${labelInicio}:
40663
+ cmp r4, #${tamanhoVetor}
40054
40664
  bge ${labelFim}`;
40055
40665
  if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
40056
40666
  this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
40057
40667
  }
40058
- this.text += `
40059
- add r4, r4, #1
40060
- b ${labelInicio}
40668
+ this.text += `
40669
+ add r4, r4, #1
40670
+ b ${labelInicio}
40061
40671
  ${labelFim}:`;
40062
40672
  }
40063
40673
  traduzirDeclaracaoRetorna(declaracao) {
40064
40674
  if (declaracao.valor) {
40065
40675
  const valor = this.dicionarioConstrutos[declaracao.valor.constructor.name](declaracao.valor);
40066
- this.text += `
40676
+ this.text += `
40067
40677
  ldr r0, =${valor}`;
40068
40678
  }
40069
- this.text += `
40070
- mov sp, fp
40679
+ this.text += `
40680
+ mov sp, fp
40071
40681
  pop {fp, pc}`;
40072
40682
  }
40073
40683
  traduzirDeclaracaoSe(declaracao) {
40074
40684
  const labelSenao = this.gerarLabel();
40075
40685
  const labelFim = this.gerarLabel();
40076
40686
  const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
40077
- this.text += `
40078
- cmp ${condicao}, #0
40687
+ this.text += `
40688
+ cmp ${condicao}, #0
40079
40689
  beq ${labelSenao}`;
40080
40690
  if (this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name]) {
40081
40691
  this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name](declaracao.caminhoEntao);
40082
40692
  }
40083
- this.text += `
40084
- b ${labelFim}
40693
+ this.text += `
40694
+ b ${labelFim}
40085
40695
  ${labelSenao}:`;
40086
- if (declaracao.caminhoSenao && this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name]) {
40696
+ if (declaracao.caminhoSenao &&
40697
+ this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name]) {
40087
40698
  this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name](declaracao.caminhoSenao);
40088
40699
  }
40089
- this.text += `
40700
+ this.text += `
40090
40701
  ${labelFim}:`;
40091
40702
  }
40092
40703
  traduzirDeclaracaoClasse(declaracao) {
40093
40704
  var _a;
40094
- this.text += `
40705
+ this.text += `
40095
40706
  @ Classe: ${((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'unknown'}`;
40096
40707
  }
40097
40708
  traduzirDeclaracaoTente(declaracao) {
40098
- this.text += `
40709
+ this.text += `
40099
40710
  @ Tente-pegue`;
40100
40711
  if (declaracao.caminhoTente && Array.isArray(declaracao.caminhoTente)) {
40101
40712
  declaracao.caminhoTente.forEach((decl) => {
@@ -40134,9 +40745,9 @@ ${labelFim}:`;
40134
40745
  }
40135
40746
  else if (this.dicionarioConstrutos[tipoInicializador]) {
40136
40747
  const valor = this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
40137
- this.text += `
40138
- ldr r0, =${valor}
40139
- ldr r1, =${varLabel}
40748
+ this.text += `
40749
+ ldr r0, =${valor}
40750
+ ldr r1, =${varLabel}
40140
40751
  str r0, [r1]`;
40141
40752
  }
40142
40753
  }
@@ -40163,20 +40774,20 @@ ${labelFim}:`;
40163
40774
  // Para ambos linux-arm e android, continuamos usando a convenção
40164
40775
  // de syscall Linux ARM (write). Em Android típico, esse binário
40165
40776
  // seria executado via adb/Termux, onde essa convenção ainda é válida.
40166
- this.text += `
40167
- ldr r1, =${nome_string_literal}
40168
- mov r2, #${tam_string_literal}
40169
- mov r0, #1 @ fd stdout
40170
- mov r7, #4 @ sys_write
40777
+ this.text += `
40778
+ ldr r1, =${nome_string_literal}
40779
+ mov r2, #${tam_string_literal}
40780
+ mov r0, #1 @ fd stdout
40781
+ mov r7, #4 @ sys_write
40171
40782
  swi 0`;
40172
40783
  }
40173
40784
  saidaSistema() {
40174
40785
  // Mesmo comentário da função Escreva: usamos sys_exit Linux.
40175
40786
  // Em um futuro modo Android "NDK/JNI", esta função deveria
40176
40787
  // apenas retornar ao chamador em vez de fazer syscall direta.
40177
- this.text += `
40178
- mov r0, #1 @ exit status
40179
- mov r7, #1 @ sys_exit
40788
+ this.text += `
40789
+ mov r0, #1 @ exit status
40790
+ mov r7, #1 @ sys_exit
40180
40791
  swi 0`;
40181
40792
  }
40182
40793
  traduzir(declaracoes) {
@@ -40251,13 +40862,14 @@ class TradutorAssemblyX64 {
40251
40862
  Escreva: this.traduzirDeclaracaoEscreva.bind(this),
40252
40863
  };
40253
40864
  this.indentacao = 0;
40254
- this.text = `
40255
- section .text
40256
- ${this.alvo === 'linux' ? 'global _start' : 'global main'}
40865
+ this.text = `
40866
+ section .text
40867
+ ${this.alvo === 'linux' ? 'global _start' : 'global main'}
40257
40868
  ${this.alvo === 'linux' ? '_start:' : 'main:'}`;
40258
40869
  if (this.alvo === 'windows') {
40259
- this.text = `
40260
- extern printf
40870
+ this.text =
40871
+ `
40872
+ extern printf
40261
40873
  ` + this.text;
40262
40874
  }
40263
40875
  }
@@ -40319,8 +40931,8 @@ extern printf
40319
40931
  }
40320
40932
  const indice = this.dicionarioConstrutos[construto.indice.constructor.name](construto.indice);
40321
40933
  const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
40322
- this.text += `
40323
- mov rax, ${valor}
40934
+ this.text += `
40935
+ mov rax, ${valor}
40324
40936
  mov [${nomeVar} + ${indice} * 8], rax`;
40325
40937
  }
40326
40938
  traduzirConstrutoAtribuir(construto) {
@@ -40339,8 +40951,8 @@ extern printf
40339
40951
  this.bss += ` ${varLabel} resq 1\n`;
40340
40952
  this.variaveis.set(nomeVar, varLabel);
40341
40953
  }
40342
- this.text += `
40343
- mov rax, ${valor}
40954
+ this.text += `
40955
+ mov rax, ${valor}
40344
40956
  mov [${this.variaveis.get(nomeVar)}], rax`;
40345
40957
  }
40346
40958
  traduzirConstrutoBinario(construto) {
@@ -40348,35 +40960,35 @@ extern printf
40348
40960
  const direita = this.dicionarioConstrutos[construto.direita.constructor.name](construto.direita);
40349
40961
  const operador = construto.operador.lexema;
40350
40962
  const reg = this.obterRegistrador();
40351
- this.text += `
40352
- mov rax, ${esquerda}
40963
+ this.text += `
40964
+ mov rax, ${esquerda}
40353
40965
  mov ${reg}, ${direita}`;
40354
40966
  switch (operador) {
40355
40967
  case '+':
40356
- this.text += `
40968
+ this.text += `
40357
40969
  add rax, ${reg}`;
40358
40970
  break;
40359
40971
  case '-':
40360
- this.text += `
40972
+ this.text += `
40361
40973
  sub rax, ${reg}`;
40362
40974
  break;
40363
40975
  case '*':
40364
- this.text += `
40976
+ this.text += `
40365
40977
  imul rax, ${reg}`;
40366
40978
  break;
40367
40979
  case '/':
40368
- this.text += `
40369
- xor rdx, rdx
40980
+ this.text += `
40981
+ xor rdx, rdx
40370
40982
  idiv ${reg}`;
40371
40983
  break;
40372
40984
  case '%':
40373
- this.text += `
40374
- xor rdx, rdx
40375
- idiv ${reg}
40985
+ this.text += `
40986
+ xor rdx, rdx
40987
+ idiv ${reg}
40376
40988
  mov rax, rdx`;
40377
40989
  break;
40378
40990
  default:
40379
- this.text += `
40991
+ this.text += `
40380
40992
  ; Operador ${operador} não implementado`;
40381
40993
  }
40382
40994
  this.liberarRegistrador(reg);
@@ -40395,28 +41007,28 @@ extern printf
40395
41007
  construto.argumentos.forEach((arg, index) => {
40396
41008
  if (index < registrosArgs.length) {
40397
41009
  const valorArg = this.dicionarioConstrutos[arg.constructor.name](arg);
40398
- this.text += `
41010
+ this.text += `
40399
41011
  mov ${registrosArgs[index]}, ${valorArg}`;
40400
41012
  }
40401
41013
  else {
40402
41014
  // TODO: push extra args on stack according to target ABI
40403
41015
  }
40404
41016
  });
40405
- this.text += `
41017
+ this.text += `
40406
41018
  call ${nomeFuncao}`;
40407
41019
  }
40408
41020
  traduzirConstrutoDefinirValor(construto) {
40409
41021
  const objeto = this.dicionarioConstrutos[construto.objeto.constructor.name](construto.objeto);
40410
41022
  const valor = this.dicionarioConstrutos[construto.valor.constructor.name](construto.valor);
40411
- this.text += `
40412
- mov rax, ${valor}
41023
+ this.text += `
41024
+ mov rax, ${valor}
40413
41025
  mov [${objeto}], rax`;
40414
41026
  }
40415
41027
  traduzirFuncaoConstruto(construto) {
40416
41028
  const labelFuncao = `func_${this.gerarDigitoAleatorio()}`;
40417
- this.text += `
40418
- ${labelFuncao}:
40419
- push rbp
41029
+ this.text += `
41030
+ ${labelFuncao}:
41031
+ push rbp
40420
41032
  mov rbp, rsp`;
40421
41033
  // Traduzir corpo da função
40422
41034
  if (construto.corpo && Array.isArray(construto.corpo)) {
@@ -40426,8 +41038,8 @@ ${labelFuncao}:
40426
41038
  }
40427
41039
  });
40428
41040
  }
40429
- this.text += `
40430
- pop rbp
41041
+ this.text += `
41042
+ pop rbp
40431
41043
  ret`;
40432
41044
  }
40433
41045
  traduzirConstrutoLiteral(construto) {
@@ -40442,29 +41054,29 @@ ${labelFuncao}:
40442
41054
  const operador = construto.operador.lexema;
40443
41055
  const labelVerdadeiro = this.gerarLabel();
40444
41056
  const labelFim = this.gerarLabel();
40445
- this.text += `
40446
- mov rax, ${esquerda}
41057
+ this.text += `
41058
+ mov rax, ${esquerda}
40447
41059
  cmp rax, 0`;
40448
41060
  if (operador === 'e' || operador === '&&') {
40449
- this.text += `
40450
- je ${labelFim}
40451
- mov rax, ${direita}
40452
- cmp rax, 0
40453
- je ${labelFim}
40454
- ${labelVerdadeiro}:
40455
- mov rax, 1
41061
+ this.text += `
41062
+ je ${labelFim}
41063
+ mov rax, ${direita}
41064
+ cmp rax, 0
41065
+ je ${labelFim}
41066
+ ${labelVerdadeiro}:
41067
+ mov rax, 1
40456
41068
  ${labelFim}:`;
40457
41069
  }
40458
41070
  else if (operador === 'ou' || operador === '||') {
40459
- this.text += `
40460
- jne ${labelVerdadeiro}
40461
- mov rax, ${direita}
40462
- cmp rax, 0
40463
- jne ${labelVerdadeiro}
40464
- mov rax, 0
40465
- jmp ${labelFim}
40466
- ${labelVerdadeiro}:
40467
- mov rax, 1
41071
+ this.text += `
41072
+ jne ${labelVerdadeiro}
41073
+ mov rax, ${direita}
41074
+ cmp rax, 0
41075
+ jne ${labelVerdadeiro}
41076
+ mov rax, 0
41077
+ jmp ${labelFim}
41078
+ ${labelVerdadeiro}:
41079
+ mov rax, 1
40468
41080
  ${labelFim}:`;
40469
41081
  }
40470
41082
  return 'rax';
@@ -40477,16 +41089,16 @@ ${labelFim}:`;
40477
41089
  traduzirConstrutoUnario(construto) {
40478
41090
  const operando = this.dicionarioConstrutos[construto.operando.constructor.name](construto.operando);
40479
41091
  const operador = construto.operador.lexema;
40480
- this.text += `
41092
+ this.text += `
40481
41093
  mov rax, ${operando}`;
40482
41094
  if (operador === '-') {
40483
- this.text += `
41095
+ this.text += `
40484
41096
  neg rax`;
40485
41097
  }
40486
41098
  else if (operador === '!' || operador === 'nao') {
40487
- this.text += `
40488
- cmp rax, 0
40489
- sete al
41099
+ this.text += `
41100
+ cmp rax, 0
41101
+ sete al
40490
41102
  movzx rax, al`;
40491
41103
  }
40492
41104
  return 'rax';
@@ -40508,8 +41120,8 @@ ${labelFim}:`;
40508
41120
  construto.valores.forEach((valor, index) => {
40509
41121
  if (this.dicionarioConstrutos[valor.constructor.name]) {
40510
41122
  const valorTraduzido = this.dicionarioConstrutos[valor.constructor.name](valor);
40511
- this.text += `
40512
- mov rax, ${valorTraduzido}
41123
+ this.text += `
41124
+ mov rax, ${valorTraduzido}
40513
41125
  mov [${labelVetor} + ${index * 8}], rax`;
40514
41126
  }
40515
41127
  });
@@ -40529,17 +41141,17 @@ ${labelFim}:`;
40529
41141
  traduzirDeclaracaoEnquanto(declaracao) {
40530
41142
  const labelInicio = this.gerarLabel();
40531
41143
  const labelFim = this.gerarLabel();
40532
- this.text += `
41144
+ this.text += `
40533
41145
  ${labelInicio}:`;
40534
41146
  const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
40535
- this.text += `
40536
- cmp ${condicao}, 0
41147
+ this.text += `
41148
+ cmp ${condicao}, 0
40537
41149
  je ${labelFim}`;
40538
41150
  if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
40539
41151
  this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
40540
41152
  }
40541
- this.text += `
40542
- jmp ${labelInicio}
41153
+ this.text += `
41154
+ jmp ${labelInicio}
40543
41155
  ${labelFim}:`;
40544
41156
  }
40545
41157
  traduzirDeclaracaoEscolha(declaracao) {
@@ -40550,9 +41162,9 @@ ${labelFim}:`;
40550
41162
  const labelProximo = this.gerarLabel();
40551
41163
  if (caminho.condicoes && caminho.condicoes[0]) {
40552
41164
  const valorCaso = this.dicionarioConstrutos[caminho.condicoes[0].constructor.name](caminho.condicoes[0]);
40553
- this.text += `
40554
- mov rax, ${valorEscolha}
40555
- cmp rax, ${valorCaso}
41165
+ this.text += `
41166
+ mov rax, ${valorEscolha}
41167
+ cmp rax, ${valorCaso}
40556
41168
  jne ${labelProximo}`;
40557
41169
  if (caminho.declaracoes && Array.isArray(caminho.declaracoes)) {
40558
41170
  caminho.declaracoes.forEach((decl) => {
@@ -40561,23 +41173,24 @@ ${labelFim}:`;
40561
41173
  }
40562
41174
  });
40563
41175
  }
40564
- this.text += `
40565
- jmp ${labelFim}
41176
+ this.text += `
41177
+ jmp ${labelFim}
40566
41178
  ${labelProximo}:`;
40567
41179
  }
40568
41180
  });
40569
41181
  }
40570
- this.text += `
41182
+ this.text += `
40571
41183
  ${labelFim}:`;
40572
41184
  }
40573
41185
  traduzirDeclaracaoExpressao(declaracao) {
40574
- if (declaracao.expressao && this.dicionarioConstrutos[declaracao.expressao.constructor.name]) {
41186
+ if (declaracao.expressao &&
41187
+ this.dicionarioConstrutos[declaracao.expressao.constructor.name]) {
40575
41188
  this.dicionarioConstrutos[declaracao.expressao.constructor.name](declaracao.expressao);
40576
41189
  }
40577
41190
  }
40578
41191
  traduzirDeclaracaoFazer(declaracao) {
40579
41192
  const labelInicio = this.gerarLabel();
40580
- this.text += `
41193
+ this.text += `
40581
41194
  ${labelInicio}:`;
40582
41195
  // Em Delégua, fazer-enquanto tem caminhoFazer que é um Bloco
40583
41196
  if (declaracao.caminhoFazer && declaracao.caminhoFazer.declaracoes) {
@@ -40589,60 +41202,66 @@ ${labelInicio}:`;
40589
41202
  }
40590
41203
  if (declaracao.condicaoEnquanto) {
40591
41204
  const condicao = this.dicionarioConstrutos[declaracao.condicaoEnquanto.constructor.name](declaracao.condicaoEnquanto);
40592
- this.text += `
40593
- cmp ${condicao}, 0
41205
+ this.text += `
41206
+ cmp ${condicao}, 0
40594
41207
  jne ${labelInicio}`;
40595
41208
  }
40596
41209
  }
40597
41210
  traduzirDeclaracaoFalhar(declaracao) {
40598
41211
  let mensagem = '"Erro"';
40599
- if (declaracao.explicacao && typeof declaracao.explicacao === 'object' && 'constructor' in declaracao.explicacao) {
41212
+ if (declaracao.explicacao &&
41213
+ typeof declaracao.explicacao === 'object' &&
41214
+ 'constructor' in declaracao.explicacao) {
40600
41215
  const explicacao = declaracao.explicacao;
40601
41216
  if (explicacao.constructor && this.dicionarioConstrutos[explicacao.constructor.name]) {
40602
41217
  mensagem = this.dicionarioConstrutos[explicacao.constructor.name](explicacao);
40603
41218
  }
40604
41219
  }
40605
41220
  if (this.alvo === 'linux') {
40606
- this.text += `
40607
- ; Falhar com mensagem: ${mensagem}
40608
- mov eax, 1
40609
- mov ebx, 1
41221
+ this.text += `
41222
+ ; Falhar com mensagem: ${mensagem}
41223
+ mov eax, 1
41224
+ mov ebx, 1
40610
41225
  int 0x80`;
40611
41226
  }
40612
41227
  else {
40613
- this.text += `
40614
- ; Falhar com mensagem: ${mensagem}
40615
- mov eax, 1
41228
+ this.text += `
41229
+ ; Falhar com mensagem: ${mensagem}
41230
+ mov eax, 1
40616
41231
  ret`;
40617
41232
  }
40618
41233
  }
40619
41234
  traduzirDeclaracaoFuncao(declaracao) {
40620
41235
  var _a;
40621
41236
  const nomeFuncao = ((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'funcao';
40622
- this.text += `
40623
- ${nomeFuncao}:
40624
- push rbp
41237
+ this.text += `
41238
+ ${nomeFuncao}:
41239
+ push rbp
40625
41240
  mov rbp, rsp`;
40626
- if (declaracao.funcao && declaracao.funcao.corpo && Array.isArray(declaracao.funcao.corpo)) {
41241
+ if (declaracao.funcao &&
41242
+ declaracao.funcao.corpo &&
41243
+ Array.isArray(declaracao.funcao.corpo)) {
40627
41244
  declaracao.funcao.corpo.forEach((decl) => {
40628
41245
  if (this.dicionarioDeclaracoes[decl.constructor.name]) {
40629
41246
  this.dicionarioDeclaracoes[decl.constructor.name](decl);
40630
41247
  }
40631
41248
  });
40632
41249
  }
40633
- this.text += `
40634
- pop rbp
41250
+ this.text += `
41251
+ pop rbp
40635
41252
  ret`;
40636
41253
  }
40637
41254
  traduzirDeclaracaoImportar(declaracao) {
40638
41255
  // Importação é tratada em tempo de linkagem
40639
- this.text += `
41256
+ this.text += `
40640
41257
  ; Importar: ${declaracao.caminho || 'unknown'}`;
40641
41258
  }
40642
41259
  traduzirDeclaracaoLeia(declaracao) {
40643
41260
  var _a;
40644
41261
  let nomeVar;
40645
- if (declaracao.argumentos && declaracao.argumentos[0] && declaracao.argumentos[0] instanceof construtos_1.Variavel) {
41262
+ if (declaracao.argumentos &&
41263
+ declaracao.argumentos[0] &&
41264
+ declaracao.argumentos[0] instanceof construtos_1.Variavel) {
40646
41265
  nomeVar = (_a = declaracao.argumentos[0].simbolo) === null || _a === void 0 ? void 0 : _a.lexema;
40647
41266
  }
40648
41267
  if (!nomeVar)
@@ -40652,11 +41271,11 @@ ${nomeFuncao}:
40652
41271
  this.bss += ` ${varLabel} resb 256\n`;
40653
41272
  this.variaveis.set(nomeVar, varLabel);
40654
41273
  }
40655
- this.text += `
40656
- mov eax, 3
40657
- mov ebx, 0
40658
- mov ecx, ${this.variaveis.get(nomeVar)}
40659
- mov edx, 256
41274
+ this.text += `
41275
+ mov eax, 3
41276
+ mov ebx, 0
41277
+ mov ecx, ${this.variaveis.get(nomeVar)}
41278
+ mov edx, 256
40660
41279
  int 0x80`;
40661
41280
  }
40662
41281
  traduzirDeclaracaoPara(declaracao) {
@@ -40672,12 +41291,12 @@ ${nomeFuncao}:
40672
41291
  this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
40673
41292
  }
40674
41293
  }
40675
- this.text += `
41294
+ this.text += `
40676
41295
  ${labelInicio}:`;
40677
41296
  if (declaracao.condicao) {
40678
41297
  const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
40679
- this.text += `
40680
- cmp ${condicao}, 0
41298
+ this.text += `
41299
+ cmp ${condicao}, 0
40681
41300
  je ${labelFim}`;
40682
41301
  }
40683
41302
  if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
@@ -40688,8 +41307,8 @@ ${labelInicio}:`;
40688
41307
  this.dicionarioConstrutos[declaracao.incrementar.constructor.name](declaracao.incrementar);
40689
41308
  }
40690
41309
  }
40691
- this.text += `
40692
- jmp ${labelInicio}
41310
+ this.text += `
41311
+ jmp ${labelInicio}
40693
41312
  ${labelFim}:`;
40694
41313
  }
40695
41314
  traduzirDeclaracaoParaCada(declaracao) {
@@ -40705,57 +41324,58 @@ ${labelFim}:`;
40705
41324
  if (vetor instanceof construtos_1.Vetor) {
40706
41325
  tamanhoVetor = vetor.tamanho || 0;
40707
41326
  }
40708
- this.text += `
40709
- xor rcx, rcx
40710
- ${labelInicio}:
40711
- cmp rcx, ${tamanhoVetor}
41327
+ this.text += `
41328
+ xor rcx, rcx
41329
+ ${labelInicio}:
41330
+ cmp rcx, ${tamanhoVetor}
40712
41331
  jge ${labelFim}`;
40713
41332
  if (this.dicionarioDeclaracoes[declaracao.corpo.constructor.name]) {
40714
41333
  this.dicionarioDeclaracoes[declaracao.corpo.constructor.name](declaracao.corpo);
40715
41334
  }
40716
- this.text += `
40717
- inc rcx
40718
- jmp ${labelInicio}
41335
+ this.text += `
41336
+ inc rcx
41337
+ jmp ${labelInicio}
40719
41338
  ${labelFim}:`;
40720
41339
  }
40721
41340
  traduzirDeclaracaoRetorna(declaracao) {
40722
41341
  if (declaracao.valor) {
40723
41342
  const valor = this.dicionarioConstrutos[declaracao.valor.constructor.name](declaracao.valor);
40724
- this.text += `
41343
+ this.text += `
40725
41344
  mov rax, ${valor}`;
40726
41345
  }
40727
- this.text += `
40728
- pop rbp
41346
+ this.text += `
41347
+ pop rbp
40729
41348
  ret`;
40730
41349
  }
40731
41350
  traduzirDeclaracaoSe(declaracao) {
40732
41351
  const labelSenao = this.gerarLabel();
40733
41352
  const labelFim = this.gerarLabel();
40734
41353
  const condicao = this.dicionarioConstrutos[declaracao.condicao.constructor.name](declaracao.condicao);
40735
- this.text += `
40736
- cmp ${condicao}, 0
41354
+ this.text += `
41355
+ cmp ${condicao}, 0
40737
41356
  je ${labelSenao}`;
40738
41357
  if (this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name]) {
40739
41358
  this.dicionarioDeclaracoes[declaracao.caminhoEntao.constructor.name](declaracao.caminhoEntao);
40740
41359
  }
40741
- this.text += `
40742
- jmp ${labelFim}
41360
+ this.text += `
41361
+ jmp ${labelFim}
40743
41362
  ${labelSenao}:`;
40744
- if (declaracao.caminhoSenao && this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name]) {
41363
+ if (declaracao.caminhoSenao &&
41364
+ this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name]) {
40745
41365
  this.dicionarioDeclaracoes[declaracao.caminhoSenao.constructor.name](declaracao.caminhoSenao);
40746
41366
  }
40747
- this.text += `
41367
+ this.text += `
40748
41368
  ${labelFim}:`;
40749
41369
  }
40750
41370
  traduzirDeclaracaoClasse(declaracao) {
40751
41371
  var _a;
40752
41372
  // Classes em assembly são complexas - implementação básica
40753
- this.text += `
41373
+ this.text += `
40754
41374
  ; Classe: ${((_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || 'unknown'}`;
40755
41375
  }
40756
41376
  traduzirDeclaracaoTente(declaracao) {
40757
41377
  // Try-catch em assembly requer handler complexo
40758
- this.text += `
41378
+ this.text += `
40759
41379
  ; Tente-pegue`;
40760
41380
  if (declaracao.caminhoTente && Array.isArray(declaracao.caminhoTente)) {
40761
41381
  declaracao.caminhoTente.forEach((decl) => {
@@ -40794,8 +41414,8 @@ ${labelFim}:`;
40794
41414
  }
40795
41415
  else if (this.dicionarioConstrutos[tipoInicializador]) {
40796
41416
  const valor = this.dicionarioConstrutos[tipoInicializador](declaracao.inicializador);
40797
- this.text += `
40798
- mov rax, ${valor}
41417
+ this.text += `
41418
+ mov rax, ${valor}
40799
41419
  mov [${varLabel}], rax`;
40800
41420
  }
40801
41421
  }
@@ -40818,32 +41438,32 @@ ${labelFim}:`;
40818
41438
  tam_string_literal = this.criaTamanhoNaMemoriaReferenteAVar(nome_string_literal);
40819
41439
  }
40820
41440
  if (this.alvo === 'linux') {
40821
- this.text += `
40822
- mov edx, ${tam_string_literal}
40823
- mov ecx, ${nome_string_literal}
40824
- mov ebx, 1 ; fd stdout
40825
- mov eax, 4 ; sys_write
41441
+ this.text += `
41442
+ mov edx, ${tam_string_literal}
41443
+ mov ecx, ${nome_string_literal}
41444
+ mov ebx, 1 ; fd stdout
41445
+ mov eax, 4 ; sys_write
40826
41446
  int 0x80`;
40827
41447
  }
40828
41448
  else {
40829
41449
  // Windows: prototype `extern printf` and follow Win64 calling convention
40830
41450
  // RCX = format pointer; here we use the literal directly as a C string
40831
- this.text += `
40832
- lea rcx, [rel ${nome_string_literal}]
41451
+ this.text += `
41452
+ lea rcx, [rel ${nome_string_literal}]
40833
41453
  call printf`;
40834
41454
  }
40835
41455
  }
40836
41456
  saidaSistema() {
40837
41457
  if (this.alvo === 'linux') {
40838
- this.text += `
40839
- mov eax, 1 ; sys_exit
40840
- xor ebx, ebx ; status 0
41458
+ this.text += `
41459
+ mov eax, 1 ; sys_exit
41460
+ xor ebx, ebx ; status 0
40841
41461
  int 0x80`;
40842
41462
  }
40843
41463
  else {
40844
41464
  // Windows: return from main with 0 in EAX
40845
- this.text += `
40846
- xor eax, eax
41465
+ this.text += `
41466
+ xor eax, eax
40847
41467
  ret`;
40848
41468
  }
40849
41469
  }
@@ -41311,7 +41931,7 @@ class TradutorAssemblyScript {
41311
41931
  return resultado;
41312
41932
  }
41313
41933
  traduzirDeclaracaoVarMultiplo(declaracaoVarMultiplo) {
41314
- const variaveis = declaracaoVarMultiplo.simbolos.map(s => s.lexema).join(', ');
41934
+ const variaveis = declaracaoVarMultiplo.simbolos.map((s) => s.lexema).join(', ');
41315
41935
  let resultado = 'let ';
41316
41936
  resultado += variaveis;
41317
41937
  resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoVarMultiplo.tipo);
@@ -41330,7 +41950,7 @@ class TradutorAssemblyScript {
41330
41950
  return resultado;
41331
41951
  }
41332
41952
  traduzirDeclaracaoConstMultiplo(declaracaoConstMultiplo) {
41333
- const constantes = declaracaoConstMultiplo.simbolos.map(s => s.lexema).join(', ');
41953
+ const constantes = declaracaoConstMultiplo.simbolos.map((s) => s.lexema).join(', ');
41334
41954
  let resultado = 'const ';
41335
41955
  resultado += constantes;
41336
41956
  resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoConstMultiplo.tipo);
@@ -41485,7 +42105,9 @@ class TradutorAssemblyScript {
41485
42105
  const declaracoesCorpo = corpoBloco.declaracoes || [];
41486
42106
  let resultadoCorpo = '{\n';
41487
42107
  this.indentacao += 4;
41488
- resultadoCorpo += ' '.repeat(this.indentacao) + `const ${nomeVariavel} = ${nomeVetor}[__i_${nomeVariavel}];\n`;
42108
+ resultadoCorpo +=
42109
+ ' '.repeat(this.indentacao) +
42110
+ `const ${nomeVariavel} = ${nomeVetor}[__i_${nomeVariavel}];\n`;
41489
42111
  for (const declaracaoOuConstruto of declaracoesCorpo) {
41490
42112
  resultadoCorpo += ' '.repeat(this.indentacao);
41491
42113
  const nomeConstrutor = declaracaoOuConstruto.constructor.name;
@@ -41706,7 +42328,9 @@ class TradutorAssemblyScript {
41706
42328
  if (typeof chave === 'string') {
41707
42329
  chaveStr = `"${chave}"`;
41708
42330
  }
41709
- else if (chave && chave.constructor && this.dicionarioConstrutos[chave.constructor.name]) {
42331
+ else if (chave &&
42332
+ chave.constructor &&
42333
+ this.dicionarioConstrutos[chave.constructor.name]) {
41710
42334
  // Se for um Construto, traduzi-lo
41711
42335
  chaveStr = this.dicionarioConstrutos[chave.constructor.name](chave);
41712
42336
  }
@@ -41801,7 +42425,7 @@ class TradutorAssemblyScript {
41801
42425
  return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}, ${decimo}]`;
41802
42426
  }
41803
42427
  traduzirConstrutoTuplaN(tuplaN) {
41804
- const elementos = tuplaN.elementos.map(elemento => this.dicionarioConstrutos[elemento.constructor.name](elemento));
42428
+ const elementos = tuplaN.elementos.map((elemento) => this.dicionarioConstrutos[elemento.constructor.name](elemento));
41805
42429
  return `[${elementos.join(', ')}]`;
41806
42430
  }
41807
42431
  traduzirConstrutoSeTernario(seTernario) {
@@ -41880,7 +42504,7 @@ class TradutorAssemblyScript {
41880
42504
  // Check if this is a native library function call
41881
42505
  if (chamada.entidadeChamada instanceof construtos_1.Variavel) {
41882
42506
  const nomeVariavel = chamada.entidadeChamada.simbolo.lexema;
41883
- const argumentosTexto = chamada.argumentos.map(arg => this.dicionarioConstrutos[arg.constructor.name](arg));
42507
+ const argumentosTexto = chamada.argumentos.map((arg) => this.dicionarioConstrutos[arg.constructor.name](arg));
41884
42508
  const funcaoNativa = this.traduzirFuncaoNativaGlobal(nomeVariavel, argumentosTexto);
41885
42509
  if (funcaoNativa) {
41886
42510
  return funcaoNativa;
@@ -42227,7 +42851,7 @@ class TradutorElixir {
42227
42851
  async extrairCamposStruct(declaracao) {
42228
42852
  const campos = new Set();
42229
42853
  // Procurar pelo construtor
42230
- const construtor = declaracao.metodos.find(m => m.simbolo.lexema === 'construtor' || m.simbolo.lexema === 'inicializar');
42854
+ const construtor = declaracao.metodos.find((m) => m.simbolo.lexema === 'construtor' || m.simbolo.lexema === 'inicializar');
42231
42855
  if (!construtor) {
42232
42856
  return [];
42233
42857
  }
@@ -42236,7 +42860,7 @@ class TradutorElixir {
42236
42860
  this.extrairCamposDeDeclaracao(declaracaoCorpo, campos);
42237
42861
  }
42238
42862
  // Converter para atoms do Elixir
42239
- return Array.from(campos).map(c => `:${this.converterIdentificador(c)}`);
42863
+ return Array.from(campos).map((c) => `:${this.converterIdentificador(c)}`);
42240
42864
  }
42241
42865
  /**
42242
42866
  * Extrai campos de uma declaração recursivamente
@@ -42278,7 +42902,7 @@ class TradutorElixir {
42278
42902
  // Construtor vira função new/N
42279
42903
  if (metodo.simbolo.lexema === 'construtor' || metodo.simbolo.lexema === 'inicializar') {
42280
42904
  resultado += `def new(`;
42281
- const parametros = metodo.funcao.parametros.map(p => this.converterIdentificador(p.nome.lexema));
42905
+ const parametros = metodo.funcao.parametros.map((p) => this.converterIdentificador(p.nome.lexema));
42282
42906
  resultado += parametros.join(', ');
42283
42907
  resultado += ') do\n';
42284
42908
  this.aumentarIndentacao();
@@ -42296,7 +42920,7 @@ class TradutorElixir {
42296
42920
  resultado += `def ${nomeMetodo}(`;
42297
42921
  const nomeParametroStruct = this.converterIdentificador(nomeModulo.toLowerCase());
42298
42922
  this.nomeParametroStruct = nomeParametroStruct;
42299
- const parametros = [nomeParametroStruct].concat(metodo.funcao.parametros.map(p => this.converterIdentificador(p.nome.lexema)));
42923
+ const parametros = [nomeParametroStruct].concat(metodo.funcao.parametros.map((p) => this.converterIdentificador(p.nome.lexema)));
42300
42924
  resultado += parametros.join(', ');
42301
42925
  resultado += ') do\n';
42302
42926
  this.aumentarIndentacao();
@@ -42386,7 +43010,7 @@ class TradutorElixir {
42386
43010
  let resultado = this.adicionarIndentacao();
42387
43011
  resultado += `def ${nomeFuncao}(`;
42388
43012
  // Parâmetros
42389
- const parametros = declaracao.funcao.parametros.map(p => this.converterIdentificador(p.nome.lexema));
43013
+ const parametros = declaracao.funcao.parametros.map((p) => this.converterIdentificador(p.nome.lexema));
42390
43014
  resultado += parametros.join(', ');
42391
43015
  resultado += ') do\n';
42392
43016
  // Corpo
@@ -42663,7 +43287,9 @@ class TradutorElixir {
42663
43287
  case 'ordenar':
42664
43288
  return `Enum.sort(${objeto})`;
42665
43289
  case 'juntar':
42666
- return argumentos.length > 0 ? `Enum.join(${objeto}, ${argumentos[0]})` : `Enum.join(${objeto})`;
43290
+ return argumentos.length > 0
43291
+ ? `Enum.join(${objeto}, ${argumentos[0]})`
43292
+ : `Enum.join(${objeto})`;
42667
43293
  case 'fatiar':
42668
43294
  if (argumentos.length >= 2) {
42669
43295
  return `Enum.slice(${objeto}, ${argumentos[0]}, ${argumentos[1]})`;
@@ -42802,7 +43428,7 @@ class TradutorElixir {
42802
43428
  async visitarExpressaoFuncaoConstruto(expressao) {
42803
43429
  let resultado = 'fn ';
42804
43430
  // Parâmetros
42805
- const parametros = expressao.parametros.map(p => this.converterIdentificador(p.nome.lexema));
43431
+ const parametros = expressao.parametros.map((p) => this.converterIdentificador(p.nome.lexema));
42806
43432
  resultado += parametros.join(', ');
42807
43433
  resultado += ' ->';
42808
43434
  // Corpo - se for uma única expressão, inline; se for bloco, multi-linha
@@ -43568,7 +44194,8 @@ class TradutorJavaScript {
43568
44194
  if (argumento instanceof construtos_1.Variavel) {
43569
44195
  return argumento.simbolo.lexema;
43570
44196
  }
43571
- if (argumento instanceof construtos_1.ReferenciaFuncao || argumento instanceof construtos_1.ArgumentoReferenciaFuncao) {
44197
+ if (argumento instanceof construtos_1.ReferenciaFuncao ||
44198
+ argumento instanceof construtos_1.ArgumentoReferenciaFuncao) {
43572
44199
  return argumento.simboloFuncao.lexema;
43573
44200
  }
43574
44201
  return (_c = (_b = (_a = this.dicionarioConstrutos)[argumento.constructor.name]) === null || _b === void 0 ? void 0 : _b.call(_a, argumento)) !== null && _c !== void 0 ? _c : '';
@@ -43809,7 +44436,7 @@ class TradutorMermaidJs {
43809
44436
  var _a, _b;
43810
44437
  const nomeClasse = declaracao.simbolo.lexema;
43811
44438
  const superClasse = declaracao.superClasse
43812
- ? (((_a = declaracao.superClasse.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || ((_b = declaracao.superClasse.nome) === null || _b === void 0 ? void 0 : _b.lexema))
44439
+ ? ((_a = declaracao.superClasse.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) || ((_b = declaracao.superClasse.nome) === null || _b === void 0 ? void 0 : _b.lexema)
43813
44440
  : undefined;
43814
44441
  const linha = declaracao.linha;
43815
44442
  // Cria arestas de entrada e saída para a classe
@@ -44070,9 +44697,7 @@ class TradutorMermaidJs {
44070
44697
  // Caminho então, normalmente um `Bloco`.
44071
44698
  const verticesEntao = await declaracao.caminhoEntao.aceitar(this);
44072
44699
  vertices = vertices.concat(verticesEntao);
44073
- const ultimaArestaEntao = verticesEntao.length > 0
44074
- ? verticesEntao[verticesEntao.length - 1].destino
44075
- : aresta;
44700
+ const ultimaArestaEntao = verticesEntao.length > 0 ? verticesEntao[verticesEntao.length - 1].destino : aresta;
44076
44701
  if (declaracao.caminhoSenao) {
44077
44702
  this.anteriores = [];
44078
44703
  // Verifica se é "senão se" ou apenas "senão"
@@ -44120,9 +44745,7 @@ class TradutorMermaidJs {
44120
44745
  verticesTente.push(...verticesDeclaracao);
44121
44746
  }
44122
44747
  vertices = vertices.concat(verticesTente);
44123
- const ultimaArestaTente = verticesTente.length > 0
44124
- ? verticesTente[verticesTente.length - 1].destino
44125
- : aresta;
44748
+ const ultimaArestaTente = verticesTente.length > 0 ? verticesTente[verticesTente.length - 1].destino : aresta;
44126
44749
  const anterioresAposTente = [];
44127
44750
  // Caminho pegue (catch) - se existir
44128
44751
  if (declaracao.caminhoPegue) {
@@ -44308,7 +44931,7 @@ class TradutorMermaidJs {
44308
44931
  async visitarExpressaoFuncaoConstruto(expressao) {
44309
44932
  let texto = 'função anônima';
44310
44933
  if (expressao.parametros && expressao.parametros.length > 0) {
44311
- const parametros = expressao.parametros.map(p => p.nome.lexema).join(', ');
44934
+ const parametros = expressao.parametros.map((p) => p.nome.lexema).join(', ');
44312
44935
  texto += `(${parametros})`;
44313
44936
  }
44314
44937
  else {
@@ -44850,7 +45473,7 @@ class TradutorPython {
44850
45473
  }
44851
45474
  const funcao = argumento;
44852
45475
  // Extrai os nomes dos parâmetros
44853
- const parametros = funcao.parametros.map(param => param.nome.lexema).join(', ');
45476
+ const parametros = funcao.parametros.map((param) => param.nome.lexema).join(', ');
44854
45477
  // Python lambdas suportam apenas uma expressão
44855
45478
  // Assumimos que a função tem um corpo simples com uma declaração de retorno
44856
45479
  let expressao = '';
@@ -46595,7 +47218,7 @@ class TradutorRuby {
46595
47218
  }
46596
47219
  const funcao = argumento;
46597
47220
  // Extrai os nomes dos parâmetros
46598
- const parametros = funcao.parametros.map(param => param.nome.lexema).join(', ');
47221
+ const parametros = funcao.parametros.map((param) => param.nome.lexema).join(', ');
46599
47222
  // Assumimos que a função tem um corpo simples com uma declaração de retorno
46600
47223
  let expressao = '';
46601
47224
  if (funcao.corpo.length > 0) {