@designliquido/delegua 0.36.1 → 0.36.2

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 (490) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +69 -69
  2. package/analisador-semantico/analisador-semantico-base.js +180 -180
  3. package/analisador-semantico/analisador-semantico.d.ts +59 -59
  4. package/analisador-semantico/analisador-semantico.js +442 -442
  5. package/analisador-semantico/analisador-semantico.js.map +1 -1
  6. package/analisador-semantico/index.d.ts +3 -3
  7. package/analisador-semantico/index.js +19 -19
  8. package/analisador-semantico/pilha-variaveis.d.ts +20 -20
  9. package/analisador-semantico/pilha-variaveis.js +25 -25
  10. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +69 -69
  11. package/avaliador-sintatico/avaliador-sintatico-base.js +223 -223
  12. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  13. package/avaliador-sintatico/avaliador-sintatico.d.ts +126 -126
  14. package/avaliador-sintatico/avaliador-sintatico.js +1093 -1093
  15. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +73 -73
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +648 -648
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +21 -21
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +149 -149
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +87 -87
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +770 -770
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  25. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +34 -34
  26. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +168 -168
  27. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  28. package/avaliador-sintatico/dialetos/index.d.ts +3 -3
  29. package/avaliador-sintatico/dialetos/index.js +19 -19
  30. package/avaliador-sintatico/erro-avaliador-sintatico.d.ts +5 -5
  31. package/avaliador-sintatico/erro-avaliador-sintatico.js +11 -11
  32. package/avaliador-sintatico/index.d.ts +6 -6
  33. package/avaliador-sintatico/index.js +22 -22
  34. package/avaliador-sintatico/micro-avaliador-sintatico-base.d.ts +27 -27
  35. package/avaliador-sintatico/micro-avaliador-sintatico-base.js +116 -116
  36. package/avaliador-sintatico/micro-avaliador-sintatico-base.js.map +1 -1
  37. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts +33 -33
  38. package/avaliador-sintatico/micro-avaliador-sintatico.js +287 -287
  39. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  40. package/avaliador-sintatico/retornos/index.d.ts +3 -3
  41. package/avaliador-sintatico/retornos/index.js +19 -19
  42. package/avaliador-sintatico/retornos/retorno-declaracao.d.ts +3 -3
  43. package/avaliador-sintatico/retornos/retorno-declaracao.js +2 -2
  44. package/avaliador-sintatico/retornos/retorno-primario.d.ts +3 -3
  45. package/avaliador-sintatico/retornos/retorno-primario.js +2 -2
  46. package/avaliador-sintatico/retornos/retorno-resolver-declaracao.d.ts +2 -2
  47. package/avaliador-sintatico/retornos/retorno-resolver-declaracao.js +2 -2
  48. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts +59 -59
  49. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js +150 -150
  50. package/bibliotecas/biblioteca-global.d.ts +157 -157
  51. package/bibliotecas/biblioteca-global.js +497 -498
  52. package/bibliotecas/biblioteca-global.js.map +1 -1
  53. package/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts +1 -1
  54. package/bibliotecas/dialetos/egua-classico/biblioteca-global.js +236 -236
  55. package/bibliotecas/dialetos/egua-classico/biblioteca-global.js.map +1 -1
  56. package/bibliotecas/dialetos/egua-classico/index.d.ts +2 -2
  57. package/bibliotecas/dialetos/egua-classico/index.js +32 -32
  58. package/bibliotecas/dialetos/egua-classico/index.js.map +1 -1
  59. package/bibliotecas/dialetos/egua-classico/matematica.d.ts +1 -1
  60. package/bibliotecas/dialetos/egua-classico/matematica.js +541 -541
  61. package/bibliotecas/dialetos/egua-classico/matematica.js.map +1 -1
  62. package/bibliotecas/dialetos/egua-classico/tempo.d.ts +1 -1
  63. package/bibliotecas/dialetos/egua-classico/tempo.js +39 -39
  64. package/bibliotecas/dialetos/egua-classico/tempo.js.map +1 -1
  65. package/bibliotecas/dialetos/egua-classico/textos.d.ts +8 -8
  66. package/bibliotecas/dialetos/egua-classico/textos.js +201 -201
  67. package/bibliotecas/dialetos/egua-classico/textos.js.map +1 -1
  68. package/bibliotecas/primitivas-dicionario.d.ts +6 -6
  69. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  70. package/bibliotecas/primitivas-dicionario.js +10 -10
  71. package/bibliotecas/primitivas-numero.d.ts +6 -6
  72. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  73. package/bibliotecas/primitivas-numero.js +10 -10
  74. package/bibliotecas/primitivas-texto.d.ts +17 -17
  75. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  76. package/bibliotecas/primitivas-texto.js +22 -22
  77. package/bibliotecas/primitivas-texto.js.map +1 -1
  78. package/bibliotecas/primitivas-vetor.d.ts +21 -21
  79. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  80. package/bibliotecas/primitivas-vetor.js +90 -90
  81. package/bibliotecas/primitivas-vetor.js.map +1 -1
  82. package/bin/package.json +5 -4
  83. package/construtos/acesso-elemento-matriz.d.ts +12 -12
  84. package/construtos/acesso-elemento-matriz.js +17 -17
  85. package/construtos/acesso-indice-variavel.d.ts +15 -15
  86. package/construtos/acesso-indice-variavel.js +20 -20
  87. package/construtos/acesso-metodo-ou-propriedade.d.ts +14 -14
  88. package/construtos/acesso-metodo-ou-propriedade.js +19 -19
  89. package/construtos/agrupamento.d.ts +14 -14
  90. package/construtos/agrupamento.js +19 -19
  91. package/construtos/atribuicao-por-indice.d.ts +11 -11
  92. package/construtos/atribuicao-por-indice.js +16 -16
  93. package/construtos/atribuicao-por-indices-matriz.d.ts +12 -12
  94. package/construtos/atribuicao-por-indices-matriz.js +17 -17
  95. package/construtos/atribuir.d.ts +15 -15
  96. package/construtos/atribuir.js +24 -24
  97. package/construtos/atribuir.js.map +1 -1
  98. package/construtos/binario.d.ts +33 -33
  99. package/construtos/binario.js +38 -38
  100. package/construtos/chamada.d.ts +15 -15
  101. package/construtos/chamada.js +21 -21
  102. package/construtos/comentario.d.ts +15 -15
  103. package/construtos/comentario.js +20 -20
  104. package/construtos/constante.d.ts +12 -12
  105. package/construtos/constante.js +17 -17
  106. package/construtos/construto.d.ts +7 -7
  107. package/construtos/construto.js +2 -2
  108. package/construtos/decorador.d.ts +14 -14
  109. package/construtos/decorador.js +19 -19
  110. package/construtos/definir-valor.d.ts +11 -11
  111. package/construtos/definir-valor.js +16 -16
  112. package/construtos/dicionario.d.ts +10 -10
  113. package/construtos/dicionario.js +15 -15
  114. package/construtos/expressao-regular.d.ts +10 -10
  115. package/construtos/expressao-regular.js +15 -15
  116. package/construtos/fim-para.d.ts +22 -22
  117. package/construtos/fim-para.js +25 -25
  118. package/construtos/formatacao-escrita.d.ts +16 -16
  119. package/construtos/formatacao-escrita.js +21 -21
  120. package/construtos/funcao.d.ts +12 -12
  121. package/construtos/funcao.js +16 -16
  122. package/construtos/index.d.ts +29 -29
  123. package/construtos/index.js +45 -45
  124. package/construtos/isto.d.ts +9 -9
  125. package/construtos/isto.js +14 -14
  126. package/construtos/literal.d.ts +10 -10
  127. package/construtos/literal.js +14 -14
  128. package/construtos/logico.d.ts +11 -11
  129. package/construtos/logico.js +16 -16
  130. package/construtos/qual-tipo.d.ts +11 -11
  131. package/construtos/qual-tipo.js +16 -16
  132. package/construtos/super.d.ts +10 -10
  133. package/construtos/super.js +15 -15
  134. package/construtos/tipo-de.d.ts +10 -10
  135. package/construtos/tipo-de.js +15 -15
  136. package/construtos/tuplas/deceto.d.ts +18 -18
  137. package/construtos/tuplas/deceto.js +32 -32
  138. package/construtos/tuplas/dupla.d.ts +6 -6
  139. package/construtos/tuplas/dupla.js +12 -12
  140. package/construtos/tuplas/index.d.ts +13 -13
  141. package/construtos/tuplas/index.js +67 -67
  142. package/construtos/tuplas/index.js.map +1 -1
  143. package/construtos/tuplas/noneto.d.ts +15 -15
  144. package/construtos/tuplas/noneto.js +25 -25
  145. package/construtos/tuplas/octeto.d.ts +14 -14
  146. package/construtos/tuplas/octeto.js +24 -24
  147. package/construtos/tuplas/quarteto.d.ts +8 -8
  148. package/construtos/tuplas/quarteto.js +14 -14
  149. package/construtos/tuplas/quinteto.d.ts +9 -9
  150. package/construtos/tuplas/quinteto.js +15 -15
  151. package/construtos/tuplas/septeto.d.ts +13 -13
  152. package/construtos/tuplas/septeto.js +23 -23
  153. package/construtos/tuplas/sexteto.d.ts +10 -10
  154. package/construtos/tuplas/sexteto.js +16 -16
  155. package/construtos/tuplas/trio.d.ts +7 -7
  156. package/construtos/tuplas/trio.js +13 -13
  157. package/construtos/tuplas/tupla.d.ts +8 -8
  158. package/construtos/tuplas/tupla.js +9 -9
  159. package/construtos/unario.d.ts +11 -11
  160. package/construtos/unario.js +16 -16
  161. package/construtos/variavel.d.ts +9 -9
  162. package/construtos/variavel.js +14 -14
  163. package/construtos/vetor.d.ts +11 -11
  164. package/construtos/vetor.js +21 -21
  165. package/construtos/vetor.js.map +1 -1
  166. package/declaracoes/aleatorio.d.ts +15 -15
  167. package/declaracoes/aleatorio.js +15 -15
  168. package/declaracoes/bloco.d.ts +7 -7
  169. package/declaracoes/bloco.js +14 -14
  170. package/declaracoes/cabecalho-programa.d.ts +7 -7
  171. package/declaracoes/cabecalho-programa.js +14 -14
  172. package/declaracoes/classe.d.ts +14 -14
  173. package/declaracoes/classe.js +18 -18
  174. package/declaracoes/const-multiplo.d.ts +14 -14
  175. package/declaracoes/const-multiplo.js +19 -19
  176. package/declaracoes/const.d.ts +14 -14
  177. package/declaracoes/const.js +19 -19
  178. package/declaracoes/continua.d.ts +6 -6
  179. package/declaracoes/continua.js +13 -13
  180. package/declaracoes/declaracao.d.ts +8 -8
  181. package/declaracoes/declaracao.js +17 -17
  182. package/declaracoes/enquanto.d.ts +10 -10
  183. package/declaracoes/enquanto.js +15 -15
  184. package/declaracoes/escolha.d.ts +14 -14
  185. package/declaracoes/escolha.js +19 -19
  186. package/declaracoes/escreva-mesma-linha.d.ts +8 -8
  187. package/declaracoes/escreva-mesma-linha.js +14 -14
  188. package/declaracoes/escreva.d.ts +8 -8
  189. package/declaracoes/escreva.js +14 -14
  190. package/declaracoes/expressao.d.ts +8 -8
  191. package/declaracoes/expressao.js +14 -14
  192. package/declaracoes/falhar.d.ts +8 -8
  193. package/declaracoes/falhar.js +15 -15
  194. package/declaracoes/fazer.d.ts +10 -10
  195. package/declaracoes/fazer.js +15 -15
  196. package/declaracoes/funcao.d.ts +11 -11
  197. package/declaracoes/funcao.js +17 -17
  198. package/declaracoes/importar.d.ts +9 -9
  199. package/declaracoes/importar.js +15 -15
  200. package/declaracoes/index.d.ts +31 -31
  201. package/declaracoes/index.js +47 -47
  202. package/declaracoes/inicio-algoritmo.d.ts +6 -6
  203. package/declaracoes/inicio-algoritmo.js +13 -13
  204. package/declaracoes/leia-multiplo.d.ts +14 -14
  205. package/declaracoes/leia-multiplo.js +21 -21
  206. package/declaracoes/leia.d.ts +17 -17
  207. package/declaracoes/leia.js +21 -21
  208. package/declaracoes/para-cada.d.ts +11 -11
  209. package/declaracoes/para-cada.js +17 -17
  210. package/declaracoes/para.d.ts +19 -19
  211. package/declaracoes/para.js +24 -24
  212. package/declaracoes/propriedade-classe.d.ts +10 -10
  213. package/declaracoes/propriedade-classe.js +16 -16
  214. package/declaracoes/retorna.d.ts +8 -8
  215. package/declaracoes/retorna.js +15 -15
  216. package/declaracoes/se.d.ts +11 -11
  217. package/declaracoes/se.js +17 -17
  218. package/declaracoes/sustar.d.ts +6 -6
  219. package/declaracoes/sustar.js +13 -13
  220. package/declaracoes/tendo-como.d.ts +16 -16
  221. package/declaracoes/tendo-como.js +21 -21
  222. package/declaracoes/tente.d.ts +14 -14
  223. package/declaracoes/tente.js +20 -20
  224. package/declaracoes/var-multiplo.d.ts +15 -15
  225. package/declaracoes/var-multiplo.js +20 -20
  226. package/declaracoes/var.d.ts +16 -16
  227. package/declaracoes/var.js +21 -21
  228. package/depuracao/cyrb53.d.ts +9 -9
  229. package/depuracao/cyrb53.js +22 -22
  230. package/depuracao/cyrb53.js.map +1 -1
  231. package/depuracao/index.d.ts +2 -2
  232. package/depuracao/index.js +23 -23
  233. package/depuracao/ponto-parada.d.ts +4 -4
  234. package/depuracao/ponto-parada.js +2 -2
  235. package/espaco-variaveis.d.ts +19 -19
  236. package/espaco-variaveis.js +19 -19
  237. package/estruturas/chamavel.d.ts +7 -7
  238. package/estruturas/chamavel.js +12 -12
  239. package/estruturas/classe-padrao.d.ts +31 -31
  240. package/estruturas/classe-padrao.js +39 -39
  241. package/estruturas/delegua-funcao.d.ts +29 -29
  242. package/estruturas/delegua-funcao.js +141 -141
  243. package/estruturas/delegua-funcao.js.map +1 -1
  244. package/estruturas/descritor-tipo-classe.d.ts +37 -37
  245. package/estruturas/descritor-tipo-classe.js +79 -79
  246. package/estruturas/descritor-tipo-classe.js.map +1 -1
  247. package/estruturas/funcao-padrao.d.ts +23 -23
  248. package/estruturas/funcao-padrao.js +34 -34
  249. package/estruturas/index.d.ts +9 -9
  250. package/estruturas/index.js +25 -25
  251. package/estruturas/metodo-primitiva.d.ts +28 -28
  252. package/estruturas/metodo-primitiva.js +40 -40
  253. package/estruturas/modulo.d.ts +18 -18
  254. package/estruturas/modulo.js +24 -24
  255. package/estruturas/objeto-delegua-classe.d.ts +26 -26
  256. package/estruturas/objeto-delegua-classe.js +53 -53
  257. package/estruturas/objeto-delegua-classe.js.map +1 -1
  258. package/estruturas/objeto-padrao.d.ts +18 -18
  259. package/estruturas/objeto-padrao.js +32 -32
  260. package/estruturas/objeto-padrao.js.map +1 -1
  261. package/excecoes/erro-em-tempo-de-execucao.d.ts +7 -7
  262. package/excecoes/erro-em-tempo-de-execucao.js +13 -13
  263. package/excecoes/index.d.ts +1 -1
  264. package/excecoes/index.js +17 -17
  265. package/formatadores/formatador-delegua.d.ts +79 -79
  266. package/formatadores/formatador-delegua.js +676 -676
  267. package/formatadores/formatador-delegua.js.map +1 -1
  268. package/formatadores/index.d.ts +1 -1
  269. package/formatadores/index.js +17 -17
  270. package/geracao-identificadores/index.d.ts +1 -1
  271. package/geracao-identificadores/index.js +22 -23
  272. package/geracao-identificadores/index.js.map +1 -1
  273. package/index.d.ts +9 -9
  274. package/index.js +27 -27
  275. package/interfaces/analisador-semantico-interface.d.ts +6 -6
  276. package/interfaces/analisador-semantico-interface.js +2 -2
  277. package/interfaces/avaliador-sintatico-interface.d.ts +55 -55
  278. package/interfaces/avaliador-sintatico-interface.js +2 -2
  279. package/interfaces/construtos/index.d.ts +4 -4
  280. package/interfaces/construtos/index.js +2 -2
  281. package/interfaces/erros/diagnostico-analisador-semantico.d.ts +14 -14
  282. package/interfaces/erros/diagnostico-analisador-semantico.js +10 -10
  283. package/interfaces/erros/diagnostico-analisador-semantico.js.map +1 -1
  284. package/interfaces/erros/erro-interpretador.d.ts +8 -8
  285. package/interfaces/erros/erro-interpretador.js +2 -2
  286. package/interfaces/erros/index.d.ts +1 -1
  287. package/interfaces/erros/index.js +17 -17
  288. package/interfaces/escopo-execucao.d.ts +12 -12
  289. package/interfaces/escopo-execucao.js +2 -2
  290. package/interfaces/formatador-comum-interface.d.ts +11 -11
  291. package/interfaces/formatador-comum-interface.js +2 -2
  292. package/interfaces/funcao-hipotetica-interface.d.ts +3 -3
  293. package/interfaces/funcao-hipotetica-interface.js +2 -2
  294. package/interfaces/index.d.ts +16 -16
  295. package/interfaces/index.js +32 -32
  296. package/interfaces/interpretador-com-depuracao-interface.d.ts +17 -17
  297. package/interfaces/interpretador-com-depuracao-interface.js +2 -2
  298. package/interfaces/interpretador-interface-potigol.d.ts +5 -5
  299. package/interfaces/interpretador-interface-potigol.js +2 -2
  300. package/interfaces/interpretador-interface.d.ts +20 -20
  301. package/interfaces/interpretador-interface.js +2 -2
  302. package/interfaces/lexador-interface.d.ts +23 -23
  303. package/interfaces/lexador-interface.js +2 -2
  304. package/interfaces/parametro-interface.d.ts +15 -15
  305. package/interfaces/parametro-interface.js +2 -2
  306. package/interfaces/pilha-escopos-execucao-interface.d.ts +26 -26
  307. package/interfaces/pilha-escopos-execucao-interface.js +2 -2
  308. package/interfaces/pilha-interface.d.ts +7 -7
  309. package/interfaces/pilha-interface.js +2 -2
  310. package/interfaces/resolvedor-interface.d.ts +41 -41
  311. package/interfaces/resolvedor-interface.js +2 -2
  312. package/interfaces/retornos/index.d.ts +4 -4
  313. package/interfaces/retornos/index.js +20 -20
  314. package/interfaces/retornos/retorno-analisador-semantico.d.ts +4 -4
  315. package/interfaces/retornos/retorno-analisador-semantico.js +2 -2
  316. package/interfaces/retornos/retorno-avaliador-sintatico.d.ts +5 -5
  317. package/interfaces/retornos/retorno-avaliador-sintatico.js +2 -2
  318. package/interfaces/retornos/retorno-execucao-interface.d.ts +5 -5
  319. package/interfaces/retornos/retorno-execucao-interface.js +2 -2
  320. package/interfaces/retornos/retorno-interpretador.d.ts +5 -5
  321. package/interfaces/retornos/retorno-interpretador.js +2 -2
  322. package/interfaces/retornos/retorno-lexador.d.ts +9 -9
  323. package/interfaces/retornos/retorno-lexador.js +2 -2
  324. package/interfaces/simbolo-interface.d.ts +7 -7
  325. package/interfaces/simbolo-interface.js +2 -2
  326. package/interfaces/tradutor-interface.d.ts +3 -3
  327. package/interfaces/tradutor-interface.js +2 -2
  328. package/interfaces/variavel-hipotetica-interface.d.ts +8 -8
  329. package/interfaces/variavel-hipotetica-interface.js +2 -2
  330. package/interfaces/variavel-interface.d.ts +8 -8
  331. package/interfaces/variavel-interface.js +2 -2
  332. package/interfaces/visitante-comum-interface.d.ts +58 -58
  333. package/interfaces/visitante-comum-interface.js +2 -2
  334. package/interpretador/argumento-interface.d.ts +4 -4
  335. package/interpretador/argumento-interface.js +2 -2
  336. package/interpretador/comum.d.ts +2 -2
  337. package/interpretador/comum.js +51 -52
  338. package/interpretador/comum.js.map +1 -1
  339. package/interpretador/dialetos/egua-classico/index.d.ts +1 -1
  340. package/interpretador/dialetos/egua-classico/index.js +17 -17
  341. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +119 -119
  342. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +815 -815
  343. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  344. package/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.d.ts +5 -5
  345. package/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.js +11 -11
  346. package/interpretador/dialetos/egua-classico/resolvedor/index.d.ts +3 -3
  347. package/interpretador/dialetos/egua-classico/resolvedor/index.js +19 -19
  348. package/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.d.ts +9 -9
  349. package/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.js +25 -25
  350. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +106 -106
  351. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +441 -441
  352. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  353. package/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.d.ts +6 -6
  354. package/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.js +2 -2
  355. package/interpretador/dialetos/index.d.ts +2 -2
  356. package/interpretador/dialetos/index.js +18 -18
  357. package/interpretador/dialetos/portugol-ipt/index.d.ts +1 -1
  358. package/interpretador/dialetos/portugol-ipt/index.js +17 -17
  359. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +133 -133
  360. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +501 -501
  361. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  362. package/interpretador/index.d.ts +3 -3
  363. package/interpretador/index.js +19 -19
  364. package/interpretador/inferenciador.d.ts +15 -15
  365. package/interpretador/inferenciador.d.ts.map +1 -1
  366. package/interpretador/inferenciador.js +80 -80
  367. package/interpretador/inferenciador.js.map +1 -1
  368. package/interpretador/interpretador-base.d.ts +268 -268
  369. package/interpretador/interpretador-base.js +1399 -1399
  370. package/interpretador/interpretador-base.js.map +1 -1
  371. package/interpretador/interpretador-com-depuracao.d.ts +190 -190
  372. package/interpretador/interpretador-com-depuracao.js +568 -568
  373. package/interpretador/interpretador-com-depuracao.js.map +1 -1
  374. package/interpretador/pilha-escopos-execucao.d.ts +39 -39
  375. package/interpretador/pilha-escopos-execucao.js +243 -243
  376. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  377. package/lexador/dialetos/index.d.ts +4 -4
  378. package/lexador/dialetos/index.js +20 -20
  379. package/lexador/dialetos/lexador-egua-classico.d.ts +36 -36
  380. package/lexador/dialetos/lexador-egua-classico.js +286 -286
  381. package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
  382. package/lexador/dialetos/lexador-guarani.d.ts +10 -10
  383. package/lexador/dialetos/lexador-guarani.js +113 -113
  384. package/lexador/dialetos/lexador-guarani.js.map +1 -1
  385. package/lexador/dialetos/lexador-pitugues.d.ts +51 -51
  386. package/lexador/dialetos/lexador-pitugues.js +398 -398
  387. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  388. package/lexador/dialetos/lexador-portugol-ipt.d.ts +33 -33
  389. package/lexador/dialetos/lexador-portugol-ipt.js +237 -237
  390. package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
  391. package/lexador/dialetos/palavras-reservadas/egua-classico.d.ts +32 -32
  392. package/lexador/dialetos/palavras-reservadas/egua-classico.js +39 -39
  393. package/lexador/dialetos/palavras-reservadas/guarani.d.ts +3 -3
  394. package/lexador/dialetos/palavras-reservadas/guarani.js +10 -10
  395. package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +13 -13
  396. package/lexador/dialetos/palavras-reservadas/portugol-ipt.js +20 -20
  397. package/lexador/dialetos/palavras-reservadas/rantiaquin.d.ts +1 -1
  398. package/lexador/dialetos/palavras-reservadas/rantiaquin.js +4 -4
  399. package/lexador/dialetos/pragma.d.ts +8 -8
  400. package/lexador/dialetos/pragma.js +2 -2
  401. package/lexador/erro-lexador.d.ts +5 -5
  402. package/lexador/erro-lexador.js +2 -2
  403. package/lexador/index.d.ts +4 -4
  404. package/lexador/index.js +20 -20
  405. package/lexador/lexador-base-linha-unica.d.ts +28 -28
  406. package/lexador/lexador-base-linha-unica.js +82 -82
  407. package/lexador/lexador-base-linha-unica.js.map +1 -1
  408. package/lexador/lexador-base.d.ts +41 -41
  409. package/lexador/lexador-base.js +112 -112
  410. package/lexador/lexador-base.js.map +1 -1
  411. package/lexador/lexador.d.ts +43 -43
  412. package/lexador/lexador.js +440 -440
  413. package/lexador/lexador.js.map +1 -1
  414. package/lexador/micro-lexador.d.ts +29 -29
  415. package/lexador/micro-lexador.js +207 -207
  416. package/lexador/micro-lexador.js.map +1 -1
  417. package/lexador/palavras-reservadas.d.ts +54 -54
  418. package/lexador/palavras-reservadas.js +61 -61
  419. package/lexador/simbolo.d.ts +10 -10
  420. package/lexador/simbolo.js +16 -16
  421. package/lexador/traducao/lexador-javascript.d.ts +28 -28
  422. package/lexador/traducao/lexador-javascript.js +58 -58
  423. package/package.json +5 -4
  424. package/quebras/index.d.ts +10 -10
  425. package/quebras/index.js +19 -19
  426. package/tipo-dados-elementar.d.ts +1 -1
  427. package/tipo-dados-elementar.js +2 -2
  428. package/tipos-de-dados/delegua.d.ts +18 -18
  429. package/tipos-de-dados/delegua.js +19 -19
  430. package/tipos-de-dados/listas-delegua.d.ts +6 -6
  431. package/tipos-de-dados/listas-delegua.js +7 -7
  432. package/tipos-de-dados/listas-primitivos.d.ts +5 -5
  433. package/tipos-de-dados/listas-primitivos.js +6 -6
  434. package/tipos-de-dados/primitivos.d.ts +16 -16
  435. package/tipos-de-dados/primitivos.js +17 -17
  436. package/tipos-de-simbolos/comum.d.ts +23 -23
  437. package/tipos-de-simbolos/comum.js +24 -24
  438. package/tipos-de-simbolos/delegua.d.ts +91 -91
  439. package/tipos-de-simbolos/delegua.js +92 -92
  440. package/tipos-de-simbolos/egua-classico.d.ts +75 -75
  441. package/tipos-de-simbolos/egua-classico.js +76 -76
  442. package/tipos-de-simbolos/guarani.d.ts +14 -14
  443. package/tipos-de-simbolos/guarani.js +15 -15
  444. package/tipos-de-simbolos/guarani.js.map +1 -1
  445. package/tipos-de-simbolos/microgramaticas/delegua.d.ts +46 -46
  446. package/tipos-de-simbolos/microgramaticas/delegua.js +47 -47
  447. package/tipos-de-simbolos/pitugues.d.ts +75 -75
  448. package/tipos-de-simbolos/pitugues.js +76 -76
  449. package/tipos-de-simbolos/portugol-ipt.d.ts +36 -36
  450. package/tipos-de-simbolos/portugol-ipt.js +37 -37
  451. package/tipos-de-simbolos/rantiaquin.d.ts +2 -2
  452. package/tipos-de-simbolos/rantiaquin.js +3 -3
  453. package/tradutores/dicionarios/dicionario-delegua-javascript.d.ts +2 -2
  454. package/tradutores/dicionarios/dicionario-delegua-javascript.js +10 -10
  455. package/tradutores/dicionarios/index.d.ts +1 -1
  456. package/tradutores/dicionarios/index.js +17 -17
  457. package/tradutores/index.d.ts +6 -6
  458. package/tradutores/index.js +22 -22
  459. package/tradutores/python/python3-lexer.d.ts +152 -152
  460. package/tradutores/python/python3-lexer.js +1227 -1227
  461. package/tradutores/python/python3-lexer.js.map +1 -1
  462. package/tradutores/python/python3-listener.d.ts +964 -964
  463. package/tradutores/python/python3-listener.js +3 -3
  464. package/tradutores/python/python3-parser.d.ts +1342 -1342
  465. package/tradutores/python/python3-parser.js +11226 -11226
  466. package/tradutores/python/python3-parser.js.map +1 -1
  467. package/tradutores/python/python3-visitor.d.ts +619 -619
  468. package/tradutores/python/python3-visitor.js +3 -3
  469. package/tradutores/tradutor-assembly-x64.d.ts +19 -19
  470. package/tradutores/tradutor-assembly-x64.js +128 -128
  471. package/tradutores/tradutor-assembly-x64.js.map +1 -1
  472. package/tradutores/tradutor-assemblyscript.d.ts +91 -91
  473. package/tradutores/tradutor-assemblyscript.js +590 -590
  474. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  475. package/tradutores/tradutor-javascript.d.ts +95 -95
  476. package/tradutores/tradutor-javascript.js +577 -577
  477. package/tradutores/tradutor-javascript.js.map +1 -1
  478. package/tradutores/tradutor-portugol-ipt.d.ts +21 -21
  479. package/tradutores/tradutor-portugol-ipt.js +60 -60
  480. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  481. package/tradutores/tradutor-python.d.ts +65 -65
  482. package/tradutores/tradutor-python.js +461 -461
  483. package/tradutores/tradutor-python.js.map +1 -1
  484. package/tradutores/tradutor-reverso-javascript.d.ts +50 -50
  485. package/tradutores/tradutor-reverso-javascript.js +392 -392
  486. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  487. package/tradutores/tradutor-reverso-python.d.ts +32 -32
  488. package/tradutores/tradutor-reverso-python.js +71 -71
  489. package/tradutores/tradutor-reverso-python.js.map +1 -1
  490. package/umd/delegua.js +26337 -26340
@@ -1,569 +1,569 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.InterpretadorComDepuracao = void 0;
7
- const lodash_1 = __importDefault(require("lodash"));
8
- const espaco_variaveis_1 = require("../espaco-variaveis");
9
- const declaracoes_1 = require("../declaracoes");
10
- const quebras_1 = require("../quebras");
11
- const inferenciador_1 = require("./inferenciador");
12
- const interpretador_base_1 = require("./interpretador-base");
13
- /**
14
- * Implementação do Interpretador com suporte a depuração.
15
- * Herda o Interpretador padrão de Delégua e implementa métodos a mais, que são
16
- * usados pelo servidor de depuração.
17
- * Alguns métodos do Interpretador original, como `executarBloco` e `interpretar`,
18
- * são reimplementados aqui.
19
- *
20
- * A separação entre `Interpretador` e `InterpretadorComDepuracao` se faz
21
- * necessária por uma série de motivos.
22
- * O primeiro deles é o desempenho. A depuração torna o desempenho do
23
- * Interpretador com depuração inferior ao Interpretador original pelas
24
- * várias verificações de controle que precisam ser feitas para a
25
- * funcionalidade do suporte a depuração, como verificar pontos de parada,
26
- * estados da pilha de execução e variáveis.
27
- * O segundo deles é manter o Interpretador original tão simples quanto possível.
28
- * Uma implementação mais simples normalmente é mais robusta.
29
- * O terceiro deles é o uso de memória. O Interpretador original não possui
30
- * uma série de variáveis implementadas aqui, o que o torna mais econômico em
31
- * recursos de máquina.
32
- */
33
- class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
34
- constructor(diretorioBase, funcaoDeRetorno, funcaoDeRetornoMesmaLinha) {
35
- super(diretorioBase, false, funcaoDeRetorno, funcaoDeRetornoMesmaLinha);
36
- this.pontosParada = [];
37
- this.pontoDeParadaAtivo = false;
38
- this.avisoPontoParadaAtivado = () => console.log('Aviso: Ponto de parada ativado.');
39
- this.escopoAtual = 0;
40
- this.executandoChamada = false;
41
- this.passos = 0;
42
- }
43
- /**
44
- * Quando um construto ou declaração possui id, significa que o interpretador
45
- * deve resolver a avaliação e guardar seu valor até o final do escopo.
46
- * Isso serve para quando a linguagem está em modo de depuração, e o contexto
47
- * da execução deixa de existir com um ponto de parada, por exemplo.
48
- * @param expressao A expressão a ser avaliada.
49
- * @returns O resultado da avaliação.
50
- */
51
- async avaliar(expressao) {
52
- if (expressao.hasOwnProperty('id')) {
53
- const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
54
- const idChamadaComArgumentos = await this.gerarIdResolucaoChamada(expressao);
55
- if (escopoAtual.ambiente.resolucoesChamadas.hasOwnProperty(idChamadaComArgumentos)) {
56
- return escopoAtual.ambiente.resolucoesChamadas[idChamadaComArgumentos];
57
- }
58
- }
59
- return await expressao.aceitar(this);
60
- }
61
- /**
62
- * Resolve problema de literais que tenham vírgulas, e confundem a resolução de chamadas.
63
- * @param valor O valor do argumento, que pode ser um literal com virgulas.
64
- * @returns Uma string com vírgulas escapadas.
65
- */
66
- escaparVirgulas(valor) {
67
- return String(valor).replace(/,/i, ',');
68
- }
69
- /**
70
- * Gera um identificador para resolução de chamadas.
71
- * Usado para não chamar funções repetidamente quando usando instruções
72
- * de passo, como "próximo" ou "adentrar-escopo".
73
- * @param expressao A expressão de chamada.
74
- * @returns Uma `Promise` que resolve como `string`.
75
- */
76
- async gerarIdResolucaoChamada(expressao) {
77
- const argumentosResolvidos = [];
78
- if (expressao.argumentos && expressao.argumentos.length > 0) {
79
- for (let argumento of expressao.argumentos) {
80
- if (argumento instanceof declaracoes_1.Leia || argumento instanceof declaracoes_1.LeiaMultiplo) {
81
- argumentosResolvidos.push(`leia_${argumento.id}`);
82
- }
83
- else {
84
- argumentosResolvidos.push(await this.avaliar(argumento));
85
- }
86
- }
87
- }
88
- return argumentosResolvidos.reduce((acumulador, argumento) => (acumulador += `,${this.escaparVirgulas(argumento.hasOwnProperty('valor') ? argumento.valor : argumento)}`), expressao.id);
89
- }
90
- async visitarExpressaoDeChamada(expressao) {
91
- const _idChamadaComArgumentos = await this.gerarIdResolucaoChamada(expressao);
92
- // Usado na abertura do bloco de escopo da chamada.
93
- this.idChamadaAtual = _idChamadaComArgumentos;
94
- this.executandoChamada = true;
95
- this.proximoEscopo = 'funcao';
96
- const retorno = await super.visitarExpressaoDeChamada(expressao);
97
- this.executandoChamada = false;
98
- const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
99
- escopoAtual.ambiente.resolucoesChamadas[_idChamadaComArgumentos] = retorno;
100
- return retorno;
101
- }
102
- async visitarDeclaracaoEnquanto(declaracao) {
103
- const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
104
- switch (this.comando) {
105
- case 'proximo':
106
- if (this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
107
- escopoAtual.emLacoRepeticao = true;
108
- return this.executarBloco(declaracao.corpo.declaracoes);
109
- }
110
- escopoAtual.emLacoRepeticao = false;
111
- return null;
112
- default:
113
- let retornoExecucao;
114
- while (!(retornoExecucao instanceof quebras_1.Quebra) &&
115
- !this.pontoDeParadaAtivo &&
116
- this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
117
- escopoAtual.emLacoRepeticao = true;
118
- try {
119
- retornoExecucao = await this.executar(declaracao.corpo);
120
- if (retornoExecucao instanceof quebras_1.SustarQuebra) {
121
- return null;
122
- }
123
- if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
124
- retornoExecucao = null;
125
- }
126
- }
127
- catch (erro) {
128
- return Promise.reject(erro);
129
- }
130
- }
131
- escopoAtual.emLacoRepeticao = false;
132
- return retornoExecucao;
133
- }
134
- }
135
- async avaliarArgumentosEscreva(argumentos) {
136
- let formatoTexto = '';
137
- for (const argumento of argumentos) {
138
- const resultadoAvaliacao = await this.avaliar(argumento);
139
- let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor')) ? resultadoAvaliacao.valor : resultadoAvaliacao;
140
- formatoTexto += `${this.paraTexto(valor)} `;
141
- }
142
- return formatoTexto.trimEnd();
143
- }
144
- /**
145
- * Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
146
- * alguma função para escrever numa página Web.
147
- * Se ponto de parada foi ativado durante a avaliação de argumentos, não escreve.
148
- * @param declaracao A declaração.
149
- * @returns Sempre nulo, por convenção de visita.
150
- */
151
- async visitarDeclaracaoEscreva(declaracao) {
152
- try {
153
- const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
154
- if (this.pontoDeParadaAtivo) {
155
- return null;
156
- }
157
- this.funcaoDeRetorno(formatoTexto);
158
- return null;
159
- }
160
- catch (erro) {
161
- this.erros.push({
162
- erroInterno: erro,
163
- linha: declaracao.linha,
164
- hashArquivo: declaracao.hashArquivo,
165
- });
166
- }
167
- }
168
- async visitarDeclaracaoPara(declaracao) {
169
- // Aqui precisamos clonar a declaração porque modificamos
170
- // algumas propriedades que indicam o estado da execução dela.
171
- // Por exemplo, se chamamos uma função que tem dentro dela um bloco Para,
172
- // cada execução do bloco precisa de uma inicialização diferente.
173
- const cloneDeclaracao = lodash_1.default.cloneDeep(declaracao);
174
- const corpoExecucao = cloneDeclaracao.corpo;
175
- const declaracaoInicializador = Array.isArray(cloneDeclaracao.inicializador)
176
- ? declaracao.inicializador[0]
177
- : declaracao.inicializador;
178
- if (declaracaoInicializador !== null) {
179
- await this.avaliar(declaracaoInicializador);
180
- // O incremento vai ao final do bloco de escopo.
181
- if (cloneDeclaracao.incrementar !== null) {
182
- corpoExecucao.declaracoes.push(cloneDeclaracao.incrementar);
183
- }
184
- }
185
- cloneDeclaracao.inicializada = true;
186
- const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
187
- switch (this.comando) {
188
- case 'proximo':
189
- if (cloneDeclaracao.condicao !== null && this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
190
- escopoAtual.emLacoRepeticao = true;
191
- const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes);
192
- return resultadoBloco;
193
- }
194
- escopoAtual.emLacoRepeticao = false;
195
- return null;
196
- default:
197
- let retornoExecucao;
198
- while (!(retornoExecucao instanceof quebras_1.Quebra) && !this.pontoDeParadaAtivo) {
199
- if (cloneDeclaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
200
- break;
201
- }
202
- try {
203
- retornoExecucao = await this.executar(corpoExecucao);
204
- if (retornoExecucao instanceof quebras_1.SustarQuebra) {
205
- return null;
206
- }
207
- if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
208
- retornoExecucao = null;
209
- }
210
- }
211
- catch (erro) {
212
- return Promise.reject(erro);
213
- }
214
- }
215
- // escopoAtual.emLacoRepeticao = false;
216
- return retornoExecucao;
217
- }
218
- }
219
- /**
220
- * Ao executar um retorno, manter o valor retornado no Interpretador para
221
- * uso por linhas que foram executadas com o comando `próximo` do depurador.
222
- * @param declaracao Uma declaracao Retorna
223
- * @returns O resultado da execução da visita.
224
- */
225
- async visitarExpressaoRetornar(declaracao) {
226
- const retorno = await super.visitarExpressaoRetornar(declaracao);
227
- // O escopo atual é marcado como finalizado, para notificar a
228
- // instrução de que deve ser descartado.
229
- const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
230
- escopoAtual.finalizado = true;
231
- // Acha o primeiro escopo de função.
232
- const escopoFuncao = this.pilhaEscoposExecucao.obterEscopoPorTipo('funcao');
233
- if (escopoFuncao === undefined) {
234
- return Promise.reject('retorna() chamado fora de execução de função.');
235
- }
236
- if (escopoFuncao.idChamada !== undefined) {
237
- escopoAtual.ambiente.resolucoesChamadas[escopoFuncao.idChamada] =
238
- retorno && retorno.hasOwnProperty('valor') ? retorno.valor : retorno;
239
- }
240
- return retorno;
241
- }
242
- /**
243
- * Se bloco de execução já foi instanciado antes (por exemplo, quando há um ponto de parada e a
244
- * execução do código é retomada pelo depurador), retoma a execução do bloco do ponto em que havia parado.
245
- * Se bloco de execução ainda não foi instanciado, empilha declarações na pilha de escopos de execução,
246
- * cria um novo ambiente e executa as declarações empilhadas.
247
- * Se depurador comandou uma instrução 'adentrar-escopo', execução do bloco não ocorre, mas
248
- * ponteiros de escopo e execução são atualizados.
249
- * @param declaracoes Um vetor de declaracoes a ser executado.
250
- * @param ambiente O ambiente de execução quando houver, como parâmetros, argumentos, etc.
251
- */
252
- async executarBloco(declaracoes, ambiente) {
253
- // Se o escopo atual não é o último.
254
- if (this.escopoAtual < this.pilhaEscoposExecucao.elementos() - 1) {
255
- this.escopoAtual++;
256
- const proximoEscopo = this.pilhaEscoposExecucao.naPosicao(this.escopoAtual);
257
- let retornoExecucao;
258
- // Sempre executa a próxima instrução, mesmo que haja ponto de parada.
259
- retornoExecucao = await this.executar(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
260
- proximoEscopo.declaracaoAtual++;
261
- for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
262
- proximoEscopo.declaracaoAtual < proximoEscopo.declaracoes.length; proximoEscopo.declaracaoAtual++) {
263
- this.pontoDeParadaAtivo = this.verificarPontoParada(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
264
- if (this.pontoDeParadaAtivo) {
265
- this.avisoPontoParadaAtivado();
266
- break;
267
- }
268
- retornoExecucao = await this.executar(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
269
- // Um ponto de parada ativo pode ter vindo de um escopo mais interno.
270
- // Por isso verificamos outra parada aqui para evitar que
271
- // `this.declaracaoAtual` seja incrementado.
272
- if (this.pontoDeParadaAtivo) {
273
- this.avisoPontoParadaAtivado();
274
- break;
275
- }
276
- }
277
- this.pilhaEscoposExecucao.removerUltimo();
278
- this.escopoAtual--;
279
- return retornoExecucao;
280
- }
281
- else {
282
- this.abrirNovoBlocoEscopo(declaracoes, ambiente, this.proximoEscopo || 'outro');
283
- const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
284
- if (this.idChamadaAtual) {
285
- ultimoEscopo.idChamada = this.idChamadaAtual;
286
- this.idChamadaAtual = undefined;
287
- }
288
- this.proximoEscopo = undefined;
289
- if (this.comando !== 'adentrarEscopo') {
290
- return await this.executarUltimoEscopo();
291
- }
292
- }
293
- }
294
- /**
295
- * Para fins de depuração, verifica se há ponto de parada no mesmo pragma da declaração.
296
- * @param declaracao A declaração a ser executada.
297
- * @returns True quando execução deve parar. False caso contrário.
298
- */
299
- verificarPontoParada(declaracao) {
300
- const buscaPontoParada = this.pontosParada.filter((p) => p.hashArquivo === declaracao.hashArquivo && p.linha === declaracao.linha);
301
- if (buscaPontoParada.length > 0) {
302
- console.log(`Ponto de parada encontrado. Linha: ${declaracao.linha}.`);
303
- return true;
304
- }
305
- return false;
306
- }
307
- /**
308
- * No interpretador com depuração, este método é dividido em dois outros métodos privados:
309
- * - `this.executarUmPassoNoEscopo`, que executa apenas uma instrução e nada mais;
310
- * - `this.executarUltimoEscopoComandoContinuar`, que é a execução trivial de um escopo inteiro,
311
- * ou com todas as instruções, ou até encontrar um ponto de parada.
312
- * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
313
- * imediatamente abaixo.
314
- * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
315
- * verificar o ponto de parada na primeira execução.
316
- * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
317
- * @returns O retorno da execução.
318
- */
319
- async executarUltimoEscopo(manterAmbiente = false, naoVerificarPrimeiraExecucao = false) {
320
- switch (this.comando) {
321
- case 'adentrarEscopo':
322
- case 'proximo':
323
- if (!this.executandoChamada) {
324
- return this.executarUmPassoNoEscopo();
325
- }
326
- else {
327
- return this.executarUltimoEscopoComandoContinuar(manterAmbiente, naoVerificarPrimeiraExecucao);
328
- }
329
- default:
330
- return this.executarUltimoEscopoComandoContinuar(manterAmbiente, naoVerificarPrimeiraExecucao);
331
- }
332
- }
333
- descartarTodosEscoposFinalizados() {
334
- let i = this.pilhaEscoposExecucao.pilha.length - 1;
335
- while (i > 0) {
336
- let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
337
- if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length || ultimoEscopo.finalizado) {
338
- this.pilhaEscoposExecucao.removerUltimo();
339
- const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
340
- escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
341
- this.escopoAtual--;
342
- }
343
- else {
344
- break;
345
- }
346
- i--;
347
- }
348
- }
349
- descartarEscopoPorRetornoFuncao() {
350
- let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
351
- while (ultimoEscopo.tipo !== 'funcao') {
352
- this.pilhaEscoposExecucao.removerUltimo();
353
- const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
354
- escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
355
- this.escopoAtual--;
356
- ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
357
- }
358
- this.pilhaEscoposExecucao.removerUltimo();
359
- const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
360
- escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
361
- this.escopoAtual--;
362
- }
363
- async executarUmPassoNoEscopo() {
364
- const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
365
- let retornoExecucao;
366
- if (this.passos > 0) {
367
- this.passos--;
368
- retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
369
- if (!this.pontoDeParadaAtivo && !ultimoEscopo.emLacoRepeticao) {
370
- ultimoEscopo.declaracaoAtual++;
371
- }
372
- if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length || ultimoEscopo.finalizado) {
373
- if (retornoExecucao instanceof quebras_1.RetornoQuebra) {
374
- this.descartarEscopoPorRetornoFuncao();
375
- }
376
- else {
377
- this.descartarTodosEscoposFinalizados();
378
- }
379
- }
380
- if (this.pilhaEscoposExecucao.elementos() === 1) {
381
- this.finalizacaoDaExecucao();
382
- }
383
- }
384
- return retornoExecucao;
385
- }
386
- /**
387
- * Continua a interpretação parcial do último ponto em que parou.
388
- * Pode ser tanto o começo da execução inteira, ou pós comando do depurador
389
- * quando há um ponto de parada.
390
- * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
391
- * imediatamente abaixo.
392
- * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
393
- * verificar o ponto de parada na primeira execução.
394
- * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
395
- * @returns Um objeto de retorno, com erros encontrados se houverem.
396
- */
397
- async executarUltimoEscopoComandoContinuar(manterAmbiente = false, naoVerificarPrimeiraExecucao = false) {
398
- const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
399
- let retornoExecucao;
400
- try {
401
- for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
402
- if (naoVerificarPrimeiraExecucao) {
403
- naoVerificarPrimeiraExecucao = false;
404
- }
405
- else {
406
- this.pontoDeParadaAtivo = this.verificarPontoParada(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
407
- if (this.pontoDeParadaAtivo) {
408
- this.avisoPontoParadaAtivado();
409
- break;
410
- }
411
- }
412
- retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
413
- // Um ponto de parada ativo pode ter vindo de um escopo mais interno.
414
- // Por isso verificamos outra parada aqui para evitar que
415
- // `this.declaracaoAtual` seja incrementado.
416
- if (this.pontoDeParadaAtivo) {
417
- this.avisoPontoParadaAtivado();
418
- break;
419
- }
420
- }
421
- return retornoExecucao;
422
- }
423
- catch (erro) {
424
- this.erros.push(erro);
425
- }
426
- finally {
427
- if (!this.pontoDeParadaAtivo && this.comando !== 'adentrarEscopo') {
428
- this.pilhaEscoposExecucao.removerUltimo();
429
- const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
430
- escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
431
- if (manterAmbiente) {
432
- escopoAnterior.ambiente.valores = Object.assign(escopoAnterior.ambiente.valores, ultimoEscopo.ambiente.valores);
433
- }
434
- this.escopoAtual--;
435
- }
436
- if (this.pilhaEscoposExecucao.elementos() === 1) {
437
- this.finalizacaoDaExecucao();
438
- }
439
- }
440
- }
441
- /**
442
- * Continua a interpretação, conforme comando do depurador.
443
- * Quando um ponto de parada é ativado, a pilha de execução do TypeScript é perdida.
444
- * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
445
- * primeiro escopo, subindo até o último elemento executado do último escopo.
446
- * Se entre escopos houver ponto de parada ativo, a execução é suspensa até o próximo comando
447
- * do desenvolvedor.
448
- * @see executarUltimoEscopo
449
- */
450
- async instrucaoContinuarInterpretacao(escopo = 1) {
451
- let retornoExecucao;
452
- if (escopo < this.escopoAtual) {
453
- retornoExecucao = await this.instrucaoContinuarInterpretacao(escopo + 1);
454
- }
455
- if (this.pontoDeParadaAtivo) {
456
- return;
457
- }
458
- await this.executarUltimoEscopoComandoContinuar(false, true);
459
- }
460
- /**
461
- * Empilha um escopo se for possível.
462
- * Se não for, apenas executa a instrução corrente.
463
- */
464
- async adentrarEscopo() {
465
- throw new Error('Método não implementado.');
466
- }
467
- /**
468
- * Interpreta apenas uma instrução a partir do ponto de parada ativo, conforme comando do depurador.
469
- * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
470
- * primeiro escopo, subindo até o último elemento executado do último escopo.
471
- * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
472
- */
473
- async instrucaoPasso(escopo = 1) {
474
- this.passos = 1;
475
- const escopoVisitado = this.pilhaEscoposExecucao.naPosicao(escopo);
476
- if (escopo < this.escopoAtual) {
477
- await this.instrucaoPasso(escopo + 1);
478
- }
479
- else {
480
- if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length || escopoVisitado.finalizado) {
481
- this.pilhaEscoposExecucao.removerUltimo();
482
- }
483
- if (this.pilhaEscoposExecucao.elementos() === 1) {
484
- return this.finalizacaoDaExecucao();
485
- }
486
- await this.executarUmPassoNoEscopo();
487
- }
488
- }
489
- /**
490
- * Interpreta restante do bloco de execução em que o ponto de parada está, conforme comando do depurador.
491
- * Se houver outros pontos de parada no mesmo escopo à frente da instrução atual, todos são ignorados.
492
- * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
493
- */
494
- async instrucaoProximoESair() {
495
- this.executarUltimoEscopoComandoContinuar(false, true);
496
- }
497
- /**
498
- * Prepara a pilha de escopos para uma situação de depuração.
499
- * Não há execução de código neste caso.
500
- * @param declaracoes Um vetor de declarações.
501
- */
502
- prepararParaDepuracao(declaracoes) {
503
- this.declaracoes = declaracoes;
504
- this.abrirNovoBlocoEscopo(declaracoes);
505
- }
506
- abrirNovoBlocoEscopo(declaracoes, ambiente, tipoEscopo = 'outro') {
507
- const escopoExecucao = {
508
- declaracoes: declaracoes,
509
- declaracaoAtual: 0,
510
- ambiente: ambiente || new espaco_variaveis_1.EspacoVariaveis(),
511
- finalizado: false,
512
- tipo: tipoEscopo,
513
- emLacoRepeticao: false,
514
- };
515
- this.pilhaEscoposExecucao.empilhar(escopoExecucao);
516
- this.escopoAtual++;
517
- }
518
- /**
519
- * Reimplementando este método aqui porque a execução por depuração não requer
520
- * mostrar o resultado em momento algum, ou lidar com o retorno.
521
- * @param declaracao A declaracao a ser executada.
522
- * @param mostrarResultado Sempre falso.
523
- * @returns O resultado da execução.
524
- */
525
- async executar(declaracao, mostrarResultado = false) {
526
- return await declaracao.aceitar(this);
527
- }
528
- /**
529
- * Interpretação utilizada pelo depurador para avaliar valores de variáveis.
530
- * Diferentemente da interpretação tradicional, não possui indicadores
531
- * de performance porque eles não fazem sentido aqui.
532
- * @param declaracoes Um vetor de declarações.
533
- * @returns Um objeto de retorno, com erros encontrados se houverem.
534
- */
535
- async interpretar(declaracoes, manterAmbiente = false) {
536
- this.erros = [];
537
- this.declaracoes = declaracoes;
538
- this.abrirNovoBlocoEscopo(declaracoes);
539
- const resultado = await super.executarUltimoEscopo(manterAmbiente);
540
- // Corrigir contador de escopos
541
- this.escopoAtual--;
542
- const retorno = {
543
- erros: this.erros,
544
- // resultado: this.resultadoInterpretador // Removido para simplificar `this.executar()`.
545
- resultado: [resultado],
546
- };
547
- this.resultadoInterpretador = [];
548
- return retorno;
549
- }
550
- /**
551
- * Obtém o valor de uma variável por nome.
552
- * Em versões anteriores, o mecanismo de avaliação fazia toda a avaliação tradicional,
553
- * passando por Lexador, Avaliador Sintático e Interpretador.
554
- * Isso tem sua cota de problemas, sobretudo porque a avaliação insere e descarta escopos,
555
- * entrando em condição de corrida com a interpretação com depuração.
556
- * @param nome O nome da variável.
557
- */
558
- obterVariavel(nome) {
559
- const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({ lexema: nome });
560
- return valorOuVariavel.hasOwnProperty('valor')
561
- ? valorOuVariavel
562
- : {
563
- valor: valorOuVariavel,
564
- tipo: (0, inferenciador_1.inferirTipoVariavel)(valorOuVariavel),
565
- };
566
- }
567
- }
568
- exports.InterpretadorComDepuracao = InterpretadorComDepuracao;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InterpretadorComDepuracao = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const espaco_variaveis_1 = require("../espaco-variaveis");
9
+ const declaracoes_1 = require("../declaracoes");
10
+ const quebras_1 = require("../quebras");
11
+ const inferenciador_1 = require("./inferenciador");
12
+ const interpretador_base_1 = require("./interpretador-base");
13
+ /**
14
+ * Implementação do Interpretador com suporte a depuração.
15
+ * Herda o Interpretador padrão de Delégua e implementa métodos a mais, que são
16
+ * usados pelo servidor de depuração.
17
+ * Alguns métodos do Interpretador original, como `executarBloco` e `interpretar`,
18
+ * são reimplementados aqui.
19
+ *
20
+ * A separação entre `Interpretador` e `InterpretadorComDepuracao` se faz
21
+ * necessária por uma série de motivos.
22
+ * O primeiro deles é o desempenho. A depuração torna o desempenho do
23
+ * Interpretador com depuração inferior ao Interpretador original pelas
24
+ * várias verificações de controle que precisam ser feitas para a
25
+ * funcionalidade do suporte a depuração, como verificar pontos de parada,
26
+ * estados da pilha de execução e variáveis.
27
+ * O segundo deles é manter o Interpretador original tão simples quanto possível.
28
+ * Uma implementação mais simples normalmente é mais robusta.
29
+ * O terceiro deles é o uso de memória. O Interpretador original não possui
30
+ * uma série de variáveis implementadas aqui, o que o torna mais econômico em
31
+ * recursos de máquina.
32
+ */
33
+ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
34
+ constructor(diretorioBase, funcaoDeRetorno, funcaoDeRetornoMesmaLinha) {
35
+ super(diretorioBase, false, funcaoDeRetorno, funcaoDeRetornoMesmaLinha);
36
+ this.pontosParada = [];
37
+ this.pontoDeParadaAtivo = false;
38
+ this.avisoPontoParadaAtivado = () => console.log('Aviso: Ponto de parada ativado.');
39
+ this.escopoAtual = 0;
40
+ this.executandoChamada = false;
41
+ this.passos = 0;
42
+ }
43
+ /**
44
+ * Quando um construto ou declaração possui id, significa que o interpretador
45
+ * deve resolver a avaliação e guardar seu valor até o final do escopo.
46
+ * Isso serve para quando a linguagem está em modo de depuração, e o contexto
47
+ * da execução deixa de existir com um ponto de parada, por exemplo.
48
+ * @param expressao A expressão a ser avaliada.
49
+ * @returns O resultado da avaliação.
50
+ */
51
+ async avaliar(expressao) {
52
+ if (expressao.hasOwnProperty('id')) {
53
+ const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
54
+ const idChamadaComArgumentos = await this.gerarIdResolucaoChamada(expressao);
55
+ if (escopoAtual.ambiente.resolucoesChamadas.hasOwnProperty(idChamadaComArgumentos)) {
56
+ return escopoAtual.ambiente.resolucoesChamadas[idChamadaComArgumentos];
57
+ }
58
+ }
59
+ return await expressao.aceitar(this);
60
+ }
61
+ /**
62
+ * Resolve problema de literais que tenham vírgulas, e confundem a resolução de chamadas.
63
+ * @param valor O valor do argumento, que pode ser um literal com virgulas.
64
+ * @returns Uma string com vírgulas escapadas.
65
+ */
66
+ escaparVirgulas(valor) {
67
+ return String(valor).replace(/,/i, ',');
68
+ }
69
+ /**
70
+ * Gera um identificador para resolução de chamadas.
71
+ * Usado para não chamar funções repetidamente quando usando instruções
72
+ * de passo, como "próximo" ou "adentrar-escopo".
73
+ * @param expressao A expressão de chamada.
74
+ * @returns Uma `Promise` que resolve como `string`.
75
+ */
76
+ async gerarIdResolucaoChamada(expressao) {
77
+ const argumentosResolvidos = [];
78
+ if (expressao.argumentos && expressao.argumentos.length > 0) {
79
+ for (let argumento of expressao.argumentos) {
80
+ if (argumento instanceof declaracoes_1.Leia || argumento instanceof declaracoes_1.LeiaMultiplo) {
81
+ argumentosResolvidos.push(`leia_${argumento.id}`);
82
+ }
83
+ else {
84
+ argumentosResolvidos.push(await this.avaliar(argumento));
85
+ }
86
+ }
87
+ }
88
+ return argumentosResolvidos.reduce((acumulador, argumento) => (acumulador += `,${this.escaparVirgulas(argumento.hasOwnProperty('valor') ? argumento.valor : argumento)}`), expressao.id);
89
+ }
90
+ async visitarExpressaoDeChamada(expressao) {
91
+ const _idChamadaComArgumentos = await this.gerarIdResolucaoChamada(expressao);
92
+ // Usado na abertura do bloco de escopo da chamada.
93
+ this.idChamadaAtual = _idChamadaComArgumentos;
94
+ this.executandoChamada = true;
95
+ this.proximoEscopo = 'funcao';
96
+ const retorno = await super.visitarExpressaoDeChamada(expressao);
97
+ this.executandoChamada = false;
98
+ const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
99
+ escopoAtual.ambiente.resolucoesChamadas[_idChamadaComArgumentos] = retorno;
100
+ return retorno;
101
+ }
102
+ async visitarDeclaracaoEnquanto(declaracao) {
103
+ const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
104
+ switch (this.comando) {
105
+ case 'proximo':
106
+ if (this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
107
+ escopoAtual.emLacoRepeticao = true;
108
+ return this.executarBloco(declaracao.corpo.declaracoes);
109
+ }
110
+ escopoAtual.emLacoRepeticao = false;
111
+ return null;
112
+ default:
113
+ let retornoExecucao;
114
+ while (!(retornoExecucao instanceof quebras_1.Quebra) &&
115
+ !this.pontoDeParadaAtivo &&
116
+ this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
117
+ escopoAtual.emLacoRepeticao = true;
118
+ try {
119
+ retornoExecucao = await this.executar(declaracao.corpo);
120
+ if (retornoExecucao instanceof quebras_1.SustarQuebra) {
121
+ return null;
122
+ }
123
+ if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
124
+ retornoExecucao = null;
125
+ }
126
+ }
127
+ catch (erro) {
128
+ return Promise.reject(erro);
129
+ }
130
+ }
131
+ escopoAtual.emLacoRepeticao = false;
132
+ return retornoExecucao;
133
+ }
134
+ }
135
+ async avaliarArgumentosEscreva(argumentos) {
136
+ let formatoTexto = '';
137
+ for (const argumento of argumentos) {
138
+ const resultadoAvaliacao = await this.avaliar(argumento);
139
+ let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor')) ? resultadoAvaliacao.valor : resultadoAvaliacao;
140
+ formatoTexto += `${this.paraTexto(valor)} `;
141
+ }
142
+ return formatoTexto.trimEnd();
143
+ }
144
+ /**
145
+ * Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
146
+ * alguma função para escrever numa página Web.
147
+ * Se ponto de parada foi ativado durante a avaliação de argumentos, não escreve.
148
+ * @param declaracao A declaração.
149
+ * @returns Sempre nulo, por convenção de visita.
150
+ */
151
+ async visitarDeclaracaoEscreva(declaracao) {
152
+ try {
153
+ const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
154
+ if (this.pontoDeParadaAtivo) {
155
+ return null;
156
+ }
157
+ this.funcaoDeRetorno(formatoTexto);
158
+ return null;
159
+ }
160
+ catch (erro) {
161
+ this.erros.push({
162
+ erroInterno: erro,
163
+ linha: declaracao.linha,
164
+ hashArquivo: declaracao.hashArquivo,
165
+ });
166
+ }
167
+ }
168
+ async visitarDeclaracaoPara(declaracao) {
169
+ // Aqui precisamos clonar a declaração porque modificamos
170
+ // algumas propriedades que indicam o estado da execução dela.
171
+ // Por exemplo, se chamamos uma função que tem dentro dela um bloco Para,
172
+ // cada execução do bloco precisa de uma inicialização diferente.
173
+ const cloneDeclaracao = lodash_1.default.cloneDeep(declaracao);
174
+ const corpoExecucao = cloneDeclaracao.corpo;
175
+ const declaracaoInicializador = Array.isArray(cloneDeclaracao.inicializador)
176
+ ? declaracao.inicializador[0]
177
+ : declaracao.inicializador;
178
+ if (declaracaoInicializador !== null) {
179
+ await this.avaliar(declaracaoInicializador);
180
+ // O incremento vai ao final do bloco de escopo.
181
+ if (cloneDeclaracao.incrementar !== null) {
182
+ corpoExecucao.declaracoes.push(cloneDeclaracao.incrementar);
183
+ }
184
+ }
185
+ cloneDeclaracao.inicializada = true;
186
+ const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
187
+ switch (this.comando) {
188
+ case 'proximo':
189
+ if (cloneDeclaracao.condicao !== null && this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
190
+ escopoAtual.emLacoRepeticao = true;
191
+ const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes);
192
+ return resultadoBloco;
193
+ }
194
+ escopoAtual.emLacoRepeticao = false;
195
+ return null;
196
+ default:
197
+ let retornoExecucao;
198
+ while (!(retornoExecucao instanceof quebras_1.Quebra) && !this.pontoDeParadaAtivo) {
199
+ if (cloneDeclaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
200
+ break;
201
+ }
202
+ try {
203
+ retornoExecucao = await this.executar(corpoExecucao);
204
+ if (retornoExecucao instanceof quebras_1.SustarQuebra) {
205
+ return null;
206
+ }
207
+ if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
208
+ retornoExecucao = null;
209
+ }
210
+ }
211
+ catch (erro) {
212
+ return Promise.reject(erro);
213
+ }
214
+ }
215
+ // escopoAtual.emLacoRepeticao = false;
216
+ return retornoExecucao;
217
+ }
218
+ }
219
+ /**
220
+ * Ao executar um retorno, manter o valor retornado no Interpretador para
221
+ * uso por linhas que foram executadas com o comando `próximo` do depurador.
222
+ * @param declaracao Uma declaracao Retorna
223
+ * @returns O resultado da execução da visita.
224
+ */
225
+ async visitarExpressaoRetornar(declaracao) {
226
+ const retorno = await super.visitarExpressaoRetornar(declaracao);
227
+ // O escopo atual é marcado como finalizado, para notificar a
228
+ // instrução de que deve ser descartado.
229
+ const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
230
+ escopoAtual.finalizado = true;
231
+ // Acha o primeiro escopo de função.
232
+ const escopoFuncao = this.pilhaEscoposExecucao.obterEscopoPorTipo('funcao');
233
+ if (escopoFuncao === undefined) {
234
+ return Promise.reject('retorna() chamado fora de execução de função.');
235
+ }
236
+ if (escopoFuncao.idChamada !== undefined) {
237
+ escopoAtual.ambiente.resolucoesChamadas[escopoFuncao.idChamada] =
238
+ retorno && retorno.hasOwnProperty('valor') ? retorno.valor : retorno;
239
+ }
240
+ return retorno;
241
+ }
242
+ /**
243
+ * Se bloco de execução já foi instanciado antes (por exemplo, quando há um ponto de parada e a
244
+ * execução do código é retomada pelo depurador), retoma a execução do bloco do ponto em que havia parado.
245
+ * Se bloco de execução ainda não foi instanciado, empilha declarações na pilha de escopos de execução,
246
+ * cria um novo ambiente e executa as declarações empilhadas.
247
+ * Se depurador comandou uma instrução 'adentrar-escopo', execução do bloco não ocorre, mas
248
+ * ponteiros de escopo e execução são atualizados.
249
+ * @param declaracoes Um vetor de declaracoes a ser executado.
250
+ * @param ambiente O ambiente de execução quando houver, como parâmetros, argumentos, etc.
251
+ */
252
+ async executarBloco(declaracoes, ambiente) {
253
+ // Se o escopo atual não é o último.
254
+ if (this.escopoAtual < this.pilhaEscoposExecucao.elementos() - 1) {
255
+ this.escopoAtual++;
256
+ const proximoEscopo = this.pilhaEscoposExecucao.naPosicao(this.escopoAtual);
257
+ let retornoExecucao;
258
+ // Sempre executa a próxima instrução, mesmo que haja ponto de parada.
259
+ retornoExecucao = await this.executar(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
260
+ proximoEscopo.declaracaoAtual++;
261
+ for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
262
+ proximoEscopo.declaracaoAtual < proximoEscopo.declaracoes.length; proximoEscopo.declaracaoAtual++) {
263
+ this.pontoDeParadaAtivo = this.verificarPontoParada(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
264
+ if (this.pontoDeParadaAtivo) {
265
+ this.avisoPontoParadaAtivado();
266
+ break;
267
+ }
268
+ retornoExecucao = await this.executar(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
269
+ // Um ponto de parada ativo pode ter vindo de um escopo mais interno.
270
+ // Por isso verificamos outra parada aqui para evitar que
271
+ // `this.declaracaoAtual` seja incrementado.
272
+ if (this.pontoDeParadaAtivo) {
273
+ this.avisoPontoParadaAtivado();
274
+ break;
275
+ }
276
+ }
277
+ this.pilhaEscoposExecucao.removerUltimo();
278
+ this.escopoAtual--;
279
+ return retornoExecucao;
280
+ }
281
+ else {
282
+ this.abrirNovoBlocoEscopo(declaracoes, ambiente, this.proximoEscopo || 'outro');
283
+ const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
284
+ if (this.idChamadaAtual) {
285
+ ultimoEscopo.idChamada = this.idChamadaAtual;
286
+ this.idChamadaAtual = undefined;
287
+ }
288
+ this.proximoEscopo = undefined;
289
+ if (this.comando !== 'adentrarEscopo') {
290
+ return await this.executarUltimoEscopo();
291
+ }
292
+ }
293
+ }
294
+ /**
295
+ * Para fins de depuração, verifica se há ponto de parada no mesmo pragma da declaração.
296
+ * @param declaracao A declaração a ser executada.
297
+ * @returns True quando execução deve parar. False caso contrário.
298
+ */
299
+ verificarPontoParada(declaracao) {
300
+ const buscaPontoParada = this.pontosParada.filter((p) => p.hashArquivo === declaracao.hashArquivo && p.linha === declaracao.linha);
301
+ if (buscaPontoParada.length > 0) {
302
+ console.log(`Ponto de parada encontrado. Linha: ${declaracao.linha}.`);
303
+ return true;
304
+ }
305
+ return false;
306
+ }
307
+ /**
308
+ * No interpretador com depuração, este método é dividido em dois outros métodos privados:
309
+ * - `this.executarUmPassoNoEscopo`, que executa apenas uma instrução e nada mais;
310
+ * - `this.executarUltimoEscopoComandoContinuar`, que é a execução trivial de um escopo inteiro,
311
+ * ou com todas as instruções, ou até encontrar um ponto de parada.
312
+ * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
313
+ * imediatamente abaixo.
314
+ * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
315
+ * verificar o ponto de parada na primeira execução.
316
+ * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
317
+ * @returns O retorno da execução.
318
+ */
319
+ async executarUltimoEscopo(manterAmbiente = false, naoVerificarPrimeiraExecucao = false) {
320
+ switch (this.comando) {
321
+ case 'adentrarEscopo':
322
+ case 'proximo':
323
+ if (!this.executandoChamada) {
324
+ return this.executarUmPassoNoEscopo();
325
+ }
326
+ else {
327
+ return this.executarUltimoEscopoComandoContinuar(manterAmbiente, naoVerificarPrimeiraExecucao);
328
+ }
329
+ default:
330
+ return this.executarUltimoEscopoComandoContinuar(manterAmbiente, naoVerificarPrimeiraExecucao);
331
+ }
332
+ }
333
+ descartarTodosEscoposFinalizados() {
334
+ let i = this.pilhaEscoposExecucao.pilha.length - 1;
335
+ while (i > 0) {
336
+ let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
337
+ if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length || ultimoEscopo.finalizado) {
338
+ this.pilhaEscoposExecucao.removerUltimo();
339
+ const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
340
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
341
+ this.escopoAtual--;
342
+ }
343
+ else {
344
+ break;
345
+ }
346
+ i--;
347
+ }
348
+ }
349
+ descartarEscopoPorRetornoFuncao() {
350
+ let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
351
+ while (ultimoEscopo.tipo !== 'funcao') {
352
+ this.pilhaEscoposExecucao.removerUltimo();
353
+ const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
354
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
355
+ this.escopoAtual--;
356
+ ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
357
+ }
358
+ this.pilhaEscoposExecucao.removerUltimo();
359
+ const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
360
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
361
+ this.escopoAtual--;
362
+ }
363
+ async executarUmPassoNoEscopo() {
364
+ const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
365
+ let retornoExecucao;
366
+ if (this.passos > 0) {
367
+ this.passos--;
368
+ retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
369
+ if (!this.pontoDeParadaAtivo && !ultimoEscopo.emLacoRepeticao) {
370
+ ultimoEscopo.declaracaoAtual++;
371
+ }
372
+ if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length || ultimoEscopo.finalizado) {
373
+ if (retornoExecucao instanceof quebras_1.RetornoQuebra) {
374
+ this.descartarEscopoPorRetornoFuncao();
375
+ }
376
+ else {
377
+ this.descartarTodosEscoposFinalizados();
378
+ }
379
+ }
380
+ if (this.pilhaEscoposExecucao.elementos() === 1) {
381
+ this.finalizacaoDaExecucao();
382
+ }
383
+ }
384
+ return retornoExecucao;
385
+ }
386
+ /**
387
+ * Continua a interpretação parcial do último ponto em que parou.
388
+ * Pode ser tanto o começo da execução inteira, ou pós comando do depurador
389
+ * quando há um ponto de parada.
390
+ * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
391
+ * imediatamente abaixo.
392
+ * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
393
+ * verificar o ponto de parada na primeira execução.
394
+ * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
395
+ * @returns Um objeto de retorno, com erros encontrados se houverem.
396
+ */
397
+ async executarUltimoEscopoComandoContinuar(manterAmbiente = false, naoVerificarPrimeiraExecucao = false) {
398
+ const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
399
+ let retornoExecucao;
400
+ try {
401
+ for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
402
+ if (naoVerificarPrimeiraExecucao) {
403
+ naoVerificarPrimeiraExecucao = false;
404
+ }
405
+ else {
406
+ this.pontoDeParadaAtivo = this.verificarPontoParada(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
407
+ if (this.pontoDeParadaAtivo) {
408
+ this.avisoPontoParadaAtivado();
409
+ break;
410
+ }
411
+ }
412
+ retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
413
+ // Um ponto de parada ativo pode ter vindo de um escopo mais interno.
414
+ // Por isso verificamos outra parada aqui para evitar que
415
+ // `this.declaracaoAtual` seja incrementado.
416
+ if (this.pontoDeParadaAtivo) {
417
+ this.avisoPontoParadaAtivado();
418
+ break;
419
+ }
420
+ }
421
+ return retornoExecucao;
422
+ }
423
+ catch (erro) {
424
+ this.erros.push(erro);
425
+ }
426
+ finally {
427
+ if (!this.pontoDeParadaAtivo && this.comando !== 'adentrarEscopo') {
428
+ this.pilhaEscoposExecucao.removerUltimo();
429
+ const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
430
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
431
+ if (manterAmbiente) {
432
+ escopoAnterior.ambiente.valores = Object.assign(escopoAnterior.ambiente.valores, ultimoEscopo.ambiente.valores);
433
+ }
434
+ this.escopoAtual--;
435
+ }
436
+ if (this.pilhaEscoposExecucao.elementos() === 1) {
437
+ this.finalizacaoDaExecucao();
438
+ }
439
+ }
440
+ }
441
+ /**
442
+ * Continua a interpretação, conforme comando do depurador.
443
+ * Quando um ponto de parada é ativado, a pilha de execução do TypeScript é perdida.
444
+ * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
445
+ * primeiro escopo, subindo até o último elemento executado do último escopo.
446
+ * Se entre escopos houver ponto de parada ativo, a execução é suspensa até o próximo comando
447
+ * do desenvolvedor.
448
+ * @see executarUltimoEscopo
449
+ */
450
+ async instrucaoContinuarInterpretacao(escopo = 1) {
451
+ let retornoExecucao;
452
+ if (escopo < this.escopoAtual) {
453
+ retornoExecucao = await this.instrucaoContinuarInterpretacao(escopo + 1);
454
+ }
455
+ if (this.pontoDeParadaAtivo) {
456
+ return;
457
+ }
458
+ await this.executarUltimoEscopoComandoContinuar(false, true);
459
+ }
460
+ /**
461
+ * Empilha um escopo se for possível.
462
+ * Se não for, apenas executa a instrução corrente.
463
+ */
464
+ async adentrarEscopo() {
465
+ throw new Error('Método não implementado.');
466
+ }
467
+ /**
468
+ * Interpreta apenas uma instrução a partir do ponto de parada ativo, conforme comando do depurador.
469
+ * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
470
+ * primeiro escopo, subindo até o último elemento executado do último escopo.
471
+ * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
472
+ */
473
+ async instrucaoPasso(escopo = 1) {
474
+ this.passos = 1;
475
+ const escopoVisitado = this.pilhaEscoposExecucao.naPosicao(escopo);
476
+ if (escopo < this.escopoAtual) {
477
+ await this.instrucaoPasso(escopo + 1);
478
+ }
479
+ else {
480
+ if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length || escopoVisitado.finalizado) {
481
+ this.pilhaEscoposExecucao.removerUltimo();
482
+ }
483
+ if (this.pilhaEscoposExecucao.elementos() === 1) {
484
+ return this.finalizacaoDaExecucao();
485
+ }
486
+ await this.executarUmPassoNoEscopo();
487
+ }
488
+ }
489
+ /**
490
+ * Interpreta restante do bloco de execução em que o ponto de parada está, conforme comando do depurador.
491
+ * Se houver outros pontos de parada no mesmo escopo à frente da instrução atual, todos são ignorados.
492
+ * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
493
+ */
494
+ async instrucaoProximoESair() {
495
+ this.executarUltimoEscopoComandoContinuar(false, true);
496
+ }
497
+ /**
498
+ * Prepara a pilha de escopos para uma situação de depuração.
499
+ * Não há execução de código neste caso.
500
+ * @param declaracoes Um vetor de declarações.
501
+ */
502
+ prepararParaDepuracao(declaracoes) {
503
+ this.declaracoes = declaracoes;
504
+ this.abrirNovoBlocoEscopo(declaracoes);
505
+ }
506
+ abrirNovoBlocoEscopo(declaracoes, ambiente, tipoEscopo = 'outro') {
507
+ const escopoExecucao = {
508
+ declaracoes: declaracoes,
509
+ declaracaoAtual: 0,
510
+ ambiente: ambiente || new espaco_variaveis_1.EspacoVariaveis(),
511
+ finalizado: false,
512
+ tipo: tipoEscopo,
513
+ emLacoRepeticao: false,
514
+ };
515
+ this.pilhaEscoposExecucao.empilhar(escopoExecucao);
516
+ this.escopoAtual++;
517
+ }
518
+ /**
519
+ * Reimplementando este método aqui porque a execução por depuração não requer
520
+ * mostrar o resultado em momento algum, ou lidar com o retorno.
521
+ * @param declaracao A declaracao a ser executada.
522
+ * @param mostrarResultado Sempre falso.
523
+ * @returns O resultado da execução.
524
+ */
525
+ async executar(declaracao, mostrarResultado = false) {
526
+ return await declaracao.aceitar(this);
527
+ }
528
+ /**
529
+ * Interpretação utilizada pelo depurador para avaliar valores de variáveis.
530
+ * Diferentemente da interpretação tradicional, não possui indicadores
531
+ * de performance porque eles não fazem sentido aqui.
532
+ * @param declaracoes Um vetor de declarações.
533
+ * @returns Um objeto de retorno, com erros encontrados se houverem.
534
+ */
535
+ async interpretar(declaracoes, manterAmbiente = false) {
536
+ this.erros = [];
537
+ this.declaracoes = declaracoes;
538
+ this.abrirNovoBlocoEscopo(declaracoes);
539
+ const resultado = await super.executarUltimoEscopo(manterAmbiente);
540
+ // Corrigir contador de escopos
541
+ this.escopoAtual--;
542
+ const retorno = {
543
+ erros: this.erros,
544
+ // resultado: this.resultadoInterpretador // Removido para simplificar `this.executar()`.
545
+ resultado: [resultado],
546
+ };
547
+ this.resultadoInterpretador = [];
548
+ return retorno;
549
+ }
550
+ /**
551
+ * Obtém o valor de uma variável por nome.
552
+ * Em versões anteriores, o mecanismo de avaliação fazia toda a avaliação tradicional,
553
+ * passando por Lexador, Avaliador Sintático e Interpretador.
554
+ * Isso tem sua cota de problemas, sobretudo porque a avaliação insere e descarta escopos,
555
+ * entrando em condição de corrida com a interpretação com depuração.
556
+ * @param nome O nome da variável.
557
+ */
558
+ obterVariavel(nome) {
559
+ const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({ lexema: nome });
560
+ return valorOuVariavel.hasOwnProperty('valor')
561
+ ? valorOuVariavel
562
+ : {
563
+ valor: valorOuVariavel,
564
+ tipo: (0, inferenciador_1.inferirTipoVariavel)(valorOuVariavel),
565
+ };
566
+ }
567
+ }
568
+ exports.InterpretadorComDepuracao = InterpretadorComDepuracao;
569
569
  //# sourceMappingURL=interpretador-com-depuracao.js.map