@designliquido/delegua 0.36.1 → 0.37.0

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