@designliquido/delegua 0.36.0 → 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 (491) 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 -10
  164. package/construtos/vetor.d.ts.map +1 -1
  165. package/construtos/vetor.js +21 -20
  166. package/construtos/vetor.js.map +1 -1
  167. package/declaracoes/aleatorio.d.ts +15 -15
  168. package/declaracoes/aleatorio.js +15 -15
  169. package/declaracoes/bloco.d.ts +7 -7
  170. package/declaracoes/bloco.js +14 -14
  171. package/declaracoes/cabecalho-programa.d.ts +7 -7
  172. package/declaracoes/cabecalho-programa.js +14 -14
  173. package/declaracoes/classe.d.ts +14 -14
  174. package/declaracoes/classe.js +18 -18
  175. package/declaracoes/const-multiplo.d.ts +14 -14
  176. package/declaracoes/const-multiplo.js +19 -19
  177. package/declaracoes/const.d.ts +14 -14
  178. package/declaracoes/const.js +19 -19
  179. package/declaracoes/continua.d.ts +6 -6
  180. package/declaracoes/continua.js +13 -13
  181. package/declaracoes/declaracao.d.ts +8 -8
  182. package/declaracoes/declaracao.js +17 -17
  183. package/declaracoes/enquanto.d.ts +10 -10
  184. package/declaracoes/enquanto.js +15 -15
  185. package/declaracoes/escolha.d.ts +14 -14
  186. package/declaracoes/escolha.js +19 -19
  187. package/declaracoes/escreva-mesma-linha.d.ts +8 -8
  188. package/declaracoes/escreva-mesma-linha.js +14 -14
  189. package/declaracoes/escreva.d.ts +8 -8
  190. package/declaracoes/escreva.js +14 -14
  191. package/declaracoes/expressao.d.ts +8 -8
  192. package/declaracoes/expressao.js +14 -14
  193. package/declaracoes/falhar.d.ts +8 -8
  194. package/declaracoes/falhar.js +15 -15
  195. package/declaracoes/fazer.d.ts +10 -10
  196. package/declaracoes/fazer.js +15 -15
  197. package/declaracoes/funcao.d.ts +11 -11
  198. package/declaracoes/funcao.js +17 -17
  199. package/declaracoes/importar.d.ts +9 -9
  200. package/declaracoes/importar.js +15 -15
  201. package/declaracoes/index.d.ts +31 -31
  202. package/declaracoes/index.js +47 -47
  203. package/declaracoes/inicio-algoritmo.d.ts +6 -6
  204. package/declaracoes/inicio-algoritmo.js +13 -13
  205. package/declaracoes/leia-multiplo.d.ts +14 -14
  206. package/declaracoes/leia-multiplo.js +21 -21
  207. package/declaracoes/leia.d.ts +17 -17
  208. package/declaracoes/leia.js +21 -21
  209. package/declaracoes/para-cada.d.ts +11 -11
  210. package/declaracoes/para-cada.js +17 -17
  211. package/declaracoes/para.d.ts +19 -19
  212. package/declaracoes/para.js +24 -24
  213. package/declaracoes/propriedade-classe.d.ts +10 -10
  214. package/declaracoes/propriedade-classe.js +16 -16
  215. package/declaracoes/retorna.d.ts +8 -8
  216. package/declaracoes/retorna.js +15 -15
  217. package/declaracoes/se.d.ts +11 -11
  218. package/declaracoes/se.js +17 -17
  219. package/declaracoes/sustar.d.ts +6 -6
  220. package/declaracoes/sustar.js +13 -13
  221. package/declaracoes/tendo-como.d.ts +16 -16
  222. package/declaracoes/tendo-como.js +21 -21
  223. package/declaracoes/tente.d.ts +14 -14
  224. package/declaracoes/tente.js +20 -20
  225. package/declaracoes/var-multiplo.d.ts +15 -15
  226. package/declaracoes/var-multiplo.js +20 -20
  227. package/declaracoes/var.d.ts +16 -16
  228. package/declaracoes/var.js +21 -21
  229. package/depuracao/cyrb53.d.ts +9 -9
  230. package/depuracao/cyrb53.js +22 -22
  231. package/depuracao/cyrb53.js.map +1 -1
  232. package/depuracao/index.d.ts +2 -2
  233. package/depuracao/index.js +23 -23
  234. package/depuracao/ponto-parada.d.ts +4 -4
  235. package/depuracao/ponto-parada.js +2 -2
  236. package/espaco-variaveis.d.ts +19 -19
  237. package/espaco-variaveis.js +19 -19
  238. package/estruturas/chamavel.d.ts +7 -7
  239. package/estruturas/chamavel.js +12 -12
  240. package/estruturas/classe-padrao.d.ts +31 -31
  241. package/estruturas/classe-padrao.js +39 -39
  242. package/estruturas/delegua-funcao.d.ts +29 -29
  243. package/estruturas/delegua-funcao.js +141 -141
  244. package/estruturas/delegua-funcao.js.map +1 -1
  245. package/estruturas/descritor-tipo-classe.d.ts +37 -37
  246. package/estruturas/descritor-tipo-classe.js +79 -79
  247. package/estruturas/descritor-tipo-classe.js.map +1 -1
  248. package/estruturas/funcao-padrao.d.ts +23 -23
  249. package/estruturas/funcao-padrao.js +34 -34
  250. package/estruturas/index.d.ts +9 -9
  251. package/estruturas/index.js +25 -25
  252. package/estruturas/metodo-primitiva.d.ts +28 -28
  253. package/estruturas/metodo-primitiva.js +40 -40
  254. package/estruturas/modulo.d.ts +18 -18
  255. package/estruturas/modulo.js +24 -24
  256. package/estruturas/objeto-delegua-classe.d.ts +26 -26
  257. package/estruturas/objeto-delegua-classe.js +53 -53
  258. package/estruturas/objeto-delegua-classe.js.map +1 -1
  259. package/estruturas/objeto-padrao.d.ts +18 -18
  260. package/estruturas/objeto-padrao.js +32 -32
  261. package/estruturas/objeto-padrao.js.map +1 -1
  262. package/excecoes/erro-em-tempo-de-execucao.d.ts +7 -7
  263. package/excecoes/erro-em-tempo-de-execucao.js +13 -13
  264. package/excecoes/index.d.ts +1 -1
  265. package/excecoes/index.js +17 -17
  266. package/formatadores/formatador-delegua.d.ts +79 -79
  267. package/formatadores/formatador-delegua.js +676 -676
  268. package/formatadores/formatador-delegua.js.map +1 -1
  269. package/formatadores/index.d.ts +1 -1
  270. package/formatadores/index.js +17 -17
  271. package/geracao-identificadores/index.d.ts +1 -1
  272. package/geracao-identificadores/index.js +22 -23
  273. package/geracao-identificadores/index.js.map +1 -1
  274. package/index.d.ts +9 -9
  275. package/index.js +27 -27
  276. package/interfaces/analisador-semantico-interface.d.ts +6 -6
  277. package/interfaces/analisador-semantico-interface.js +2 -2
  278. package/interfaces/avaliador-sintatico-interface.d.ts +55 -55
  279. package/interfaces/avaliador-sintatico-interface.js +2 -2
  280. package/interfaces/construtos/index.d.ts +4 -4
  281. package/interfaces/construtos/index.js +2 -2
  282. package/interfaces/erros/diagnostico-analisador-semantico.d.ts +14 -14
  283. package/interfaces/erros/diagnostico-analisador-semantico.js +10 -10
  284. package/interfaces/erros/diagnostico-analisador-semantico.js.map +1 -1
  285. package/interfaces/erros/erro-interpretador.d.ts +8 -8
  286. package/interfaces/erros/erro-interpretador.js +2 -2
  287. package/interfaces/erros/index.d.ts +1 -1
  288. package/interfaces/erros/index.js +17 -17
  289. package/interfaces/escopo-execucao.d.ts +12 -12
  290. package/interfaces/escopo-execucao.js +2 -2
  291. package/interfaces/formatador-comum-interface.d.ts +11 -11
  292. package/interfaces/formatador-comum-interface.js +2 -2
  293. package/interfaces/funcao-hipotetica-interface.d.ts +3 -3
  294. package/interfaces/funcao-hipotetica-interface.js +2 -2
  295. package/interfaces/index.d.ts +16 -16
  296. package/interfaces/index.js +32 -32
  297. package/interfaces/interpretador-com-depuracao-interface.d.ts +17 -17
  298. package/interfaces/interpretador-com-depuracao-interface.js +2 -2
  299. package/interfaces/interpretador-interface-potigol.d.ts +5 -5
  300. package/interfaces/interpretador-interface-potigol.js +2 -2
  301. package/interfaces/interpretador-interface.d.ts +20 -20
  302. package/interfaces/interpretador-interface.js +2 -2
  303. package/interfaces/lexador-interface.d.ts +23 -23
  304. package/interfaces/lexador-interface.js +2 -2
  305. package/interfaces/parametro-interface.d.ts +15 -15
  306. package/interfaces/parametro-interface.js +2 -2
  307. package/interfaces/pilha-escopos-execucao-interface.d.ts +26 -26
  308. package/interfaces/pilha-escopos-execucao-interface.js +2 -2
  309. package/interfaces/pilha-interface.d.ts +7 -7
  310. package/interfaces/pilha-interface.js +2 -2
  311. package/interfaces/resolvedor-interface.d.ts +41 -41
  312. package/interfaces/resolvedor-interface.js +2 -2
  313. package/interfaces/retornos/index.d.ts +4 -4
  314. package/interfaces/retornos/index.js +20 -20
  315. package/interfaces/retornos/retorno-analisador-semantico.d.ts +4 -4
  316. package/interfaces/retornos/retorno-analisador-semantico.js +2 -2
  317. package/interfaces/retornos/retorno-avaliador-sintatico.d.ts +5 -5
  318. package/interfaces/retornos/retorno-avaliador-sintatico.js +2 -2
  319. package/interfaces/retornos/retorno-execucao-interface.d.ts +5 -5
  320. package/interfaces/retornos/retorno-execucao-interface.js +2 -2
  321. package/interfaces/retornos/retorno-interpretador.d.ts +5 -5
  322. package/interfaces/retornos/retorno-interpretador.js +2 -2
  323. package/interfaces/retornos/retorno-lexador.d.ts +9 -9
  324. package/interfaces/retornos/retorno-lexador.js +2 -2
  325. package/interfaces/simbolo-interface.d.ts +7 -7
  326. package/interfaces/simbolo-interface.js +2 -2
  327. package/interfaces/tradutor-interface.d.ts +3 -3
  328. package/interfaces/tradutor-interface.js +2 -2
  329. package/interfaces/variavel-hipotetica-interface.d.ts +8 -8
  330. package/interfaces/variavel-hipotetica-interface.js +2 -2
  331. package/interfaces/variavel-interface.d.ts +8 -8
  332. package/interfaces/variavel-interface.js +2 -2
  333. package/interfaces/visitante-comum-interface.d.ts +58 -58
  334. package/interfaces/visitante-comum-interface.js +2 -2
  335. package/interpretador/argumento-interface.d.ts +4 -4
  336. package/interpretador/argumento-interface.js +2 -2
  337. package/interpretador/comum.d.ts +2 -2
  338. package/interpretador/comum.js +51 -52
  339. package/interpretador/comum.js.map +1 -1
  340. package/interpretador/dialetos/egua-classico/index.d.ts +1 -1
  341. package/interpretador/dialetos/egua-classico/index.js +17 -17
  342. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +119 -119
  343. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +815 -815
  344. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  345. package/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.d.ts +5 -5
  346. package/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.js +11 -11
  347. package/interpretador/dialetos/egua-classico/resolvedor/index.d.ts +3 -3
  348. package/interpretador/dialetos/egua-classico/resolvedor/index.js +19 -19
  349. package/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.d.ts +9 -9
  350. package/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.js +25 -25
  351. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +106 -106
  352. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +441 -441
  353. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  354. package/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.d.ts +6 -6
  355. package/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.js +2 -2
  356. package/interpretador/dialetos/index.d.ts +2 -2
  357. package/interpretador/dialetos/index.js +18 -18
  358. package/interpretador/dialetos/portugol-ipt/index.d.ts +1 -1
  359. package/interpretador/dialetos/portugol-ipt/index.js +17 -17
  360. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +133 -133
  361. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +501 -501
  362. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  363. package/interpretador/index.d.ts +3 -3
  364. package/interpretador/index.js +19 -19
  365. package/interpretador/inferenciador.d.ts +15 -15
  366. package/interpretador/inferenciador.d.ts.map +1 -1
  367. package/interpretador/inferenciador.js +80 -80
  368. package/interpretador/inferenciador.js.map +1 -1
  369. package/interpretador/interpretador-base.d.ts +268 -268
  370. package/interpretador/interpretador-base.js +1399 -1399
  371. package/interpretador/interpretador-base.js.map +1 -1
  372. package/interpretador/interpretador-com-depuracao.d.ts +190 -190
  373. package/interpretador/interpretador-com-depuracao.js +568 -568
  374. package/interpretador/interpretador-com-depuracao.js.map +1 -1
  375. package/interpretador/pilha-escopos-execucao.d.ts +39 -39
  376. package/interpretador/pilha-escopos-execucao.js +243 -243
  377. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  378. package/lexador/dialetos/index.d.ts +4 -4
  379. package/lexador/dialetos/index.js +20 -20
  380. package/lexador/dialetos/lexador-egua-classico.d.ts +36 -36
  381. package/lexador/dialetos/lexador-egua-classico.js +286 -286
  382. package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
  383. package/lexador/dialetos/lexador-guarani.d.ts +10 -10
  384. package/lexador/dialetos/lexador-guarani.js +113 -113
  385. package/lexador/dialetos/lexador-guarani.js.map +1 -1
  386. package/lexador/dialetos/lexador-pitugues.d.ts +51 -51
  387. package/lexador/dialetos/lexador-pitugues.js +398 -398
  388. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  389. package/lexador/dialetos/lexador-portugol-ipt.d.ts +33 -33
  390. package/lexador/dialetos/lexador-portugol-ipt.js +237 -237
  391. package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
  392. package/lexador/dialetos/palavras-reservadas/egua-classico.d.ts +32 -32
  393. package/lexador/dialetos/palavras-reservadas/egua-classico.js +39 -39
  394. package/lexador/dialetos/palavras-reservadas/guarani.d.ts +3 -3
  395. package/lexador/dialetos/palavras-reservadas/guarani.js +10 -10
  396. package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +13 -13
  397. package/lexador/dialetos/palavras-reservadas/portugol-ipt.js +20 -20
  398. package/lexador/dialetos/palavras-reservadas/rantiaquin.d.ts +1 -1
  399. package/lexador/dialetos/palavras-reservadas/rantiaquin.js +4 -4
  400. package/lexador/dialetos/pragma.d.ts +8 -8
  401. package/lexador/dialetos/pragma.js +2 -2
  402. package/lexador/erro-lexador.d.ts +5 -5
  403. package/lexador/erro-lexador.js +2 -2
  404. package/lexador/index.d.ts +4 -4
  405. package/lexador/index.js +20 -20
  406. package/lexador/lexador-base-linha-unica.d.ts +28 -28
  407. package/lexador/lexador-base-linha-unica.js +82 -82
  408. package/lexador/lexador-base-linha-unica.js.map +1 -1
  409. package/lexador/lexador-base.d.ts +41 -41
  410. package/lexador/lexador-base.js +112 -112
  411. package/lexador/lexador-base.js.map +1 -1
  412. package/lexador/lexador.d.ts +43 -43
  413. package/lexador/lexador.js +440 -440
  414. package/lexador/lexador.js.map +1 -1
  415. package/lexador/micro-lexador.d.ts +29 -29
  416. package/lexador/micro-lexador.js +207 -207
  417. package/lexador/micro-lexador.js.map +1 -1
  418. package/lexador/palavras-reservadas.d.ts +54 -54
  419. package/lexador/palavras-reservadas.js +61 -61
  420. package/lexador/simbolo.d.ts +10 -10
  421. package/lexador/simbolo.js +16 -16
  422. package/lexador/traducao/lexador-javascript.d.ts +28 -28
  423. package/lexador/traducao/lexador-javascript.js +58 -58
  424. package/package.json +5 -4
  425. package/quebras/index.d.ts +10 -10
  426. package/quebras/index.js +19 -19
  427. package/tipo-dados-elementar.d.ts +1 -1
  428. package/tipo-dados-elementar.js +2 -2
  429. package/tipos-de-dados/delegua.d.ts +18 -18
  430. package/tipos-de-dados/delegua.js +19 -19
  431. package/tipos-de-dados/listas-delegua.d.ts +6 -6
  432. package/tipos-de-dados/listas-delegua.js +7 -7
  433. package/tipos-de-dados/listas-primitivos.d.ts +5 -5
  434. package/tipos-de-dados/listas-primitivos.js +6 -6
  435. package/tipos-de-dados/primitivos.d.ts +16 -16
  436. package/tipos-de-dados/primitivos.js +17 -17
  437. package/tipos-de-simbolos/comum.d.ts +23 -23
  438. package/tipos-de-simbolos/comum.js +24 -24
  439. package/tipos-de-simbolos/delegua.d.ts +91 -91
  440. package/tipos-de-simbolos/delegua.js +92 -92
  441. package/tipos-de-simbolos/egua-classico.d.ts +75 -75
  442. package/tipos-de-simbolos/egua-classico.js +76 -76
  443. package/tipos-de-simbolos/guarani.d.ts +14 -14
  444. package/tipos-de-simbolos/guarani.js +15 -15
  445. package/tipos-de-simbolos/guarani.js.map +1 -1
  446. package/tipos-de-simbolos/microgramaticas/delegua.d.ts +46 -46
  447. package/tipos-de-simbolos/microgramaticas/delegua.js +47 -47
  448. package/tipos-de-simbolos/pitugues.d.ts +75 -75
  449. package/tipos-de-simbolos/pitugues.js +76 -76
  450. package/tipos-de-simbolos/portugol-ipt.d.ts +36 -36
  451. package/tipos-de-simbolos/portugol-ipt.js +37 -37
  452. package/tipos-de-simbolos/rantiaquin.d.ts +2 -2
  453. package/tipos-de-simbolos/rantiaquin.js +3 -3
  454. package/tradutores/dicionarios/dicionario-delegua-javascript.d.ts +2 -2
  455. package/tradutores/dicionarios/dicionario-delegua-javascript.js +10 -10
  456. package/tradutores/dicionarios/index.d.ts +1 -1
  457. package/tradutores/dicionarios/index.js +17 -17
  458. package/tradutores/index.d.ts +6 -6
  459. package/tradutores/index.js +22 -22
  460. package/tradutores/python/python3-lexer.d.ts +152 -152
  461. package/tradutores/python/python3-lexer.js +1227 -1227
  462. package/tradutores/python/python3-lexer.js.map +1 -1
  463. package/tradutores/python/python3-listener.d.ts +964 -964
  464. package/tradutores/python/python3-listener.js +3 -3
  465. package/tradutores/python/python3-parser.d.ts +1342 -1342
  466. package/tradutores/python/python3-parser.js +11226 -11226
  467. package/tradutores/python/python3-parser.js.map +1 -1
  468. package/tradutores/python/python3-visitor.d.ts +619 -619
  469. package/tradutores/python/python3-visitor.js +3 -3
  470. package/tradutores/tradutor-assembly-x64.d.ts +19 -19
  471. package/tradutores/tradutor-assembly-x64.js +128 -128
  472. package/tradutores/tradutor-assembly-x64.js.map +1 -1
  473. package/tradutores/tradutor-assemblyscript.d.ts +91 -91
  474. package/tradutores/tradutor-assemblyscript.js +590 -590
  475. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  476. package/tradutores/tradutor-javascript.d.ts +95 -95
  477. package/tradutores/tradutor-javascript.js +577 -577
  478. package/tradutores/tradutor-javascript.js.map +1 -1
  479. package/tradutores/tradutor-portugol-ipt.d.ts +21 -21
  480. package/tradutores/tradutor-portugol-ipt.js +60 -60
  481. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  482. package/tradutores/tradutor-python.d.ts +65 -65
  483. package/tradutores/tradutor-python.js +461 -461
  484. package/tradutores/tradutor-python.js.map +1 -1
  485. package/tradutores/tradutor-reverso-javascript.d.ts +50 -50
  486. package/tradutores/tradutor-reverso-javascript.js +392 -392
  487. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  488. package/tradutores/tradutor-reverso-python.d.ts +32 -32
  489. package/tradutores/tradutor-reverso-python.js +71 -71
  490. package/tradutores/tradutor-reverso-python.js.map +1 -1
  491. package/umd/delegua.js +26337 -26339
@@ -1,1094 +1,1094 @@
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.AvaliadorSintatico = void 0;
7
- const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
8
- const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
9
- const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
10
- const construtos_1 = require("../construtos");
11
- const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
12
- const tuplas_1 = require("../construtos/tuplas");
13
- const declaracoes_1 = require("../declaracoes");
14
- const lexador_1 = require("../lexador");
15
- /**
16
- * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
17
- * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
18
- * Há dois grupos de estruturas de alto nível: Construtos e Declarações.
19
- */
20
- class AvaliadorSintatico {
21
- constructor(performance = false) {
22
- this.hashArquivo = 0;
23
- this.atual = 0;
24
- this.blocos = 0;
25
- this.erros = [];
26
- this.performance = performance;
27
- }
28
- declaracaoDeVariavel() {
29
- throw new Error('Método não implementado.');
30
- }
31
- erro(simbolo, mensagemDeErro) {
32
- const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
33
- this.erros.push(excecao);
34
- return excecao;
35
- }
36
- consumir(tipo, mensagemDeErro) {
37
- if (this.verificarTipoSimboloAtual(tipo))
38
- return this.avancarEDevolverAnterior();
39
- throw this.erro(this.simbolos[this.atual], mensagemDeErro);
40
- }
41
- verificarTipoSimboloAtual(tipo) {
42
- if (this.estaNoFinal())
43
- return false;
44
- return this.simbolos[this.atual].tipo === tipo;
45
- }
46
- verificarTipoProximoSimbolo(tipo) {
47
- return this.simbolos[this.atual + 1].tipo === tipo;
48
- }
49
- verificarDefinicaoTipoAtual() {
50
- const tipos = [...Object.values(delegua_1.default)];
51
- const lexema = this.simboloAtual().lexema.toLowerCase();
52
- const contemTipo = tipos.find((tipo) => tipo === lexema);
53
- if (contemTipo && this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
54
- const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
55
- this.avancarEDevolverAnterior();
56
- if (!this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_DIREITO)) {
57
- throw this.erro(this.simbolos[this.atual], "Esperado símbolo de fechamento do vetor ']'.");
58
- }
59
- const contemTipoVetor = tiposVetores.find((tipo) => tipo === `${lexema}[]`);
60
- this.avancarEDevolverAnterior();
61
- return contemTipoVetor;
62
- }
63
- return contemTipo;
64
- }
65
- simboloAtual() {
66
- return this.simbolos[this.atual];
67
- }
68
- simboloAnterior() {
69
- return this.simbolos[this.atual - 1];
70
- }
71
- estaNoFinal() {
72
- return this.atual === this.simbolos.length;
73
- }
74
- avancarEDevolverAnterior() {
75
- if (!this.estaNoFinal())
76
- this.atual += 1;
77
- return this.simbolos[this.atual - 1];
78
- }
79
- verificarSeSimboloAtualEIgualA(...argumentos) {
80
- for (let i = 0; i < argumentos.length; i++) {
81
- const tipoAtual = argumentos[i];
82
- if (this.verificarTipoSimboloAtual(tipoAtual)) {
83
- this.avancarEDevolverAnterior();
84
- return true;
85
- }
86
- }
87
- return false;
88
- }
89
- primario() {
90
- const simboloAtual = this.simbolos[this.atual];
91
- let valores = [];
92
- switch (simboloAtual.tipo) {
93
- case delegua_2.default.CHAVE_ESQUERDA:
94
- this.avancarEDevolverAnterior();
95
- const chaves = [];
96
- valores = [];
97
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
98
- return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
99
- }
100
- while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
101
- const chave = this.atribuir();
102
- this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
103
- const valor = this.atribuir();
104
- chaves.push(chave);
105
- valores.push(valor);
106
- if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
107
- this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
108
- }
109
- }
110
- return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
111
- case delegua_2.default.COLCHETE_ESQUERDO:
112
- this.avancarEDevolverAnterior();
113
- valores = [];
114
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
115
- return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
116
- }
117
- while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
118
- let valor = null;
119
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
120
- const expressao = this.expressao();
121
- const argumentos = [expressao];
122
- while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
123
- this.avancarEDevolverAnterior();
124
- argumentos.push(this.expressao());
125
- }
126
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
127
- this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
128
- return new tuplas_1.SeletorTuplas(...argumentos);
129
- }
130
- valor = this.atribuir();
131
- valores.push(valor);
132
- if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
133
- this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
134
- }
135
- }
136
- return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
137
- case delegua_2.default.FALSO:
138
- this.avancarEDevolverAnterior();
139
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
140
- case delegua_2.default.FUNCAO:
141
- case delegua_2.default.FUNÇÃO:
142
- const simboloFuncao = this.avancarEDevolverAnterior();
143
- return this.corpoDaFuncao(simboloFuncao.lexema);
144
- case delegua_2.default.IDENTIFICADOR:
145
- const simboloIdentificador = this.avancarEDevolverAnterior();
146
- // Se o próximo símbolo é um incremento ou um decremento,
147
- // aqui deve retornar um unário correspondente.
148
- // Caso contrário, apenas retornar um construto de variável.
149
- if (this.simbolos[this.atual] &&
150
- [delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR].includes(this.simbolos[this.atual].tipo)) {
151
- const simboloIncrementoDecremento = this.avancarEDevolverAnterior();
152
- return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador), 'DEPOIS');
153
- }
154
- return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador);
155
- case delegua_2.default.IMPORTAR:
156
- this.avancarEDevolverAnterior();
157
- return this.declaracaoImportar();
158
- case delegua_2.default.ISTO:
159
- this.avancarEDevolverAnterior();
160
- return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
161
- case delegua_2.default.NULO:
162
- this.avancarEDevolverAnterior();
163
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null);
164
- case delegua_2.default.NUMERO:
165
- case delegua_2.default.TEXTO:
166
- const simboloNumeroTexto = this.avancarEDevolverAnterior();
167
- return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal);
168
- case delegua_2.default.PARENTESE_ESQUERDO:
169
- this.avancarEDevolverAnterior();
170
- const expressao = this.expressao();
171
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
172
- return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
173
- case delegua_2.default.SUPER:
174
- const simboloSuper = this.avancarEDevolverAnterior();
175
- // Se o próximo símbolo for uma abertura de parênteses, significa que
176
- // é uma chamada ao construtor da classe ancestral (superclasse).
177
- // Se o próximo símbolo for um ponto, significa que é uma chamada
178
- // a um método da superclasse.
179
- switch (this.simbolos[this.atual].tipo) {
180
- case delegua_2.default.PARENTESE_ESQUERDO:
181
- return new construtos_1.Super(this.hashArquivo, simboloSuper, new lexador_1.Simbolo(delegua_2.default.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo));
182
- default:
183
- this.consumir(delegua_2.default.PONTO, "Esperado '.' após 'super'.");
184
- const metodoSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
185
- return new construtos_1.Super(this.hashArquivo, simboloSuper, metodoSuperclasse);
186
- }
187
- case delegua_2.default.VERDADEIRO:
188
- this.avancarEDevolverAnterior();
189
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
190
- case delegua_2.default.TIPO:
191
- this.avancarEDevolverAnterior();
192
- this.consumir(delegua_2.default.DE, "Esperado 'de' após 'tipo'.");
193
- let _expressao;
194
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESCREVA, delegua_2.default.LEIA, delegua_2.default.FUNCAO, delegua_2.default.FUNÇÃO, delegua_2.default.SE, delegua_2.default.ENQUANTO, delegua_2.default.PARA, delegua_2.default.RETORNA, delegua_1.default.INTEIRO, delegua_1.default.TEXTO, delegua_1.default.VETOR, delegua_1.default.LOGICO, delegua_1.default.LÓGICO, delegua_1.default.VAZIO)) {
195
- _expressao = this.simboloAnterior();
196
- }
197
- else {
198
- _expressao = this.expressao();
199
- }
200
- return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, _expressao instanceof construtos_1.Literal ? _expressao.valor : _expressao);
201
- case delegua_2.default.EXPRESSAO_REGULAR:
202
- let valor = '';
203
- let linhaAtual = this.simbolos[this.atual].linha;
204
- let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
205
- .length %
206
- 2 ===
207
- 0;
208
- if (eParExpressaoRegular) {
209
- this.avancarEDevolverAnterior();
210
- while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
211
- valor += this.simboloAtual().lexema || '';
212
- this.avancarEDevolverAnterior();
213
- }
214
- this.avancarEDevolverAnterior();
215
- return new construtos_1.ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
216
- }
217
- }
218
- throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
219
- }
220
- finalizarChamada(entidadeChamada) {
221
- const argumentos = [];
222
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
223
- do {
224
- if (argumentos.length >= 255) {
225
- throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
226
- }
227
- argumentos.push(this.expressao());
228
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
229
- }
230
- const parenteseDireito = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
231
- return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
232
- }
233
- chamar() {
234
- let expressao = this.primario();
235
- while (true) {
236
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
237
- expressao = this.finalizarChamada(expressao);
238
- }
239
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
240
- const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
241
- expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
242
- }
243
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
244
- const indice = this.expressao();
245
- const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
246
- expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
247
- }
248
- else {
249
- break;
250
- }
251
- }
252
- return expressao;
253
- }
254
- unario() {
255
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.NEGACAO, delegua_2.default.SUBTRACAO, delegua_2.default.BIT_NOT, delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR)) {
256
- const operador = this.simbolos[this.atual - 1];
257
- const direito = this.unario();
258
- return new construtos_1.Unario(this.hashArquivo, operador, direito, 'ANTES');
259
- }
260
- return this.chamar();
261
- }
262
- exponenciacao() {
263
- let expressao = this.unario();
264
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
265
- const operador = this.simbolos[this.atual - 1];
266
- const direito = this.unario();
267
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
268
- }
269
- return expressao;
270
- }
271
- multiplicar() {
272
- let expressao = this.exponenciacao();
273
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIVISAO, delegua_2.default.DIVISAO_IGUAL, delegua_2.default.DIVISAO_INTEIRA, delegua_2.default.DIVISAO_INTEIRA_IGUAL, delegua_2.default.MODULO, delegua_2.default.MODULO_IGUAL, delegua_2.default.MULTIPLICACAO, delegua_2.default.MULTIPLICACAO_IGUAL)) {
274
- const operador = this.simbolos[this.atual - 1];
275
- const direito = this.exponenciacao();
276
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
277
- }
278
- return expressao;
279
- }
280
- /**
281
- * Se símbolo de operação é `+`, `-`, `+=` ou `-=`, monta objeto `Binario` para
282
- * ser avaliado pelo Interpretador.
283
- * @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
284
- */
285
- adicaoOuSubtracao() {
286
- let expressao = this.multiplicar();
287
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MAIS_IGUAL, delegua_2.default.MENOS_IGUAL)) {
288
- const operador = this.simbolos[this.atual - 1];
289
- const direito = this.multiplicar();
290
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
291
- }
292
- return expressao;
293
- }
294
- bitShift() {
295
- let expressao = this.adicaoOuSubtracao();
296
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MENOR_MENOR, delegua_2.default.MAIOR_MAIOR)) {
297
- const operador = this.simbolos[this.atual - 1];
298
- const direito = this.adicaoOuSubtracao();
299
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
300
- }
301
- return expressao;
302
- }
303
- bitE() {
304
- let expressao = this.bitShift();
305
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_AND)) {
306
- const operador = this.simbolos[this.atual - 1];
307
- const direito = this.bitShift();
308
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
309
- }
310
- return expressao;
311
- }
312
- bitOu() {
313
- let expressao = this.bitE();
314
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_OR, delegua_2.default.BIT_XOR)) {
315
- const operador = this.simbolos[this.atual - 1];
316
- const direito = this.bitE();
317
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
318
- }
319
- return expressao;
320
- }
321
- comparar() {
322
- let expressao = this.bitOu();
323
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
324
- const operador = this.simbolos[this.atual - 1];
325
- const direito = this.bitOu();
326
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
327
- }
328
- return expressao;
329
- }
330
- comparacaoIgualdade() {
331
- let expressao = this.comparar();
332
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIFERENTE, delegua_2.default.IGUAL_IGUAL)) {
333
- const operador = this.simbolos[this.atual - 1];
334
- const direito = this.comparar();
335
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
336
- }
337
- return expressao;
338
- }
339
- em() {
340
- let expressao = this.comparacaoIgualdade();
341
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EM)) {
342
- const operador = this.simbolos[this.atual - 1];
343
- const direito = this.comparacaoIgualdade();
344
- expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
345
- }
346
- return expressao;
347
- }
348
- e() {
349
- let expressao = this.em();
350
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.E)) {
351
- const operador = this.simbolos[this.atual - 1];
352
- const direito = this.em();
353
- expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
354
- }
355
- return expressao;
356
- }
357
- ou() {
358
- let expressao = this.e();
359
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.OU)) {
360
- const operador = this.simbolos[this.atual - 1];
361
- const direito = this.e();
362
- expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
363
- }
364
- return expressao;
365
- }
366
- /**
367
- * Método que resolve atribuições.
368
- * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
369
- */
370
- atribuir() {
371
- const expressao = this.ou();
372
- if (expressao instanceof construtos_1.Binario &&
373
- [
374
- delegua_2.default.MAIS_IGUAL,
375
- delegua_2.default.MENOS_IGUAL,
376
- delegua_2.default.MULTIPLICACAO_IGUAL,
377
- delegua_2.default.DIVISAO_IGUAL,
378
- delegua_2.default.DIVISAO_INTEIRA_IGUAL,
379
- delegua_2.default.MODULO_IGUAL,
380
- ].includes(expressao.operador.tipo)) {
381
- let simbolo = expressao.esquerda.simbolo;
382
- if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
383
- simbolo = expressao.esquerda.entidadeChamada.simbolo;
384
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, expressao.esquerda.indice);
385
- }
386
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
387
- }
388
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
389
- const igual = this.simbolos[this.atual - 1];
390
- const valor = this.expressao();
391
- if (expressao instanceof construtos_1.Variavel) {
392
- const simbolo = expressao.simbolo;
393
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
394
- }
395
- else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
396
- const get = expressao;
397
- return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
398
- }
399
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
400
- return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
401
- }
402
- this.erro(igual, 'Tarefa de atribuição inválida');
403
- }
404
- return expressao;
405
- }
406
- expressao() {
407
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.LEIA))
408
- return this.declaracaoLeia();
409
- return this.atribuir();
410
- }
411
- blocoEscopo() {
412
- let declaracoes = [];
413
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
414
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
415
- if (Array.isArray(retornoDeclaracao)) {
416
- declaracoes = declaracoes.concat(retornoDeclaracao);
417
- }
418
- else {
419
- declaracoes.push(retornoDeclaracao);
420
- }
421
- }
422
- this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
423
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
424
- return declaracoes;
425
- }
426
- declaracaoEnquanto() {
427
- try {
428
- this.blocos += 1;
429
- const condicao = this.expressao();
430
- const corpo = this.resolverDeclaracao();
431
- return new declaracoes_1.Enquanto(condicao, corpo);
432
- }
433
- finally {
434
- this.blocos -= 1;
435
- }
436
- }
437
- declaracaoEscreva() {
438
- const simboloAtual = this.simbolos[this.atual];
439
- this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
440
- const argumentos = [];
441
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
442
- do {
443
- argumentos.push(this.expressao());
444
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
445
- }
446
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
447
- // Ponto-e-vírgula é opcional aqui.
448
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
449
- return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
450
- }
451
- declaracaoExpressao() {
452
- const expressao = this.expressao();
453
- // Ponto-e-vírgula é opcional aqui.
454
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
455
- return new declaracoes_1.Expressao(expressao);
456
- }
457
- declaracaoComentarioMultilinha() {
458
- let simboloComentario;
459
- const conteudos = [];
460
- do {
461
- simboloComentario = this.avancarEDevolverAnterior();
462
- conteudos.push(simboloComentario.literal);
463
- } while (simboloComentario.tipo === delegua_2.default.LINHA_COMENTARIO);
464
- return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, conteudos, true);
465
- }
466
- declaracaoComentarioUmaLinha() {
467
- const simboloComentario = this.avancarEDevolverAnterior();
468
- return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, simboloComentario.literal, false);
469
- }
470
- declaracaoContinua() {
471
- if (this.blocos < 1) {
472
- this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
473
- }
474
- // Ponto-e-vírgula é opcional aqui.
475
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
476
- return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
477
- }
478
- declaracaoEscolha() {
479
- try {
480
- this.blocos += 1;
481
- const condicao = this.expressao();
482
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
483
- const caminhos = [];
484
- let caminhoPadrao = null;
485
- while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
486
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
487
- const caminhoCondicoes = [this.expressao()];
488
- this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
489
- while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
490
- this.consumir(delegua_2.default.CASO, null);
491
- caminhoCondicoes.push(this.expressao());
492
- this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
493
- }
494
- let declaracoes = [];
495
- do {
496
- const retornoDeclaracao = this.resolverDeclaracao();
497
- if (Array.isArray(retornoDeclaracao)) {
498
- declaracoes = declaracoes.concat(retornoDeclaracao);
499
- }
500
- else {
501
- declaracoes.push(retornoDeclaracao);
502
- }
503
- } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
504
- !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
505
- !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
506
- caminhos.push({
507
- condicoes: caminhoCondicoes,
508
- declaracoes,
509
- });
510
- }
511
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PADRAO)) {
512
- if (caminhoPadrao !== null) {
513
- const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
514
- this.erros.push(excecao);
515
- throw excecao;
516
- }
517
- this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
518
- const declaracoes = [];
519
- do {
520
- declaracoes.push(this.resolverDeclaracao());
521
- } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
522
- !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
523
- !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
524
- caminhoPadrao = {
525
- declaracoes,
526
- };
527
- }
528
- }
529
- return new declaracoes_1.Escolha(condicao, caminhos, caminhoPadrao);
530
- }
531
- finally {
532
- this.blocos -= 1;
533
- }
534
- }
535
- declaracaoFalhar() {
536
- const simboloFalha = this.simbolos[this.atual - 1];
537
- return new declaracoes_1.Falhar(simboloFalha, this.declaracaoExpressao().expressao);
538
- }
539
- declaracaoFazer() {
540
- const simboloFazer = this.simbolos[this.atual - 1];
541
- try {
542
- this.blocos += 1;
543
- const caminhoFazer = this.resolverDeclaracao();
544
- this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
545
- const condicaoEnquanto = this.expressao();
546
- return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
547
- }
548
- finally {
549
- this.blocos -= 1;
550
- }
551
- }
552
- declaracaoImportar() {
553
- this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
554
- const caminho = this.expressao();
555
- const simboloFechamento = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
556
- return new declaracoes_1.Importar(caminho, simboloFechamento);
557
- }
558
- /**
559
- * Declaração para comando `leia`, para ler dados de entrada do usuário.
560
- * @returns Um objeto da classe `Leia`.
561
- */
562
- declaracaoLeia() {
563
- const simboloLeia = this.simbolos[this.atual];
564
- this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos argumentos em instrução `leia`.");
565
- const argumentos = [];
566
- if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
567
- do {
568
- argumentos.push(this.expressao());
569
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
570
- }
571
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
572
- return new declaracoes_1.Leia(simboloLeia, argumentos);
573
- }
574
- declaracaoPara() {
575
- try {
576
- const simboloPara = this.simbolos[this.atual - 1];
577
- this.blocos += 1;
578
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
579
- return this.declaracaoParaCada(simboloPara);
580
- }
581
- return this.declaracaoParaTradicional(simboloPara);
582
- }
583
- finally {
584
- this.blocos -= 1;
585
- }
586
- }
587
- declaracaoParaCada(simboloPara) {
588
- const nomeVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
589
- if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
590
- throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
591
- }
592
- const vetor = this.expressao();
593
- const corpo = this.resolverDeclaracao();
594
- return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
595
- }
596
- declaracaoParaTradicional(simboloPara) {
597
- const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
598
- let inicializador;
599
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA)) {
600
- inicializador = null;
601
- }
602
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VARIAVEL)) {
603
- inicializador = this.declaracaoDeVariaveis();
604
- }
605
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CONSTANTE)) {
606
- inicializador = this.declaracaoDeConstantes();
607
- }
608
- else {
609
- inicializador = this.declaracaoExpressao();
610
- }
611
- let condicao = null;
612
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PONTO_E_VIRGULA)) {
613
- condicao = this.expressao();
614
- }
615
- // Ponto-e-vírgula é opcional aqui.
616
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
617
- let incrementar = null;
618
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
619
- incrementar = this.expressao();
620
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR);
621
- }
622
- if (comParenteses) {
623
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
624
- }
625
- const corpo = this.resolverDeclaracao();
626
- return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
627
- }
628
- declaracaoRetorna() {
629
- const simboloChave = this.simbolos[this.atual - 1];
630
- let valor = null;
631
- if ([
632
- delegua_2.default.CHAVE_ESQUERDA,
633
- delegua_2.default.COLCHETE_ESQUERDO,
634
- delegua_2.default.FALSO,
635
- delegua_2.default.IDENTIFICADOR,
636
- delegua_2.default.ISTO,
637
- delegua_2.default.NEGACAO,
638
- delegua_2.default.NUMERO,
639
- delegua_2.default.NULO,
640
- delegua_2.default.PARENTESE_ESQUERDO,
641
- delegua_2.default.SUPER,
642
- delegua_2.default.TEXTO,
643
- delegua_2.default.VERDADEIRO,
644
- ].includes(this.simbolos[this.atual].tipo)) {
645
- valor = this.expressao();
646
- }
647
- // Ponto-e-vírgula é opcional aqui.
648
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
649
- return new declaracoes_1.Retorna(simboloChave, valor);
650
- }
651
- declaracaoSe() {
652
- const condicao = this.expressao();
653
- const caminhoEntao = this.resolverDeclaracao();
654
- let caminhoSenao = null;
655
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
656
- caminhoSenao = this.resolverDeclaracao();
657
- }
658
- return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
659
- }
660
- declaracaoSustar() {
661
- if (this.blocos < 1) {
662
- this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
663
- }
664
- // Ponto-e-vírgula é opcional aqui.
665
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
666
- return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
667
- }
668
- declaracaoTente() {
669
- const simboloTente = this.simbolos[this.atual - 1];
670
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
671
- const blocoTente = this.blocoEscopo();
672
- let blocoPegue = null;
673
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PEGUE)) {
674
- if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_ESQUERDO)) {
675
- // Caso 1: com parâmetro de erro.
676
- // `pegue` recebe um `FuncaoConstruto`.
677
- blocoPegue = this.corpoDaFuncao('bloco `pegue`');
678
- }
679
- else {
680
- // Caso 2: sem parâmetro de erro.
681
- // `pegue` recebe um bloco.
682
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
683
- blocoPegue = this.blocoEscopo();
684
- }
685
- }
686
- let blocoSenao = null;
687
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
688
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
689
- blocoSenao = this.blocoEscopo();
690
- }
691
- let blocoFinalmente = null;
692
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.FINALMENTE)) {
693
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
694
- blocoFinalmente = this.blocoEscopo();
695
- }
696
- return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
697
- }
698
- resolverDecorador() {
699
- this.pilhaDecoradores = [];
700
- while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
701
- let nomeDecorador = '';
702
- let linha;
703
- let parametros = [];
704
- let parenteseEsquerdo = false;
705
- linha = this.simbolos[this.atual].linha;
706
- let simbolosLinhaAtual = this.simbolos.filter((l) => l.linha === linha);
707
- for (let simbolo of simbolosLinhaAtual) {
708
- parenteseEsquerdo = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
709
- if (parenteseEsquerdo) {
710
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
711
- parametros = this.logicaComumParametros();
712
- }
713
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
714
- break;
715
- }
716
- this.avancarEDevolverAnterior();
717
- nomeDecorador += simbolo.lexema || '.';
718
- }
719
- this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, parametros));
720
- }
721
- }
722
- /**
723
- * Todas as resoluções triviais da linguagem, ou seja, todas as
724
- * resoluções que podem ocorrer dentro ou fora de um bloco.
725
- * @returns Normalmente uma `Declaracao`, mas há casos em que
726
- * outros objetos podem ser retornados.
727
- * @see resolverDeclaracaoForaDeBloco para as declarações que não podem
728
- * ocorrer em blocos de escopo elementares.
729
- */
730
- resolverDeclaracao() {
731
- switch (this.simbolos[this.atual].tipo) {
732
- case delegua_2.default.CHAVE_ESQUERDA:
733
- const simboloInicioBloco = this.avancarEDevolverAnterior();
734
- return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
735
- case delegua_2.default.COMENTARIO:
736
- return this.declaracaoComentarioUmaLinha();
737
- case delegua_2.default.CONSTANTE:
738
- this.avancarEDevolverAnterior();
739
- return this.declaracaoDeConstantes();
740
- case delegua_2.default.CONTINUA:
741
- this.avancarEDevolverAnterior();
742
- return this.declaracaoContinua();
743
- case delegua_2.default.ENQUANTO:
744
- this.avancarEDevolverAnterior();
745
- return this.declaracaoEnquanto();
746
- case delegua_2.default.ESCOLHA:
747
- this.avancarEDevolverAnterior();
748
- return this.declaracaoEscolha();
749
- case delegua_2.default.ESCREVA:
750
- this.avancarEDevolverAnterior();
751
- return this.declaracaoEscreva();
752
- case delegua_2.default.FALHAR:
753
- this.avancarEDevolverAnterior();
754
- return this.declaracaoFalhar();
755
- case delegua_2.default.FAZER:
756
- this.avancarEDevolverAnterior();
757
- return this.declaracaoFazer();
758
- case delegua_2.default.LINHA_COMENTARIO:
759
- return this.declaracaoComentarioMultilinha();
760
- case delegua_2.default.PARA:
761
- this.avancarEDevolverAnterior();
762
- return this.declaracaoPara();
763
- case delegua_2.default.PAUSA:
764
- case delegua_2.default.SUSTAR:
765
- this.avancarEDevolverAnterior();
766
- return this.declaracaoSustar();
767
- case delegua_2.default.SE:
768
- this.avancarEDevolverAnterior();
769
- return this.declaracaoSe();
770
- case delegua_2.default.RETORNA:
771
- this.avancarEDevolverAnterior();
772
- return this.declaracaoRetorna();
773
- case delegua_2.default.TENDO:
774
- this.avancarEDevolverAnterior();
775
- return this.declaracaoTendoComo();
776
- case delegua_2.default.TENTE:
777
- this.avancarEDevolverAnterior();
778
- return this.declaracaoTente();
779
- case delegua_2.default.VARIAVEL:
780
- this.avancarEDevolverAnterior();
781
- return this.declaracaoDeVariaveis();
782
- }
783
- const simboloAtual = this.simbolos[this.atual];
784
- if (simboloAtual.tipo === delegua_2.default.IDENTIFICADOR) {
785
- // Pela gramática, a seguinte situação não pode ocorrer:
786
- // 1. O símbolo anterior ser um identificador; e
787
- // 2. O símbolo anterior estar na mesma linha do identificador atual.
788
- const simboloAnterior = this.simbolos[this.atual - 1];
789
- if (!!simboloAnterior &&
790
- simboloAnterior.tipo === delegua_2.default.IDENTIFICADOR &&
791
- simboloAnterior.linha === simboloAtual.linha) {
792
- this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
793
- }
794
- }
795
- return this.declaracaoExpressao();
796
- }
797
- declaracaoTendoComo() {
798
- const simboloTendo = this.simbolos[this.atual - 1];
799
- const expressaoInicializacao = this.expressao();
800
- this.consumir(delegua_2.default.COMO, "Esperado palavra reservada 'como' após expressão de inicialização de variável, em declaração 'tendo'.");
801
- const simboloNomeVariavel = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
802
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
803
- const blocoCorpo = this.blocoEscopo();
804
- return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
805
- }
806
- declaracaoDesestruturacaoVariavel() {
807
- const identificadores = [];
808
- do {
809
- identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
810
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
811
- this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
812
- this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
813
- const inicializador = this.expressao();
814
- // TODO: Para cada variável dos identificadores, emitir um `AcessoMetodoOuPropriedade` usando
815
- // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
816
- const retornos = [];
817
- for (let identificador of identificadores) {
818
- retornos.push(new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
819
- }
820
- return retornos;
821
- }
822
- /**
823
- * Caso símbolo atual seja `var`, devolve uma declaração de variável.
824
- * @returns Um Construto do tipo Var.
825
- */
826
- declaracaoDeVariaveis() {
827
- const identificadores = [];
828
- let retorno = [];
829
- let tipo = null;
830
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
831
- return this.declaracaoDesestruturacaoVariavel();
832
- }
833
- do {
834
- identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
835
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
836
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
837
- tipo = this.verificarDefinicaoTipoAtual();
838
- this.avancarEDevolverAnterior();
839
- }
840
- if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
841
- // Inicialização de variáveis sem valor.
842
- for (let [indice, identificador] of identificadores.entries()) {
843
- retorno.push(new declaracoes_1.Var(identificador, null, tipo));
844
- }
845
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
846
- return retorno;
847
- }
848
- const inicializadores = [];
849
- do {
850
- inicializadores.push(this.expressao());
851
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
852
- if (identificadores.length !== inicializadores.length) {
853
- throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
854
- }
855
- for (let [indice, identificador] of identificadores.entries()) {
856
- tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
857
- retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
858
- }
859
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
860
- return retorno;
861
- }
862
- declaracaoDesestruturacaoConstante() {
863
- const identificadores = [];
864
- do {
865
- identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
866
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
867
- this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
868
- this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
869
- const inicializador = this.expressao();
870
- // TODO: Para cada variável dos identificadores, emitir um `AcessoMetodoOuPropriedade` usando
871
- // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
872
- const retornos = [];
873
- for (let identificador of identificadores) {
874
- retornos.push(new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
875
- }
876
- return retornos;
877
- }
878
- /**
879
- * Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
880
- * @returns Um Construto do tipo Const.
881
- */
882
- declaracaoDeConstantes() {
883
- const identificadores = [];
884
- let tipo = null;
885
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
886
- return this.declaracaoDesestruturacaoConstante();
887
- }
888
- do {
889
- identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da constante.'));
890
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
891
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
892
- tipo = this.verificarDefinicaoTipoAtual();
893
- this.avancarEDevolverAnterior();
894
- }
895
- this.consumir(delegua_2.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
896
- const inicializadores = [];
897
- do {
898
- inicializadores.push(this.expressao());
899
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
900
- if (identificadores.length !== inicializadores.length) {
901
- throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
902
- }
903
- let retorno = [];
904
- for (let [indice, identificador] of identificadores.entries()) {
905
- retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
906
- }
907
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
908
- return retorno;
909
- }
910
- funcao(tipo) {
911
- let simbolo;
912
- switch (this.simbolos[this.atual].tipo) {
913
- case delegua_2.default.CONSTRUTOR:
914
- simbolo = this.avancarEDevolverAnterior();
915
- this.pilhaDecoradores = [];
916
- break;
917
- default:
918
- simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
919
- break;
920
- }
921
- return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, this.pilhaDecoradores);
922
- }
923
- logicaComumParametros() {
924
- const parametros = [];
925
- do {
926
- const parametro = {};
927
- if (this.simbolos[this.atual].tipo === delegua_2.default.MULTIPLICACAO) {
928
- this.consumir(delegua_2.default.MULTIPLICACAO, null);
929
- parametro.abrangencia = 'multiplo';
930
- }
931
- else {
932
- parametro.abrangencia = 'padrao';
933
- }
934
- parametro.nome = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
935
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
936
- parametro.valorPadrao = this.primario();
937
- }
938
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
939
- let tipoDadoParametro = this.verificarDefinicaoTipoAtual();
940
- parametro.tipoDado = {
941
- nome: this.simbolos[this.atual - 2].lexema,
942
- tipo: tipoDadoParametro,
943
- tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null,
944
- };
945
- this.avancarEDevolverAnterior();
946
- }
947
- parametros.push(parametro);
948
- if (parametro.abrangencia === 'multiplo')
949
- break;
950
- } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
951
- return parametros;
952
- }
953
- corpoDaFuncao(tipo) {
954
- // O parêntese esquerdo é considerado o símbolo inicial para
955
- // fins de pragma.
956
- const parenteseEsquerdo = this.consumir(delegua_2.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
957
- let parametros = [];
958
- if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
959
- parametros = this.logicaComumParametros();
960
- }
961
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
962
- let tipoRetorno = null;
963
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
964
- tipoRetorno = this.verificarDefinicaoTipoAtual();
965
- this.avancarEDevolverAnterior();
966
- }
967
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
968
- const corpo = this.blocoEscopo();
969
- return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
970
- }
971
- declaracaoDeClasse() {
972
- const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
973
- const pilhaDecoradoresClasse = this.pilhaDecoradores;
974
- let superClasse = null;
975
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
976
- this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
977
- superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
978
- }
979
- this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
980
- this.pilhaDecoradores = [];
981
- const metodos = [];
982
- const propriedades = [];
983
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
984
- // Se o símbolo atual é arroba, é um decorador.
985
- // Caso contrário, verificamos o próximo símbolo.
986
- if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
987
- this.resolverDecorador();
988
- continue;
989
- }
990
- // Se o próximo símbolo ao atual for um parênteses, é um método.
991
- // Caso contrário, é uma propriedade.
992
- const proximoSimbolo = this.simbolos[this.atual + 1];
993
- switch (proximoSimbolo.tipo) {
994
- case delegua_2.default.PARENTESE_ESQUERDO:
995
- metodos.push(this.funcao('método'));
996
- this.pilhaDecoradores = [];
997
- break;
998
- case delegua_2.default.DOIS_PONTOS:
999
- const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
1000
- this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
1001
- const tipoPropriedade = this.avancarEDevolverAnterior();
1002
- this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1003
- propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
1004
- this.pilhaDecoradores = [];
1005
- break;
1006
- default:
1007
- throw this.erro(this.simbolos[this.atual], 'Esperado definição de método ou propriedade.');
1008
- }
1009
- }
1010
- this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
1011
- return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
1012
- }
1013
- /**
1014
- * Declarações fora de bloco precisam ser verificadas primeiro porque
1015
- * não é possível declarar uma classe/função dentro de um bloco `enquanto`,
1016
- * `fazer ... enquanto`, `para`, `escolha`, etc.
1017
- * @returns Uma função ou classe se o símbolo atual resolver aqui.
1018
- * O retorno de `resolverDeclaracao()` em caso contrário.
1019
- * @see resolverDeclaracao
1020
- */
1021
- resolverDeclaracaoForaDeBloco() {
1022
- try {
1023
- if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1024
- this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1025
- this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
1026
- this.avancarEDevolverAnterior();
1027
- return this.funcao('funcao');
1028
- }
1029
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CLASSE)) {
1030
- return this.declaracaoDeClasse();
1031
- }
1032
- return this.resolverDeclaracao();
1033
- }
1034
- catch (erro) {
1035
- this.sincronizar();
1036
- this.erros.push(erro);
1037
- return null;
1038
- }
1039
- }
1040
- /**
1041
- * Usado quando há erros na avaliação sintática.
1042
- * Garante que o código não entre em loop infinito.
1043
- * @returns Sempre retorna `void`.
1044
- */
1045
- sincronizar() {
1046
- this.avancarEDevolverAnterior();
1047
- while (!this.estaNoFinal()) {
1048
- const tipoSimboloAtual = this.simbolos[this.atual - 1].tipo;
1049
- switch (tipoSimboloAtual) {
1050
- case delegua_2.default.CLASSE:
1051
- case delegua_2.default.FUNCAO:
1052
- case delegua_2.default.FUNÇÃO:
1053
- case delegua_2.default.VARIAVEL:
1054
- case delegua_2.default.PARA:
1055
- case delegua_2.default.SE:
1056
- case delegua_2.default.ENQUANTO:
1057
- case delegua_2.default.ESCREVA:
1058
- case delegua_2.default.RETORNA:
1059
- return;
1060
- }
1061
- this.avancarEDevolverAnterior();
1062
- }
1063
- }
1064
- analisar(retornoLexador, hashArquivo) {
1065
- const inicioAnalise = (0, browser_process_hrtime_1.default)();
1066
- this.erros = [];
1067
- this.atual = 0;
1068
- this.blocos = 0;
1069
- this.hashArquivo = hashArquivo || 0;
1070
- this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
1071
- this.pilhaDecoradores = [];
1072
- let declaracoes = [];
1073
- while (!this.estaNoFinal()) {
1074
- this.resolverDecorador();
1075
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
1076
- if (Array.isArray(retornoDeclaracao)) {
1077
- declaracoes = declaracoes.concat(retornoDeclaracao);
1078
- }
1079
- else {
1080
- declaracoes.push(retornoDeclaracao);
1081
- }
1082
- }
1083
- if (this.performance) {
1084
- const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
1085
- console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
1086
- }
1087
- return {
1088
- declaracoes: declaracoes,
1089
- erros: this.erros,
1090
- };
1091
- }
1092
- }
1093
- exports.AvaliadorSintatico = AvaliadorSintatico;
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.AvaliadorSintatico = void 0;
7
+ const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
8
+ const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
9
+ const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
10
+ const construtos_1 = require("../construtos");
11
+ const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
12
+ const tuplas_1 = require("../construtos/tuplas");
13
+ const declaracoes_1 = require("../declaracoes");
14
+ const lexador_1 = require("../lexador");
15
+ /**
16
+ * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
17
+ * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
18
+ * Há dois grupos de estruturas de alto nível: Construtos e Declarações.
19
+ */
20
+ class AvaliadorSintatico {
21
+ constructor(performance = false) {
22
+ this.hashArquivo = 0;
23
+ this.atual = 0;
24
+ this.blocos = 0;
25
+ this.erros = [];
26
+ this.performance = performance;
27
+ }
28
+ declaracaoDeVariavel() {
29
+ throw new Error('Método não implementado.');
30
+ }
31
+ erro(simbolo, mensagemDeErro) {
32
+ const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
33
+ this.erros.push(excecao);
34
+ return excecao;
35
+ }
36
+ consumir(tipo, mensagemDeErro) {
37
+ if (this.verificarTipoSimboloAtual(tipo))
38
+ return this.avancarEDevolverAnterior();
39
+ throw this.erro(this.simbolos[this.atual], mensagemDeErro);
40
+ }
41
+ verificarTipoSimboloAtual(tipo) {
42
+ if (this.estaNoFinal())
43
+ return false;
44
+ return this.simbolos[this.atual].tipo === tipo;
45
+ }
46
+ verificarTipoProximoSimbolo(tipo) {
47
+ return this.simbolos[this.atual + 1].tipo === tipo;
48
+ }
49
+ verificarDefinicaoTipoAtual() {
50
+ const tipos = [...Object.values(delegua_1.default)];
51
+ const lexema = this.simboloAtual().lexema.toLowerCase();
52
+ const contemTipo = tipos.find((tipo) => tipo === lexema);
53
+ if (contemTipo && this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
54
+ const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
55
+ this.avancarEDevolverAnterior();
56
+ if (!this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_DIREITO)) {
57
+ throw this.erro(this.simbolos[this.atual], "Esperado símbolo de fechamento do vetor ']'.");
58
+ }
59
+ const contemTipoVetor = tiposVetores.find((tipo) => tipo === `${lexema}[]`);
60
+ this.avancarEDevolverAnterior();
61
+ return contemTipoVetor;
62
+ }
63
+ return contemTipo;
64
+ }
65
+ simboloAtual() {
66
+ return this.simbolos[this.atual];
67
+ }
68
+ simboloAnterior() {
69
+ return this.simbolos[this.atual - 1];
70
+ }
71
+ estaNoFinal() {
72
+ return this.atual === this.simbolos.length;
73
+ }
74
+ avancarEDevolverAnterior() {
75
+ if (!this.estaNoFinal())
76
+ this.atual += 1;
77
+ return this.simbolos[this.atual - 1];
78
+ }
79
+ verificarSeSimboloAtualEIgualA(...argumentos) {
80
+ for (let i = 0; i < argumentos.length; i++) {
81
+ const tipoAtual = argumentos[i];
82
+ if (this.verificarTipoSimboloAtual(tipoAtual)) {
83
+ this.avancarEDevolverAnterior();
84
+ return true;
85
+ }
86
+ }
87
+ return false;
88
+ }
89
+ primario() {
90
+ const simboloAtual = this.simbolos[this.atual];
91
+ let valores = [];
92
+ switch (simboloAtual.tipo) {
93
+ case delegua_2.default.CHAVE_ESQUERDA:
94
+ this.avancarEDevolverAnterior();
95
+ const chaves = [];
96
+ valores = [];
97
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
98
+ return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
99
+ }
100
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
101
+ const chave = this.atribuir();
102
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
103
+ const valor = this.atribuir();
104
+ chaves.push(chave);
105
+ valores.push(valor);
106
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
107
+ this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
108
+ }
109
+ }
110
+ return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
111
+ case delegua_2.default.COLCHETE_ESQUERDO:
112
+ this.avancarEDevolverAnterior();
113
+ valores = [];
114
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
115
+ return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
116
+ }
117
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
118
+ let valor = null;
119
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
120
+ const expressao = this.expressao();
121
+ const argumentos = [expressao];
122
+ while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
123
+ this.avancarEDevolverAnterior();
124
+ argumentos.push(this.expressao());
125
+ }
126
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
127
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
128
+ return new tuplas_1.SeletorTuplas(...argumentos);
129
+ }
130
+ valor = this.atribuir();
131
+ valores.push(valor);
132
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
133
+ this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
134
+ }
135
+ }
136
+ return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
137
+ case delegua_2.default.FALSO:
138
+ this.avancarEDevolverAnterior();
139
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
140
+ case delegua_2.default.FUNCAO:
141
+ case delegua_2.default.FUNÇÃO:
142
+ const simboloFuncao = this.avancarEDevolverAnterior();
143
+ return this.corpoDaFuncao(simboloFuncao.lexema);
144
+ case delegua_2.default.IDENTIFICADOR:
145
+ const simboloIdentificador = this.avancarEDevolverAnterior();
146
+ // Se o próximo símbolo é um incremento ou um decremento,
147
+ // aqui deve retornar um unário correspondente.
148
+ // Caso contrário, apenas retornar um construto de variável.
149
+ if (this.simbolos[this.atual] &&
150
+ [delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR].includes(this.simbolos[this.atual].tipo)) {
151
+ const simboloIncrementoDecremento = this.avancarEDevolverAnterior();
152
+ return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador), 'DEPOIS');
153
+ }
154
+ return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador);
155
+ case delegua_2.default.IMPORTAR:
156
+ this.avancarEDevolverAnterior();
157
+ return this.declaracaoImportar();
158
+ case delegua_2.default.ISTO:
159
+ this.avancarEDevolverAnterior();
160
+ return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
161
+ case delegua_2.default.NULO:
162
+ this.avancarEDevolverAnterior();
163
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null);
164
+ case delegua_2.default.NUMERO:
165
+ case delegua_2.default.TEXTO:
166
+ const simboloNumeroTexto = this.avancarEDevolverAnterior();
167
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal);
168
+ case delegua_2.default.PARENTESE_ESQUERDO:
169
+ this.avancarEDevolverAnterior();
170
+ const expressao = this.expressao();
171
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
172
+ return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
173
+ case delegua_2.default.SUPER:
174
+ const simboloSuper = this.avancarEDevolverAnterior();
175
+ // Se o próximo símbolo for uma abertura de parênteses, significa que
176
+ // é uma chamada ao construtor da classe ancestral (superclasse).
177
+ // Se o próximo símbolo for um ponto, significa que é uma chamada
178
+ // a um método da superclasse.
179
+ switch (this.simbolos[this.atual].tipo) {
180
+ case delegua_2.default.PARENTESE_ESQUERDO:
181
+ return new construtos_1.Super(this.hashArquivo, simboloSuper, new lexador_1.Simbolo(delegua_2.default.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo));
182
+ default:
183
+ this.consumir(delegua_2.default.PONTO, "Esperado '.' após 'super'.");
184
+ const metodoSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
185
+ return new construtos_1.Super(this.hashArquivo, simboloSuper, metodoSuperclasse);
186
+ }
187
+ case delegua_2.default.VERDADEIRO:
188
+ this.avancarEDevolverAnterior();
189
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
190
+ case delegua_2.default.TIPO:
191
+ this.avancarEDevolverAnterior();
192
+ this.consumir(delegua_2.default.DE, "Esperado 'de' após 'tipo'.");
193
+ let _expressao;
194
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESCREVA, delegua_2.default.LEIA, delegua_2.default.FUNCAO, delegua_2.default.FUNÇÃO, delegua_2.default.SE, delegua_2.default.ENQUANTO, delegua_2.default.PARA, delegua_2.default.RETORNA, delegua_1.default.INTEIRO, delegua_1.default.TEXTO, delegua_1.default.VETOR, delegua_1.default.LOGICO, delegua_1.default.LÓGICO, delegua_1.default.VAZIO)) {
195
+ _expressao = this.simboloAnterior();
196
+ }
197
+ else {
198
+ _expressao = this.expressao();
199
+ }
200
+ return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, _expressao instanceof construtos_1.Literal ? _expressao.valor : _expressao);
201
+ case delegua_2.default.EXPRESSAO_REGULAR:
202
+ let valor = '';
203
+ let linhaAtual = this.simbolos[this.atual].linha;
204
+ let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
205
+ .length %
206
+ 2 ===
207
+ 0;
208
+ if (eParExpressaoRegular) {
209
+ this.avancarEDevolverAnterior();
210
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
211
+ valor += this.simboloAtual().lexema || '';
212
+ this.avancarEDevolverAnterior();
213
+ }
214
+ this.avancarEDevolverAnterior();
215
+ return new construtos_1.ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
216
+ }
217
+ }
218
+ throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
219
+ }
220
+ finalizarChamada(entidadeChamada) {
221
+ const argumentos = [];
222
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
223
+ do {
224
+ if (argumentos.length >= 255) {
225
+ throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
226
+ }
227
+ argumentos.push(this.expressao());
228
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
229
+ }
230
+ const parenteseDireito = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
231
+ return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
232
+ }
233
+ chamar() {
234
+ let expressao = this.primario();
235
+ while (true) {
236
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
237
+ expressao = this.finalizarChamada(expressao);
238
+ }
239
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
240
+ const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
241
+ expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
242
+ }
243
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
244
+ const indice = this.expressao();
245
+ const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
246
+ expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
247
+ }
248
+ else {
249
+ break;
250
+ }
251
+ }
252
+ return expressao;
253
+ }
254
+ unario() {
255
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.NEGACAO, delegua_2.default.SUBTRACAO, delegua_2.default.BIT_NOT, delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR)) {
256
+ const operador = this.simbolos[this.atual - 1];
257
+ const direito = this.unario();
258
+ return new construtos_1.Unario(this.hashArquivo, operador, direito, 'ANTES');
259
+ }
260
+ return this.chamar();
261
+ }
262
+ exponenciacao() {
263
+ let expressao = this.unario();
264
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
265
+ const operador = this.simbolos[this.atual - 1];
266
+ const direito = this.unario();
267
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
268
+ }
269
+ return expressao;
270
+ }
271
+ multiplicar() {
272
+ let expressao = this.exponenciacao();
273
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIVISAO, delegua_2.default.DIVISAO_IGUAL, delegua_2.default.DIVISAO_INTEIRA, delegua_2.default.DIVISAO_INTEIRA_IGUAL, delegua_2.default.MODULO, delegua_2.default.MODULO_IGUAL, delegua_2.default.MULTIPLICACAO, delegua_2.default.MULTIPLICACAO_IGUAL)) {
274
+ const operador = this.simbolos[this.atual - 1];
275
+ const direito = this.exponenciacao();
276
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
277
+ }
278
+ return expressao;
279
+ }
280
+ /**
281
+ * Se símbolo de operação é `+`, `-`, `+=` ou `-=`, monta objeto `Binario` para
282
+ * ser avaliado pelo Interpretador.
283
+ * @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
284
+ */
285
+ adicaoOuSubtracao() {
286
+ let expressao = this.multiplicar();
287
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MAIS_IGUAL, delegua_2.default.MENOS_IGUAL)) {
288
+ const operador = this.simbolos[this.atual - 1];
289
+ const direito = this.multiplicar();
290
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
291
+ }
292
+ return expressao;
293
+ }
294
+ bitShift() {
295
+ let expressao = this.adicaoOuSubtracao();
296
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MENOR_MENOR, delegua_2.default.MAIOR_MAIOR)) {
297
+ const operador = this.simbolos[this.atual - 1];
298
+ const direito = this.adicaoOuSubtracao();
299
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
300
+ }
301
+ return expressao;
302
+ }
303
+ bitE() {
304
+ let expressao = this.bitShift();
305
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_AND)) {
306
+ const operador = this.simbolos[this.atual - 1];
307
+ const direito = this.bitShift();
308
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
309
+ }
310
+ return expressao;
311
+ }
312
+ bitOu() {
313
+ let expressao = this.bitE();
314
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_OR, delegua_2.default.BIT_XOR)) {
315
+ const operador = this.simbolos[this.atual - 1];
316
+ const direito = this.bitE();
317
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
318
+ }
319
+ return expressao;
320
+ }
321
+ comparar() {
322
+ let expressao = this.bitOu();
323
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
324
+ const operador = this.simbolos[this.atual - 1];
325
+ const direito = this.bitOu();
326
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
327
+ }
328
+ return expressao;
329
+ }
330
+ comparacaoIgualdade() {
331
+ let expressao = this.comparar();
332
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIFERENTE, delegua_2.default.IGUAL_IGUAL)) {
333
+ const operador = this.simbolos[this.atual - 1];
334
+ const direito = this.comparar();
335
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
336
+ }
337
+ return expressao;
338
+ }
339
+ em() {
340
+ let expressao = this.comparacaoIgualdade();
341
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EM)) {
342
+ const operador = this.simbolos[this.atual - 1];
343
+ const direito = this.comparacaoIgualdade();
344
+ expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
345
+ }
346
+ return expressao;
347
+ }
348
+ e() {
349
+ let expressao = this.em();
350
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.E)) {
351
+ const operador = this.simbolos[this.atual - 1];
352
+ const direito = this.em();
353
+ expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
354
+ }
355
+ return expressao;
356
+ }
357
+ ou() {
358
+ let expressao = this.e();
359
+ while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.OU)) {
360
+ const operador = this.simbolos[this.atual - 1];
361
+ const direito = this.e();
362
+ expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
363
+ }
364
+ return expressao;
365
+ }
366
+ /**
367
+ * Método que resolve atribuições.
368
+ * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
369
+ */
370
+ atribuir() {
371
+ const expressao = this.ou();
372
+ if (expressao instanceof construtos_1.Binario &&
373
+ [
374
+ delegua_2.default.MAIS_IGUAL,
375
+ delegua_2.default.MENOS_IGUAL,
376
+ delegua_2.default.MULTIPLICACAO_IGUAL,
377
+ delegua_2.default.DIVISAO_IGUAL,
378
+ delegua_2.default.DIVISAO_INTEIRA_IGUAL,
379
+ delegua_2.default.MODULO_IGUAL,
380
+ ].includes(expressao.operador.tipo)) {
381
+ let simbolo = expressao.esquerda.simbolo;
382
+ if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
383
+ simbolo = expressao.esquerda.entidadeChamada.simbolo;
384
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, expressao.esquerda.indice);
385
+ }
386
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
387
+ }
388
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
389
+ const igual = this.simbolos[this.atual - 1];
390
+ const valor = this.expressao();
391
+ if (expressao instanceof construtos_1.Variavel) {
392
+ const simbolo = expressao.simbolo;
393
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
394
+ }
395
+ else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
396
+ const get = expressao;
397
+ return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
398
+ }
399
+ else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
400
+ return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
401
+ }
402
+ this.erro(igual, 'Tarefa de atribuição inválida');
403
+ }
404
+ return expressao;
405
+ }
406
+ expressao() {
407
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.LEIA))
408
+ return this.declaracaoLeia();
409
+ return this.atribuir();
410
+ }
411
+ blocoEscopo() {
412
+ let declaracoes = [];
413
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
414
+ const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
415
+ if (Array.isArray(retornoDeclaracao)) {
416
+ declaracoes = declaracoes.concat(retornoDeclaracao);
417
+ }
418
+ else {
419
+ declaracoes.push(retornoDeclaracao);
420
+ }
421
+ }
422
+ this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
423
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
424
+ return declaracoes;
425
+ }
426
+ declaracaoEnquanto() {
427
+ try {
428
+ this.blocos += 1;
429
+ const condicao = this.expressao();
430
+ const corpo = this.resolverDeclaracao();
431
+ return new declaracoes_1.Enquanto(condicao, corpo);
432
+ }
433
+ finally {
434
+ this.blocos -= 1;
435
+ }
436
+ }
437
+ declaracaoEscreva() {
438
+ const simboloAtual = this.simbolos[this.atual];
439
+ this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
440
+ const argumentos = [];
441
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
442
+ do {
443
+ argumentos.push(this.expressao());
444
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
445
+ }
446
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
447
+ // Ponto-e-vírgula é opcional aqui.
448
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
449
+ return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
450
+ }
451
+ declaracaoExpressao() {
452
+ const expressao = this.expressao();
453
+ // Ponto-e-vírgula é opcional aqui.
454
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
455
+ return new declaracoes_1.Expressao(expressao);
456
+ }
457
+ declaracaoComentarioMultilinha() {
458
+ let simboloComentario;
459
+ const conteudos = [];
460
+ do {
461
+ simboloComentario = this.avancarEDevolverAnterior();
462
+ conteudos.push(simboloComentario.literal);
463
+ } while (simboloComentario.tipo === delegua_2.default.LINHA_COMENTARIO);
464
+ return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, conteudos, true);
465
+ }
466
+ declaracaoComentarioUmaLinha() {
467
+ const simboloComentario = this.avancarEDevolverAnterior();
468
+ return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, simboloComentario.literal, false);
469
+ }
470
+ declaracaoContinua() {
471
+ if (this.blocos < 1) {
472
+ this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
473
+ }
474
+ // Ponto-e-vírgula é opcional aqui.
475
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
476
+ return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
477
+ }
478
+ declaracaoEscolha() {
479
+ try {
480
+ this.blocos += 1;
481
+ const condicao = this.expressao();
482
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
483
+ const caminhos = [];
484
+ let caminhoPadrao = null;
485
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
486
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
487
+ const caminhoCondicoes = [this.expressao()];
488
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
489
+ while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
490
+ this.consumir(delegua_2.default.CASO, null);
491
+ caminhoCondicoes.push(this.expressao());
492
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
493
+ }
494
+ let declaracoes = [];
495
+ do {
496
+ const retornoDeclaracao = this.resolverDeclaracao();
497
+ if (Array.isArray(retornoDeclaracao)) {
498
+ declaracoes = declaracoes.concat(retornoDeclaracao);
499
+ }
500
+ else {
501
+ declaracoes.push(retornoDeclaracao);
502
+ }
503
+ } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
504
+ !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
505
+ !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
506
+ caminhos.push({
507
+ condicoes: caminhoCondicoes,
508
+ declaracoes,
509
+ });
510
+ }
511
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PADRAO)) {
512
+ if (caminhoPadrao !== null) {
513
+ const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
514
+ this.erros.push(excecao);
515
+ throw excecao;
516
+ }
517
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
518
+ const declaracoes = [];
519
+ do {
520
+ declaracoes.push(this.resolverDeclaracao());
521
+ } while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
522
+ !this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
523
+ !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
524
+ caminhoPadrao = {
525
+ declaracoes,
526
+ };
527
+ }
528
+ }
529
+ return new declaracoes_1.Escolha(condicao, caminhos, caminhoPadrao);
530
+ }
531
+ finally {
532
+ this.blocos -= 1;
533
+ }
534
+ }
535
+ declaracaoFalhar() {
536
+ const simboloFalha = this.simbolos[this.atual - 1];
537
+ return new declaracoes_1.Falhar(simboloFalha, this.declaracaoExpressao().expressao);
538
+ }
539
+ declaracaoFazer() {
540
+ const simboloFazer = this.simbolos[this.atual - 1];
541
+ try {
542
+ this.blocos += 1;
543
+ const caminhoFazer = this.resolverDeclaracao();
544
+ this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
545
+ const condicaoEnquanto = this.expressao();
546
+ return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
547
+ }
548
+ finally {
549
+ this.blocos -= 1;
550
+ }
551
+ }
552
+ declaracaoImportar() {
553
+ this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
554
+ const caminho = this.expressao();
555
+ const simboloFechamento = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
556
+ return new declaracoes_1.Importar(caminho, simboloFechamento);
557
+ }
558
+ /**
559
+ * Declaração para comando `leia`, para ler dados de entrada do usuário.
560
+ * @returns Um objeto da classe `Leia`.
561
+ */
562
+ declaracaoLeia() {
563
+ const simboloLeia = this.simbolos[this.atual];
564
+ this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos argumentos em instrução `leia`.");
565
+ const argumentos = [];
566
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
567
+ do {
568
+ argumentos.push(this.expressao());
569
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
570
+ }
571
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
572
+ return new declaracoes_1.Leia(simboloLeia, argumentos);
573
+ }
574
+ declaracaoPara() {
575
+ try {
576
+ const simboloPara = this.simbolos[this.atual - 1];
577
+ this.blocos += 1;
578
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
579
+ return this.declaracaoParaCada(simboloPara);
580
+ }
581
+ return this.declaracaoParaTradicional(simboloPara);
582
+ }
583
+ finally {
584
+ this.blocos -= 1;
585
+ }
586
+ }
587
+ declaracaoParaCada(simboloPara) {
588
+ const nomeVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
589
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
590
+ throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
591
+ }
592
+ const vetor = this.expressao();
593
+ const corpo = this.resolverDeclaracao();
594
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
595
+ }
596
+ declaracaoParaTradicional(simboloPara) {
597
+ const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
598
+ let inicializador;
599
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA)) {
600
+ inicializador = null;
601
+ }
602
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VARIAVEL)) {
603
+ inicializador = this.declaracaoDeVariaveis();
604
+ }
605
+ else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CONSTANTE)) {
606
+ inicializador = this.declaracaoDeConstantes();
607
+ }
608
+ else {
609
+ inicializador = this.declaracaoExpressao();
610
+ }
611
+ let condicao = null;
612
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PONTO_E_VIRGULA)) {
613
+ condicao = this.expressao();
614
+ }
615
+ // Ponto-e-vírgula é opcional aqui.
616
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
617
+ let incrementar = null;
618
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
619
+ incrementar = this.expressao();
620
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR);
621
+ }
622
+ if (comParenteses) {
623
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
624
+ }
625
+ const corpo = this.resolverDeclaracao();
626
+ return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
627
+ }
628
+ declaracaoRetorna() {
629
+ const simboloChave = this.simbolos[this.atual - 1];
630
+ let valor = null;
631
+ if ([
632
+ delegua_2.default.CHAVE_ESQUERDA,
633
+ delegua_2.default.COLCHETE_ESQUERDO,
634
+ delegua_2.default.FALSO,
635
+ delegua_2.default.IDENTIFICADOR,
636
+ delegua_2.default.ISTO,
637
+ delegua_2.default.NEGACAO,
638
+ delegua_2.default.NUMERO,
639
+ delegua_2.default.NULO,
640
+ delegua_2.default.PARENTESE_ESQUERDO,
641
+ delegua_2.default.SUPER,
642
+ delegua_2.default.TEXTO,
643
+ delegua_2.default.VERDADEIRO,
644
+ ].includes(this.simbolos[this.atual].tipo)) {
645
+ valor = this.expressao();
646
+ }
647
+ // Ponto-e-vírgula é opcional aqui.
648
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
649
+ return new declaracoes_1.Retorna(simboloChave, valor);
650
+ }
651
+ declaracaoSe() {
652
+ const condicao = this.expressao();
653
+ const caminhoEntao = this.resolverDeclaracao();
654
+ let caminhoSenao = null;
655
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
656
+ caminhoSenao = this.resolverDeclaracao();
657
+ }
658
+ return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
659
+ }
660
+ declaracaoSustar() {
661
+ if (this.blocos < 1) {
662
+ this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
663
+ }
664
+ // Ponto-e-vírgula é opcional aqui.
665
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
666
+ return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
667
+ }
668
+ declaracaoTente() {
669
+ const simboloTente = this.simbolos[this.atual - 1];
670
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
671
+ const blocoTente = this.blocoEscopo();
672
+ let blocoPegue = null;
673
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PEGUE)) {
674
+ if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_ESQUERDO)) {
675
+ // Caso 1: com parâmetro de erro.
676
+ // `pegue` recebe um `FuncaoConstruto`.
677
+ blocoPegue = this.corpoDaFuncao('bloco `pegue`');
678
+ }
679
+ else {
680
+ // Caso 2: sem parâmetro de erro.
681
+ // `pegue` recebe um bloco.
682
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
683
+ blocoPegue = this.blocoEscopo();
684
+ }
685
+ }
686
+ let blocoSenao = null;
687
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
688
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
689
+ blocoSenao = this.blocoEscopo();
690
+ }
691
+ let blocoFinalmente = null;
692
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.FINALMENTE)) {
693
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
694
+ blocoFinalmente = this.blocoEscopo();
695
+ }
696
+ return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
697
+ }
698
+ resolverDecorador() {
699
+ this.pilhaDecoradores = [];
700
+ while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
701
+ let nomeDecorador = '';
702
+ let linha;
703
+ let parametros = [];
704
+ let parenteseEsquerdo = false;
705
+ linha = this.simbolos[this.atual].linha;
706
+ let simbolosLinhaAtual = this.simbolos.filter((l) => l.linha === linha);
707
+ for (let simbolo of simbolosLinhaAtual) {
708
+ parenteseEsquerdo = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
709
+ if (parenteseEsquerdo) {
710
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
711
+ parametros = this.logicaComumParametros();
712
+ }
713
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
714
+ break;
715
+ }
716
+ this.avancarEDevolverAnterior();
717
+ nomeDecorador += simbolo.lexema || '.';
718
+ }
719
+ this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, parametros));
720
+ }
721
+ }
722
+ /**
723
+ * Todas as resoluções triviais da linguagem, ou seja, todas as
724
+ * resoluções que podem ocorrer dentro ou fora de um bloco.
725
+ * @returns Normalmente uma `Declaracao`, mas há casos em que
726
+ * outros objetos podem ser retornados.
727
+ * @see resolverDeclaracaoForaDeBloco para as declarações que não podem
728
+ * ocorrer em blocos de escopo elementares.
729
+ */
730
+ resolverDeclaracao() {
731
+ switch (this.simbolos[this.atual].tipo) {
732
+ case delegua_2.default.CHAVE_ESQUERDA:
733
+ const simboloInicioBloco = this.avancarEDevolverAnterior();
734
+ return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
735
+ case delegua_2.default.COMENTARIO:
736
+ return this.declaracaoComentarioUmaLinha();
737
+ case delegua_2.default.CONSTANTE:
738
+ this.avancarEDevolverAnterior();
739
+ return this.declaracaoDeConstantes();
740
+ case delegua_2.default.CONTINUA:
741
+ this.avancarEDevolverAnterior();
742
+ return this.declaracaoContinua();
743
+ case delegua_2.default.ENQUANTO:
744
+ this.avancarEDevolverAnterior();
745
+ return this.declaracaoEnquanto();
746
+ case delegua_2.default.ESCOLHA:
747
+ this.avancarEDevolverAnterior();
748
+ return this.declaracaoEscolha();
749
+ case delegua_2.default.ESCREVA:
750
+ this.avancarEDevolverAnterior();
751
+ return this.declaracaoEscreva();
752
+ case delegua_2.default.FALHAR:
753
+ this.avancarEDevolverAnterior();
754
+ return this.declaracaoFalhar();
755
+ case delegua_2.default.FAZER:
756
+ this.avancarEDevolverAnterior();
757
+ return this.declaracaoFazer();
758
+ case delegua_2.default.LINHA_COMENTARIO:
759
+ return this.declaracaoComentarioMultilinha();
760
+ case delegua_2.default.PARA:
761
+ this.avancarEDevolverAnterior();
762
+ return this.declaracaoPara();
763
+ case delegua_2.default.PAUSA:
764
+ case delegua_2.default.SUSTAR:
765
+ this.avancarEDevolverAnterior();
766
+ return this.declaracaoSustar();
767
+ case delegua_2.default.SE:
768
+ this.avancarEDevolverAnterior();
769
+ return this.declaracaoSe();
770
+ case delegua_2.default.RETORNA:
771
+ this.avancarEDevolverAnterior();
772
+ return this.declaracaoRetorna();
773
+ case delegua_2.default.TENDO:
774
+ this.avancarEDevolverAnterior();
775
+ return this.declaracaoTendoComo();
776
+ case delegua_2.default.TENTE:
777
+ this.avancarEDevolverAnterior();
778
+ return this.declaracaoTente();
779
+ case delegua_2.default.VARIAVEL:
780
+ this.avancarEDevolverAnterior();
781
+ return this.declaracaoDeVariaveis();
782
+ }
783
+ const simboloAtual = this.simbolos[this.atual];
784
+ if (simboloAtual.tipo === delegua_2.default.IDENTIFICADOR) {
785
+ // Pela gramática, a seguinte situação não pode ocorrer:
786
+ // 1. O símbolo anterior ser um identificador; e
787
+ // 2. O símbolo anterior estar na mesma linha do identificador atual.
788
+ const simboloAnterior = this.simbolos[this.atual - 1];
789
+ if (!!simboloAnterior &&
790
+ simboloAnterior.tipo === delegua_2.default.IDENTIFICADOR &&
791
+ simboloAnterior.linha === simboloAtual.linha) {
792
+ this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
793
+ }
794
+ }
795
+ return this.declaracaoExpressao();
796
+ }
797
+ declaracaoTendoComo() {
798
+ const simboloTendo = this.simbolos[this.atual - 1];
799
+ const expressaoInicializacao = this.expressao();
800
+ this.consumir(delegua_2.default.COMO, "Esperado palavra reservada 'como' após expressão de inicialização de variável, em declaração 'tendo'.");
801
+ const simboloNomeVariavel = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
802
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
803
+ const blocoCorpo = this.blocoEscopo();
804
+ return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
805
+ }
806
+ declaracaoDesestruturacaoVariavel() {
807
+ const identificadores = [];
808
+ do {
809
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
810
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
811
+ this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
812
+ this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
813
+ const inicializador = this.expressao();
814
+ // TODO: Para cada variável dos identificadores, emitir um `AcessoMetodoOuPropriedade` usando
815
+ // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
816
+ const retornos = [];
817
+ for (let identificador of identificadores) {
818
+ retornos.push(new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
819
+ }
820
+ return retornos;
821
+ }
822
+ /**
823
+ * Caso símbolo atual seja `var`, devolve uma declaração de variável.
824
+ * @returns Um Construto do tipo Var.
825
+ */
826
+ declaracaoDeVariaveis() {
827
+ const identificadores = [];
828
+ let retorno = [];
829
+ let tipo = null;
830
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
831
+ return this.declaracaoDesestruturacaoVariavel();
832
+ }
833
+ do {
834
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
835
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
836
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
837
+ tipo = this.verificarDefinicaoTipoAtual();
838
+ this.avancarEDevolverAnterior();
839
+ }
840
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
841
+ // Inicialização de variáveis sem valor.
842
+ for (let [indice, identificador] of identificadores.entries()) {
843
+ retorno.push(new declaracoes_1.Var(identificador, null, tipo));
844
+ }
845
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
846
+ return retorno;
847
+ }
848
+ const inicializadores = [];
849
+ do {
850
+ inicializadores.push(this.expressao());
851
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
852
+ if (identificadores.length !== inicializadores.length) {
853
+ throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
854
+ }
855
+ for (let [indice, identificador] of identificadores.entries()) {
856
+ tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
857
+ retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
858
+ }
859
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
860
+ return retorno;
861
+ }
862
+ declaracaoDesestruturacaoConstante() {
863
+ const identificadores = [];
864
+ do {
865
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
866
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
867
+ this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
868
+ this.consumir(delegua_2.default.IGUAL, 'Esperado igual após relação de propriedades da desestruturação.');
869
+ const inicializador = this.expressao();
870
+ // TODO: Para cada variável dos identificadores, emitir um `AcessoMetodoOuPropriedade` usando
871
+ // como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
872
+ const retornos = [];
873
+ for (let identificador of identificadores) {
874
+ retornos.push(new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador)));
875
+ }
876
+ return retornos;
877
+ }
878
+ /**
879
+ * Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
880
+ * @returns Um Construto do tipo Const.
881
+ */
882
+ declaracaoDeConstantes() {
883
+ const identificadores = [];
884
+ let tipo = null;
885
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
886
+ return this.declaracaoDesestruturacaoConstante();
887
+ }
888
+ do {
889
+ identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da constante.'));
890
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
891
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
892
+ tipo = this.verificarDefinicaoTipoAtual();
893
+ this.avancarEDevolverAnterior();
894
+ }
895
+ this.consumir(delegua_2.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
896
+ const inicializadores = [];
897
+ do {
898
+ inicializadores.push(this.expressao());
899
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
900
+ if (identificadores.length !== inicializadores.length) {
901
+ throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
902
+ }
903
+ let retorno = [];
904
+ for (let [indice, identificador] of identificadores.entries()) {
905
+ retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
906
+ }
907
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
908
+ return retorno;
909
+ }
910
+ funcao(tipo) {
911
+ let simbolo;
912
+ switch (this.simbolos[this.atual].tipo) {
913
+ case delegua_2.default.CONSTRUTOR:
914
+ simbolo = this.avancarEDevolverAnterior();
915
+ this.pilhaDecoradores = [];
916
+ break;
917
+ default:
918
+ simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
919
+ break;
920
+ }
921
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, this.pilhaDecoradores);
922
+ }
923
+ logicaComumParametros() {
924
+ const parametros = [];
925
+ do {
926
+ const parametro = {};
927
+ if (this.simbolos[this.atual].tipo === delegua_2.default.MULTIPLICACAO) {
928
+ this.consumir(delegua_2.default.MULTIPLICACAO, null);
929
+ parametro.abrangencia = 'multiplo';
930
+ }
931
+ else {
932
+ parametro.abrangencia = 'padrao';
933
+ }
934
+ parametro.nome = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
935
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
936
+ parametro.valorPadrao = this.primario();
937
+ }
938
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
939
+ let tipoDadoParametro = this.verificarDefinicaoTipoAtual();
940
+ parametro.tipoDado = {
941
+ nome: this.simbolos[this.atual - 2].lexema,
942
+ tipo: tipoDadoParametro,
943
+ tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null,
944
+ };
945
+ this.avancarEDevolverAnterior();
946
+ }
947
+ parametros.push(parametro);
948
+ if (parametro.abrangencia === 'multiplo')
949
+ break;
950
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
951
+ return parametros;
952
+ }
953
+ corpoDaFuncao(tipo) {
954
+ // O parêntese esquerdo é considerado o símbolo inicial para
955
+ // fins de pragma.
956
+ const parenteseEsquerdo = this.consumir(delegua_2.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
957
+ let parametros = [];
958
+ if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
959
+ parametros = this.logicaComumParametros();
960
+ }
961
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
962
+ let tipoRetorno = null;
963
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
964
+ tipoRetorno = this.verificarDefinicaoTipoAtual();
965
+ this.avancarEDevolverAnterior();
966
+ }
967
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
968
+ const corpo = this.blocoEscopo();
969
+ return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
970
+ }
971
+ declaracaoDeClasse() {
972
+ const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
973
+ const pilhaDecoradoresClasse = this.pilhaDecoradores;
974
+ let superClasse = null;
975
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
976
+ this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
977
+ superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
978
+ }
979
+ this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
980
+ this.pilhaDecoradores = [];
981
+ const metodos = [];
982
+ const propriedades = [];
983
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
984
+ // Se o símbolo atual é arroba, é um decorador.
985
+ // Caso contrário, verificamos o próximo símbolo.
986
+ if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
987
+ this.resolverDecorador();
988
+ continue;
989
+ }
990
+ // Se o próximo símbolo ao atual for um parênteses, é um método.
991
+ // Caso contrário, é uma propriedade.
992
+ const proximoSimbolo = this.simbolos[this.atual + 1];
993
+ switch (proximoSimbolo.tipo) {
994
+ case delegua_2.default.PARENTESE_ESQUERDO:
995
+ metodos.push(this.funcao('método'));
996
+ this.pilhaDecoradores = [];
997
+ break;
998
+ case delegua_2.default.DOIS_PONTOS:
999
+ const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
1000
+ this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
1001
+ const tipoPropriedade = this.avancarEDevolverAnterior();
1002
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
1003
+ propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
1004
+ this.pilhaDecoradores = [];
1005
+ break;
1006
+ default:
1007
+ throw this.erro(this.simbolos[this.atual], 'Esperado definição de método ou propriedade.');
1008
+ }
1009
+ }
1010
+ this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
1011
+ return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
1012
+ }
1013
+ /**
1014
+ * Declarações fora de bloco precisam ser verificadas primeiro porque
1015
+ * não é possível declarar uma classe/função dentro de um bloco `enquanto`,
1016
+ * `fazer ... enquanto`, `para`, `escolha`, etc.
1017
+ * @returns Uma função ou classe se o símbolo atual resolver aqui.
1018
+ * O retorno de `resolverDeclaracao()` em caso contrário.
1019
+ * @see resolverDeclaracao
1020
+ */
1021
+ resolverDeclaracaoForaDeBloco() {
1022
+ try {
1023
+ if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
1024
+ this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
1025
+ this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
1026
+ this.avancarEDevolverAnterior();
1027
+ return this.funcao('funcao');
1028
+ }
1029
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CLASSE)) {
1030
+ return this.declaracaoDeClasse();
1031
+ }
1032
+ return this.resolverDeclaracao();
1033
+ }
1034
+ catch (erro) {
1035
+ this.sincronizar();
1036
+ this.erros.push(erro);
1037
+ return null;
1038
+ }
1039
+ }
1040
+ /**
1041
+ * Usado quando há erros na avaliação sintática.
1042
+ * Garante que o código não entre em loop infinito.
1043
+ * @returns Sempre retorna `void`.
1044
+ */
1045
+ sincronizar() {
1046
+ this.avancarEDevolverAnterior();
1047
+ while (!this.estaNoFinal()) {
1048
+ const tipoSimboloAtual = this.simbolos[this.atual - 1].tipo;
1049
+ switch (tipoSimboloAtual) {
1050
+ case delegua_2.default.CLASSE:
1051
+ case delegua_2.default.FUNCAO:
1052
+ case delegua_2.default.FUNÇÃO:
1053
+ case delegua_2.default.VARIAVEL:
1054
+ case delegua_2.default.PARA:
1055
+ case delegua_2.default.SE:
1056
+ case delegua_2.default.ENQUANTO:
1057
+ case delegua_2.default.ESCREVA:
1058
+ case delegua_2.default.RETORNA:
1059
+ return;
1060
+ }
1061
+ this.avancarEDevolverAnterior();
1062
+ }
1063
+ }
1064
+ analisar(retornoLexador, hashArquivo) {
1065
+ const inicioAnalise = (0, browser_process_hrtime_1.default)();
1066
+ this.erros = [];
1067
+ this.atual = 0;
1068
+ this.blocos = 0;
1069
+ this.hashArquivo = hashArquivo || 0;
1070
+ this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
1071
+ this.pilhaDecoradores = [];
1072
+ let declaracoes = [];
1073
+ while (!this.estaNoFinal()) {
1074
+ this.resolverDecorador();
1075
+ const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
1076
+ if (Array.isArray(retornoDeclaracao)) {
1077
+ declaracoes = declaracoes.concat(retornoDeclaracao);
1078
+ }
1079
+ else {
1080
+ declaracoes.push(retornoDeclaracao);
1081
+ }
1082
+ }
1083
+ if (this.performance) {
1084
+ const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
1085
+ console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
1086
+ }
1087
+ return {
1088
+ declaracoes: declaracoes,
1089
+ erros: this.erros,
1090
+ };
1091
+ }
1092
+ }
1093
+ exports.AvaliadorSintatico = AvaliadorSintatico;
1094
1094
  //# sourceMappingURL=avaliador-sintatico.js.map