@designliquido/delegua 0.14.7 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +85 -85
  2. package/bin/delegua +2 -2
  3. package/bin/package.json +88 -88
  4. package/fontes/avaliador-sintatico/avaliador-sintatico-base.d.ts +67 -67
  5. package/fontes/avaliador-sintatico/avaliador-sintatico-base.js +215 -215
  6. package/fontes/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  7. package/fontes/avaliador-sintatico/avaliador-sintatico.d.ts +92 -92
  8. package/fontes/avaliador-sintatico/avaliador-sintatico.js +857 -727
  9. package/fontes/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  10. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.d.ts +27 -22
  11. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js +294 -145
  12. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js.map +1 -1
  13. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +69 -69
  14. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +640 -640
  15. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  16. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.d.ts +84 -84
  17. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js +714 -714
  18. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js.map +1 -1
  19. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +20 -20
  20. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +149 -149
  21. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.d.ts +49 -33
  22. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.js +419 -218
  23. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.js.map +1 -1
  24. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.d.ts +73 -73
  25. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.js +534 -534
  26. package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.js.map +1 -1
  27. package/fontes/avaliador-sintatico/dialetos/index.d.ts +5 -5
  28. package/fontes/avaliador-sintatico/dialetos/index.js +21 -21
  29. package/fontes/avaliador-sintatico/erro-avaliador-sintatico.d.ts +5 -5
  30. package/fontes/avaliador-sintatico/erro-avaliador-sintatico.js +11 -11
  31. package/fontes/avaliador-sintatico/index.d.ts +2 -2
  32. package/fontes/avaliador-sintatico/index.js +18 -18
  33. package/fontes/avaliador-sintatico/retornos/index.d.ts +3 -3
  34. package/fontes/avaliador-sintatico/retornos/index.js +19 -19
  35. package/fontes/avaliador-sintatico/retornos/retorno-declaracao.d.ts +3 -3
  36. package/fontes/avaliador-sintatico/retornos/retorno-declaracao.js +2 -2
  37. package/fontes/avaliador-sintatico/retornos/retorno-primario.d.ts +3 -3
  38. package/fontes/avaliador-sintatico/retornos/retorno-primario.js +2 -2
  39. package/fontes/avaliador-sintatico/retornos/retorno-resolver-declaracao.d.ts +2 -2
  40. package/fontes/avaliador-sintatico/retornos/retorno-resolver-declaracao.js +2 -2
  41. package/fontes/bibliotecas/biblioteca-global.d.ts +3 -3
  42. package/fontes/bibliotecas/biblioteca-global.js +315 -315
  43. package/fontes/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts +1 -1
  44. package/fontes/bibliotecas/dialetos/egua-classico/biblioteca-global.js +230 -230
  45. package/fontes/bibliotecas/dialetos/egua-classico/index.d.ts +2 -2
  46. package/fontes/bibliotecas/dialetos/egua-classico/index.js +32 -32
  47. package/fontes/bibliotecas/dialetos/egua-classico/matematica.d.ts +1 -1
  48. package/fontes/bibliotecas/dialetos/egua-classico/matematica.js +478 -478
  49. package/fontes/bibliotecas/dialetos/egua-classico/tempo.d.ts +1 -1
  50. package/fontes/bibliotecas/dialetos/egua-classico/tempo.js +39 -39
  51. package/fontes/bibliotecas/dialetos/egua-classico/textos.d.ts +8 -8
  52. package/fontes/bibliotecas/dialetos/egua-classico/textos.js +201 -201
  53. package/fontes/bibliotecas/primitivas-texto.d.ts +11 -11
  54. package/fontes/bibliotecas/primitivas-texto.js +12 -12
  55. package/fontes/bibliotecas/primitivas-vetor.d.ts +15 -15
  56. package/fontes/bibliotecas/primitivas-vetor.js +33 -33
  57. package/fontes/construtos/acesso-indice-variavel.d.ts +15 -15
  58. package/fontes/construtos/acesso-indice-variavel.js +20 -20
  59. package/fontes/construtos/acesso-metodo.d.ts +14 -14
  60. package/fontes/construtos/acesso-metodo.js +19 -19
  61. package/fontes/construtos/agrupamento.d.ts +14 -14
  62. package/fontes/construtos/agrupamento.js +19 -19
  63. package/fontes/construtos/atribuicao-sobrescrita.d.ts +11 -11
  64. package/fontes/construtos/atribuicao-sobrescrita.js +16 -16
  65. package/fontes/construtos/atribuir.d.ts +10 -10
  66. package/fontes/construtos/atribuir.js +15 -15
  67. package/fontes/construtos/binario.d.ts +22 -22
  68. package/fontes/construtos/binario.js +27 -27
  69. package/fontes/construtos/chamada.d.ts +13 -13
  70. package/fontes/construtos/chamada.js +36 -36
  71. package/fontes/construtos/construto.d.ts +7 -7
  72. package/fontes/construtos/construto.js +2 -2
  73. package/fontes/construtos/definir-valor.d.ts +11 -11
  74. package/fontes/construtos/definir-valor.js +16 -16
  75. package/fontes/construtos/dicionario.d.ts +10 -10
  76. package/fontes/construtos/dicionario.js +15 -15
  77. package/fontes/construtos/formatacao-escrita.d.ts +16 -16
  78. package/fontes/construtos/formatacao-escrita.js +21 -21
  79. package/fontes/construtos/funcao.d.ts +10 -10
  80. package/fontes/construtos/funcao.js +15 -15
  81. package/fontes/construtos/index.d.ts +19 -19
  82. package/fontes/construtos/index.js +35 -35
  83. package/fontes/construtos/isto.d.ts +9 -9
  84. package/fontes/construtos/isto.js +14 -14
  85. package/fontes/construtos/literal.d.ts +10 -10
  86. package/fontes/construtos/literal.js +14 -14
  87. package/fontes/construtos/logico.d.ts +11 -11
  88. package/fontes/construtos/logico.js +16 -16
  89. package/fontes/construtos/super.d.ts +10 -10
  90. package/fontes/construtos/super.js +15 -15
  91. package/fontes/construtos/unario.d.ts +11 -10
  92. package/fontes/construtos/unario.js +16 -15
  93. package/fontes/construtos/unario.js.map +1 -1
  94. package/fontes/construtos/variavel.d.ts +9 -9
  95. package/fontes/construtos/variavel.js +14 -14
  96. package/fontes/construtos/vetor.d.ts +9 -9
  97. package/fontes/construtos/vetor.js +14 -14
  98. package/fontes/declaracoes/bloco.d.ts +7 -7
  99. package/fontes/declaracoes/bloco.js +14 -14
  100. package/fontes/declaracoes/classe.d.ts +9 -9
  101. package/fontes/declaracoes/classe.js +16 -16
  102. package/fontes/declaracoes/continua.d.ts +6 -6
  103. package/fontes/declaracoes/continua.js +13 -13
  104. package/fontes/declaracoes/declaracao.d.ts +8 -8
  105. package/fontes/declaracoes/declaracao.js +17 -17
  106. package/fontes/declaracoes/enquanto.d.ts +9 -9
  107. package/fontes/declaracoes/enquanto.js +15 -15
  108. package/fontes/declaracoes/escolha.d.ts +14 -14
  109. package/fontes/declaracoes/escolha.js +19 -19
  110. package/fontes/declaracoes/escreva-mesma-linha.d.ts +8 -8
  111. package/fontes/declaracoes/escreva-mesma-linha.js +14 -14
  112. package/fontes/declaracoes/escreva.d.ts +8 -8
  113. package/fontes/declaracoes/escreva.js +14 -14
  114. package/fontes/declaracoes/expressao.d.ts +8 -8
  115. package/fontes/declaracoes/expressao.js +14 -14
  116. package/fontes/declaracoes/fazer.d.ts +8 -8
  117. package/fontes/declaracoes/fazer.js +15 -15
  118. package/fontes/declaracoes/funcao.d.ts +9 -9
  119. package/fontes/declaracoes/funcao.js +15 -15
  120. package/fontes/declaracoes/importar.d.ts +9 -9
  121. package/fontes/declaracoes/importar.js +15 -15
  122. package/fontes/declaracoes/index.d.ts +19 -19
  123. package/fontes/declaracoes/index.js +35 -35
  124. package/fontes/declaracoes/leia.d.ts +12 -12
  125. package/fontes/declaracoes/leia.js +18 -18
  126. package/fontes/declaracoes/para.d.ts +10 -10
  127. package/fontes/declaracoes/para.js +17 -17
  128. package/fontes/declaracoes/retorna.d.ts +8 -8
  129. package/fontes/declaracoes/retorna.js +15 -15
  130. package/fontes/declaracoes/se.d.ts +11 -11
  131. package/fontes/declaracoes/se.js +17 -17
  132. package/fontes/declaracoes/sustar.d.ts +6 -6
  133. package/fontes/declaracoes/sustar.js +13 -13
  134. package/fontes/declaracoes/tente.d.ts +14 -14
  135. package/fontes/declaracoes/tente.js +20 -20
  136. package/fontes/declaracoes/var.d.ts +9 -9
  137. package/fontes/declaracoes/var.js +15 -15
  138. package/fontes/depuracao/cyrb53.d.ts +9 -9
  139. package/fontes/depuracao/cyrb53.js +22 -22
  140. package/fontes/depuracao/index.d.ts +2 -2
  141. package/fontes/depuracao/index.js +23 -23
  142. package/fontes/depuracao/ponto-parada.d.ts +4 -4
  143. package/fontes/depuracao/ponto-parada.js +2 -2
  144. package/fontes/espaco-variaveis.d.ts +19 -19
  145. package/fontes/espaco-variaveis.js +19 -19
  146. package/fontes/estruturas/chamavel.d.ts +5 -5
  147. package/fontes/estruturas/chamavel.js +12 -12
  148. package/fontes/estruturas/classe-padrao.d.ts +17 -17
  149. package/fontes/estruturas/classe-padrao.js +28 -28
  150. package/fontes/estruturas/delegua-classe.d.ts +16 -16
  151. package/fontes/estruturas/delegua-classe.js +38 -38
  152. package/fontes/estruturas/delegua-funcao.d.ts +18 -18
  153. package/fontes/estruturas/delegua-funcao.js +60 -60
  154. package/fontes/estruturas/funcao-padrao.d.ts +12 -12
  155. package/fontes/estruturas/funcao-padrao.js +22 -22
  156. package/fontes/estruturas/index.d.ts +9 -9
  157. package/fontes/estruturas/index.js +25 -25
  158. package/fontes/estruturas/metodo-primitiva.d.ts +17 -17
  159. package/fontes/estruturas/metodo-primitiva.js +26 -26
  160. package/fontes/estruturas/modulo.d.ts +9 -9
  161. package/fontes/estruturas/modulo.js +13 -13
  162. package/fontes/estruturas/objeto-delegua-classe.d.ts +10 -10
  163. package/fontes/estruturas/objeto-delegua-classe.js +26 -26
  164. package/fontes/estruturas/objeto-padrao.d.ts +9 -9
  165. package/fontes/estruturas/objeto-padrao.js +21 -21
  166. package/fontes/excecoes/erro-em-tempo-de-execucao.d.ts +7 -7
  167. package/fontes/excecoes/erro-em-tempo-de-execucao.js +13 -13
  168. package/fontes/excecoes/index.d.ts +1 -1
  169. package/fontes/excecoes/index.js +17 -17
  170. package/fontes/formatadores/delegua.d.ts +18 -18
  171. package/fontes/formatadores/delegua.js +82 -82
  172. package/fontes/formatadores/index.d.ts +1 -1
  173. package/fontes/formatadores/index.js +17 -17
  174. package/fontes/interfaces/avaliador-sintatico-interface.d.ts +57 -57
  175. package/fontes/interfaces/avaliador-sintatico-interface.js +2 -2
  176. package/fontes/interfaces/construtos/index.d.ts +4 -4
  177. package/fontes/interfaces/construtos/index.js +2 -2
  178. package/fontes/interfaces/escopo-execucao.d.ts +11 -11
  179. package/fontes/interfaces/escopo-execucao.js +2 -2
  180. package/fontes/interfaces/index.d.ts +11 -11
  181. package/fontes/interfaces/index.js +27 -27
  182. package/fontes/interfaces/interpretador-com-depuracao-interface.d.ts +17 -17
  183. package/fontes/interfaces/interpretador-com-depuracao-interface.js +2 -2
  184. package/fontes/interfaces/interpretador-interface.d.ts +55 -55
  185. package/fontes/interfaces/interpretador-interface.js +2 -2
  186. package/fontes/interfaces/lexador-interface.d.ts +23 -23
  187. package/fontes/interfaces/lexador-interface.js +2 -2
  188. package/fontes/interfaces/parametro-interface.d.ts +6 -6
  189. package/fontes/interfaces/parametro-interface.js +2 -2
  190. package/fontes/interfaces/pilha-escopos-execucao-interface.d.ts +25 -25
  191. package/fontes/interfaces/pilha-escopos-execucao-interface.js +2 -2
  192. package/fontes/interfaces/pilha-interface.d.ts +7 -7
  193. package/fontes/interfaces/pilha-interface.js +2 -2
  194. package/fontes/interfaces/resolvedor-interface.d.ts +41 -41
  195. package/fontes/interfaces/resolvedor-interface.js +2 -2
  196. package/fontes/interfaces/retornos/index.d.ts +4 -4
  197. package/fontes/interfaces/retornos/index.js +20 -20
  198. package/fontes/interfaces/retornos/retorno-avaliador-sintatico.d.ts +6 -6
  199. package/fontes/interfaces/retornos/retorno-avaliador-sintatico.js +2 -2
  200. package/fontes/interfaces/retornos/retorno-execucao-interface.d.ts +5 -5
  201. package/fontes/interfaces/retornos/retorno-execucao-interface.js +2 -2
  202. package/fontes/interfaces/retornos/retorno-interpretador.d.ts +5 -5
  203. package/fontes/interfaces/retornos/retorno-interpretador.js +2 -2
  204. package/fontes/interfaces/retornos/retorno-lexador.d.ts +10 -10
  205. package/fontes/interfaces/retornos/retorno-lexador.js +2 -2
  206. package/fontes/interfaces/simbolo-interface.d.ts +7 -7
  207. package/fontes/interfaces/simbolo-interface.js +2 -2
  208. package/fontes/interfaces/tradutor-interface.d.ts +4 -4
  209. package/fontes/interfaces/tradutor-interface.js +2 -2
  210. package/fontes/interfaces/variavel-interface.d.ts +4 -4
  211. package/fontes/interfaces/variavel-interface.js +2 -2
  212. package/fontes/interpretador/dialetos/egua-classico/index.d.ts +1 -1
  213. package/fontes/interpretador/dialetos/egua-classico/index.js +17 -17
  214. package/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +99 -99
  215. package/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +743 -743
  216. package/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  217. package/fontes/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.d.ts +5 -5
  218. package/fontes/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.js +11 -11
  219. package/fontes/interpretador/dialetos/egua-classico/resolvedor/index.d.ts +3 -3
  220. package/fontes/interpretador/dialetos/egua-classico/resolvedor/index.js +19 -19
  221. package/fontes/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.d.ts +9 -9
  222. package/fontes/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.js +25 -25
  223. package/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +87 -87
  224. package/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +387 -387
  225. package/fontes/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.d.ts +6 -6
  226. package/fontes/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.js +2 -2
  227. package/fontes/interpretador/dialetos/index.d.ts +4 -4
  228. package/fontes/interpretador/dialetos/index.js +20 -20
  229. package/fontes/interpretador/dialetos/portugol-studio/interpretador-portugol-studio.d.ts +12 -12
  230. package/fontes/interpretador/dialetos/portugol-studio/interpretador-portugol-studio.js +26 -26
  231. package/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.d.ts +40 -40
  232. package/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.js +96 -96
  233. package/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.js.map +1 -1
  234. package/fontes/interpretador/dialetos/visualg/interpretador-visualg.d.ts +46 -46
  235. package/fontes/interpretador/dialetos/visualg/interpretador-visualg.js +102 -102
  236. package/fontes/interpretador/dialetos/visualg/interpretador-visualg.js.map +1 -1
  237. package/fontes/interpretador/erro-interpretador.d.ts +8 -8
  238. package/fontes/interpretador/erro-interpretador.js +2 -2
  239. package/fontes/interpretador/index.d.ts +4 -4
  240. package/fontes/interpretador/index.js +20 -20
  241. package/fontes/interpretador/inferenciador.d.ts +1 -1
  242. package/fontes/interpretador/inferenciador.js +31 -31
  243. package/fontes/interpretador/interpretador-base.d.ts +188 -187
  244. package/fontes/interpretador/interpretador-base.js +1000 -972
  245. package/fontes/interpretador/interpretador-base.js.map +1 -1
  246. package/fontes/interpretador/interpretador-com-depuracao.d.ts +199 -199
  247. package/fontes/interpretador/interpretador-com-depuracao.js +516 -516
  248. package/fontes/interpretador/pilha-escopos-execucao.d.ts +38 -38
  249. package/fontes/interpretador/pilha-escopos-execucao.js +158 -158
  250. package/fontes/lexador/dialetos/index.d.ts +6 -6
  251. package/fontes/lexador/dialetos/index.js +22 -22
  252. package/fontes/lexador/dialetos/lexador-birl.d.ts +12 -12
  253. package/fontes/lexador/dialetos/lexador-birl.js +211 -165
  254. package/fontes/lexador/dialetos/lexador-birl.js.map +1 -1
  255. package/fontes/lexador/dialetos/lexador-egua-classico.d.ts +36 -36
  256. package/fontes/lexador/dialetos/lexador-egua-classico.js +286 -286
  257. package/fontes/lexador/dialetos/lexador-eguap.d.ts +51 -51
  258. package/fontes/lexador/dialetos/lexador-eguap.js +398 -398
  259. package/fontes/lexador/dialetos/lexador-guarani.d.ts +9 -9
  260. package/fontes/lexador/dialetos/lexador-guarani.js +113 -113
  261. package/fontes/lexador/dialetos/lexador-portugol-ipt.d.ts +33 -33
  262. package/fontes/lexador/dialetos/lexador-portugol-ipt.js +195 -195
  263. package/fontes/lexador/dialetos/lexador-portugol-studio.d.ts +21 -15
  264. package/fontes/lexador/dialetos/lexador-portugol-studio.js +280 -244
  265. package/fontes/lexador/dialetos/lexador-portugol-studio.js.map +1 -1
  266. package/fontes/lexador/dialetos/lexador-visualg.d.ts +18 -18
  267. package/fontes/lexador/dialetos/lexador-visualg.js +218 -218
  268. package/fontes/lexador/dialetos/palavras-reservadas/birl.d.ts +46 -41
  269. package/fontes/lexador/dialetos/palavras-reservadas/birl.js +63 -58
  270. package/fontes/lexador/dialetos/palavras-reservadas/birl.js.map +1 -1
  271. package/fontes/lexador/dialetos/palavras-reservadas/egua-classico.d.ts +36 -36
  272. package/fontes/lexador/dialetos/palavras-reservadas/egua-classico.js +41 -41
  273. package/fontes/lexador/dialetos/palavras-reservadas/guarani.d.ts +4 -4
  274. package/fontes/lexador/dialetos/palavras-reservadas/guarani.js +9 -9
  275. package/fontes/lexador/dialetos/palavras-reservadas/index.d.ts +3 -3
  276. package/fontes/lexador/dialetos/palavras-reservadas/index.js +19 -19
  277. package/fontes/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +6 -6
  278. package/fontes/lexador/dialetos/palavras-reservadas/portugol-ipt.js +11 -11
  279. package/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.d.ts +23 -11
  280. package/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.js +28 -16
  281. package/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.js.map +1 -1
  282. package/fontes/lexador/dialetos/palavras-reservadas/rantiaquin.d.ts +2 -2
  283. package/fontes/lexador/dialetos/palavras-reservadas/rantiaquin.js +3 -3
  284. package/fontes/lexador/dialetos/palavras-reservadas/visualg.d.ts +60 -60
  285. package/fontes/lexador/dialetos/palavras-reservadas/visualg.js +65 -65
  286. package/fontes/lexador/dialetos/pragma.d.ts +8 -8
  287. package/fontes/lexador/dialetos/pragma.js +2 -2
  288. package/fontes/lexador/erro-lexador.d.ts +5 -5
  289. package/fontes/lexador/erro-lexador.js +2 -2
  290. package/fontes/lexador/index.d.ts +2 -2
  291. package/fontes/lexador/index.js +18 -18
  292. package/fontes/lexador/lexador-base-linha-unica.d.ts +28 -28
  293. package/fontes/lexador/lexador-base-linha-unica.js +82 -82
  294. package/fontes/lexador/lexador-base.d.ts +41 -41
  295. package/fontes/lexador/lexador-base.js +112 -112
  296. package/fontes/lexador/lexador.d.ts +43 -43
  297. package/fontes/lexador/lexador.js +412 -408
  298. package/fontes/lexador/lexador.js.map +1 -1
  299. package/fontes/lexador/palavras-reservadas.d.ts +36 -36
  300. package/fontes/lexador/palavras-reservadas.js +41 -41
  301. package/fontes/lexador/simbolo.d.ts +10 -10
  302. package/fontes/lexador/simbolo.js +16 -16
  303. package/fontes/quebras/index.d.ts +10 -10
  304. package/fontes/quebras/index.js +19 -19
  305. package/fontes/tipos-de-simbolos/birl.d.ts +71 -57
  306. package/fontes/tipos-de-simbolos/birl.js +78 -61
  307. package/fontes/tipos-de-simbolos/birl.js.map +1 -1
  308. package/fontes/tipos-de-simbolos/comum.d.ts +22 -22
  309. package/fontes/tipos-de-simbolos/comum.js +23 -23
  310. package/fontes/tipos-de-simbolos/delegua.d.ts +80 -80
  311. package/fontes/tipos-de-simbolos/delegua.js +81 -81
  312. package/fontes/tipos-de-simbolos/egua-classico.d.ts +77 -77
  313. package/fontes/tipos-de-simbolos/egua-classico.js +78 -78
  314. package/fontes/tipos-de-simbolos/eguap.d.ts +73 -73
  315. package/fontes/tipos-de-simbolos/eguap.js +74 -74
  316. package/fontes/tipos-de-simbolos/guarani.d.ts +14 -14
  317. package/fontes/tipos-de-simbolos/guarani.js +15 -15
  318. package/fontes/tipos-de-simbolos/portugol-ipt.d.ts +28 -28
  319. package/fontes/tipos-de-simbolos/portugol-ipt.js +29 -29
  320. package/fontes/tipos-de-simbolos/portugol-studio.d.ts +53 -37
  321. package/fontes/tipos-de-simbolos/portugol-studio.js +54 -38
  322. package/fontes/tipos-de-simbolos/portugol-studio.js.map +1 -1
  323. package/fontes/tipos-de-simbolos/rantiaquin.d.ts +2 -2
  324. package/fontes/tipos-de-simbolos/rantiaquin.js +3 -3
  325. package/fontes/tipos-de-simbolos/visualg.d.ts +68 -68
  326. package/fontes/tipos-de-simbolos/visualg.js +69 -69
  327. package/fontes/tradutores/dicionarios/dicionario-delegua-javascript.d.ts +2 -2
  328. package/fontes/tradutores/dicionarios/dicionario-delegua-javascript.js +10 -10
  329. package/fontes/tradutores/dicionarios/index.d.ts +1 -1
  330. package/fontes/tradutores/dicionarios/index.js +17 -17
  331. package/fontes/tradutores/index.d.ts +2 -2
  332. package/fontes/tradutores/index.js +18 -18
  333. package/fontes/tradutores/python/python3-lexer.d.ts +152 -152
  334. package/fontes/tradutores/python/python3-lexer.js +1226 -1226
  335. package/fontes/tradutores/python/python3-listener.d.ts +953 -953
  336. package/fontes/tradutores/python/python3-listener.js +2 -2
  337. package/fontes/tradutores/python/python3-parser.d.ts +1330 -1330
  338. package/fontes/tradutores/python/python3-parser.js +11156 -11156
  339. package/fontes/tradutores/python/python3-visitor.d.ts +612 -612
  340. package/fontes/tradutores/python/python3-visitor.js +2 -2
  341. package/fontes/tradutores/tradutor-javascript.d.ts +83 -83
  342. package/fontes/tradutores/tradutor-javascript.js +470 -470
  343. package/fontes/tradutores/tradutor-javascript.js.map +1 -1
  344. package/fontes/tradutores/tradutor-python.d.ts +1 -1
  345. package/fontes/tradutores/tradutor-python.js +34 -34
  346. package/fontes/tradutores/tradutor-reverso-javascript.d.ts +47 -47
  347. package/fontes/tradutores/tradutor-reverso-javascript.js +342 -342
  348. package/index.d.ts +5 -5
  349. package/index.js +23 -23
  350. package/package.json +88 -88
@@ -1,535 +1,535 @@
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.AvaliadorSintaticoVisuAlg = void 0;
7
- const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
8
- const declaracoes_1 = require("../../declaracoes");
9
- const construtos_1 = require("../../construtos");
10
- const lexador_1 = require("../../lexador");
11
- const visualg_1 = __importDefault(require("../../tipos-de-simbolos/visualg"));
12
- class AvaliadorSintaticoVisuAlg extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
13
- validarSegmentoAlgoritmo() {
14
- this.consumir(visualg_1.default.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");
15
- this.consumir(visualg_1.default.CARACTERE, "Esperad cadeia de caracteres após palavra-chave 'algoritmo'.");
16
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");
17
- }
18
- criarVetorNDimensional(dimensoes) {
19
- if (dimensoes.length > 0) {
20
- const dimensao = dimensoes[0] + 1;
21
- const resto = dimensoes.slice(1);
22
- const novoArray = Array(dimensao);
23
- for (let i = 0; i < dimensao; i++) {
24
- novoArray[i] = this.criarVetorNDimensional(resto);
25
- }
26
- return novoArray;
27
- }
28
- else {
29
- return undefined;
30
- }
31
- }
32
- validarDimensoesVetor() {
33
- let dimensoes = [];
34
- do {
35
- const numeroInicial = this.consumir(visualg_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
36
- this.consumir(visualg_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
37
- this.consumir(visualg_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
38
- const numeroFinal = this.consumir(visualg_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
39
- dimensoes.push(Number(numeroFinal.literal) - Number(numeroInicial.literal));
40
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
41
- return dimensoes;
42
- }
43
- logicaComumParametroVisuAlg() {
44
- const identificadores = [];
45
- do {
46
- identificadores.push(this.consumir(visualg_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
47
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
48
- this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
49
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
50
- throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido.');
51
- }
52
- const simboloAnterior = this.simbolos[this.atual - 1];
53
- const tipoVariavel = simboloAnterior.tipo;
54
- return {
55
- identificadores,
56
- tipo: tipoVariavel,
57
- simbolo: simboloAnterior
58
- };
59
- }
60
- /**
61
- * Validação do segmento de declaração de variáveis (opcional).
62
- * @returns Vetor de Construtos para inicialização de variáveis.
63
- */
64
- validarSegmentoVar() {
65
- // Podem haver linhas de comentários acima de `var`, que geram
66
- // quebras de linha.
67
- while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
68
- this.avancarEDevolverAnterior();
69
- }
70
- if (!this.verificarTipoSimboloAtual(visualg_1.default.VAR)) {
71
- return [];
72
- }
73
- const inicializacoes = [];
74
- this.avancarEDevolverAnterior(); // Var
75
- // Quebra de linha é opcional aqui.
76
- // this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.QUEBRA_LINHA);
77
- while (!this.verificarTipoSimboloAtual(visualg_1.default.INICIO)) {
78
- // Se ainda houver quebras de linha, volta para o começo do `while`.
79
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.QUEBRA_LINHA)) {
80
- continue;
81
- }
82
- const simboloAtual = this.simbolos[this.atual];
83
- switch (simboloAtual.tipo) {
84
- case visualg_1.default.PROCEDIMENTO:
85
- const dadosProcedimento = this.declaracaoProcedimento();
86
- inicializacoes.push(dadosProcedimento);
87
- break;
88
- default:
89
- const dadosVariaveis = this.logicaComumParametroVisuAlg();
90
- // Se chegou até aqui, variáveis são válidas.
91
- // Devem ser declaradas com um valor inicial padrão.
92
- for (let identificador of dadosVariaveis.identificadores) {
93
- switch (dadosVariaveis.tipo) {
94
- case visualg_1.default.CARACTERE:
95
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), '')));
96
- break;
97
- case visualg_1.default.INTEIRO:
98
- case visualg_1.default.REAL:
99
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0)));
100
- break;
101
- case visualg_1.default.LOGICO:
102
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false)));
103
- break;
104
- case visualg_1.default.VETOR:
105
- // TODO: Validar vetor
106
- this.consumir(visualg_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
107
- const dimensoes = this.validarDimensoesVetor();
108
- this.consumir(visualg_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
109
- this.consumir(visualg_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
110
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
111
- throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido para inicialização de vetor.');
112
- }
113
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes))));
114
- break;
115
- }
116
- }
117
- break;
118
- }
119
- this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após declaração de variável.');
120
- }
121
- return inicializacoes;
122
- }
123
- validarSegmentoInicio(algoritmoOuFuncao) {
124
- this.consumir(visualg_1.default.INICIO, `Esperada expressão 'inicio' para marcar escopo de ${algoritmoOuFuncao}.`);
125
- }
126
- estaNoFinal() {
127
- return this.atual === this.simbolos.length;
128
- }
129
- metodoBibliotecaGlobal() {
130
- const simboloAnterior = this.simbolos[this.atual - 1];
131
- switch (simboloAnterior.lexema) {
132
- case 'int':
133
- return new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(visualg_1.default.IDENTIFICADOR, 'inteiro', null, Number(simboloAnterior.linha), this.hashArquivo)), null, []);
134
- default:
135
- return null;
136
- }
137
- }
138
- primario() {
139
- const simboloAtual = this.simbolos[this.atual];
140
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.FALSO))
141
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
142
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VERDADEIRO))
143
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
144
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.IDENTIFICADOR, visualg_1.default.METODO_BIBLIOTECA_GLOBAL)) {
145
- return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
146
- }
147
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.NUMERO, visualg_1.default.CARACTERE)) {
148
- const simboloAnterior = this.simbolos[this.atual - 1];
149
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
150
- }
151
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
152
- const expressao = this.expressao();
153
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
154
- return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
155
- }
156
- }
157
- comparacaoIgualdade() {
158
- let expressao = this.comparar();
159
- while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DIFERENTE, visualg_1.default.IGUAL)) {
160
- // TODO: Este é um caso que o interpretador não deveria ter conhecimento
161
- // do que é um símbolo.
162
- // Em VisuAlg não existe '==', apenas '=', já que o símbolo de atribuição
163
- // é uma seta: '<-'.
164
- const simboloAnterior = this.simbolos[this.atual - 1];
165
- let operador = new lexador_1.Simbolo('IGUAL_IGUAL', '=', null, this.hashArquivo, Number(simboloAnterior.linha));
166
- if (simboloAnterior.tipo === visualg_1.default.DIFERENTE) {
167
- operador = simboloAnterior;
168
- }
169
- const direito = this.comparar();
170
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
171
- }
172
- return expressao;
173
- }
174
- /**
175
- * Método que resolve atribuições.
176
- * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoSobrescrita`.
177
- */
178
- atribuir() {
179
- const expressao = this.ou();
180
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SETA_ATRIBUICAO)) {
181
- const setaAtribuicao = this.simbolos[this.atual - 1];
182
- const valor = this.atribuir();
183
- if (expressao instanceof construtos_1.Variavel) {
184
- const simbolo = expressao.simbolo;
185
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
186
- }
187
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
188
- return new construtos_1.AtribuicaoSobrescrita(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
189
- }
190
- this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
191
- }
192
- return expressao;
193
- }
194
- expressao() {
195
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.LEIA))
196
- return this.declaracaoLeia();
197
- return this.atribuir();
198
- }
199
- blocoEscopo() {
200
- const declaracoes = [];
201
- while (![
202
- visualg_1.default.FIM_FUNCAO,
203
- visualg_1.default.FIM_PROCEDIMENTO
204
- ].includes(this.simbolos[this.atual].tipo) && !this.estaNoFinal()) {
205
- declaracoes.push(this.declaracao());
206
- }
207
- // Se chegou até aqui, simplesmente consome o símbolo.
208
- this.avancarEDevolverAnterior();
209
- // this.consumir(tiposDeSimbolos.FIM_FUNCAO, "Esperado palavra-chave 'fimfuncao' após o bloco.");
210
- return declaracoes;
211
- }
212
- chamar() {
213
- let expressao = this.primario();
214
- while (true) {
215
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
216
- expressao = this.finalizarChamada(expressao);
217
- }
218
- else if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.COLCHETE_ESQUERDO)) {
219
- const indices = [];
220
- do {
221
- indices.push(this.expressao());
222
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
223
- const indice = indices[0];
224
- const simboloFechamento = this.consumir(visualg_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
225
- expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
226
- }
227
- else {
228
- break;
229
- }
230
- }
231
- return expressao;
232
- }
233
- corpoDaFuncao(tipo) {
234
- const simboloAnterior = this.simbolos[this.atual - 1];
235
- this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de função.');
236
- // Tipo retornado pela função.
237
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.INTEIRO, visualg_1.default.CARACTERE)) {
238
- throw this.erro(this.simbolos[this.atual], 'Esperado um tipo válido para retorno de função');
239
- }
240
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após tipo retornado por 'funcao'.");
241
- this.validarSegmentoVar();
242
- this.validarSegmentoInicio('função');
243
- const corpo = this.blocoEscopo();
244
- return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), null, corpo);
245
- }
246
- declaracaoEnquanto() {
247
- const simboloAtual = this.avancarEDevolverAnterior();
248
- const condicao = this.expressao();
249
- this.consumir(visualg_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
250
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' em declaracão 'enquanto'.");
251
- const declaracoes = [];
252
- do {
253
- declaracoes.push(this.declaracao());
254
- } while (![visualg_1.default.FIM_ENQUANTO].includes(this.simbolos[this.atual].tipo));
255
- this.consumir(visualg_1.default.FIM_ENQUANTO, "Esperado palavra-chave 'fimenquanto' para fechamento de declaração 'enquanto'.");
256
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimenquanto'.");
257
- return new declaracoes_1.Enquanto(condicao, declaracoes);
258
- }
259
- logicaCasosEscolha() {
260
- const literais = [];
261
- // let simboloAtualCaso: SimboloInterface = this.avancarEDevolverAnterior();
262
- let simboloAtualCaso = this.simbolos[this.atual];
263
- while (simboloAtualCaso.tipo !== visualg_1.default.QUEBRA_LINHA) {
264
- literais.push(this.primario());
265
- this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA);
266
- simboloAtualCaso = this.avancarEDevolverAnterior();
267
- }
268
- return literais;
269
- }
270
- declaracaoEscolha() {
271
- const simboloAtual = this.avancarEDevolverAnterior();
272
- // Parênteses são opcionais para delimitar o identificador.
273
- this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO);
274
- const identificador = this.primario();
275
- this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_DIREITO);
276
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após variável ou literal de declaração 'caso'.");
277
- // Blocos de caso
278
- const caminhos = [];
279
- let simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
280
- while (![visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(simboloAtualBlocoCaso.tipo)) {
281
- const caminhoCondicoes = this.logicaCasosEscolha();
282
- /* this.consumir(
283
- tiposDeSimbolos.QUEBRA_LINHA,
284
- "Esperado quebra de linha após último valor de declaração 'caso'."
285
- ); */
286
- const declaracoes = [];
287
- do {
288
- declaracoes.push(this.declaracao());
289
- } while (![visualg_1.default.CASO, visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(this.simbolos[this.atual].tipo));
290
- caminhos.push({
291
- condicoes: caminhoCondicoes.filter((c) => c),
292
- declaracoes: declaracoes.filter((d) => d),
293
- });
294
- simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
295
- }
296
- let caminhoPadrao = null;
297
- if (simboloAtualBlocoCaso.tipo === visualg_1.default.OUTRO_CASO) {
298
- const declaracoes = [];
299
- do {
300
- declaracoes.push(this.declaracao());
301
- } while (!this.verificarTipoSimboloAtual(visualg_1.default.FIM_ESCOLHA));
302
- caminhoPadrao = {
303
- declaracoes: declaracoes.filter((d) => d),
304
- };
305
- simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
306
- }
307
- if (simboloAtualBlocoCaso.tipo !== visualg_1.default.FIM_ESCOLHA) {
308
- throw this.erro(this.simbolos[this.atual], "Esperado palavra-chave 'fimescolha' para fechamento de declaração 'escolha'.");
309
- }
310
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimescolha'.");
311
- return new declaracoes_1.Escolha(identificador, caminhos, caminhoPadrao);
312
- }
313
- logicaComumEscreva() {
314
- const simboloParenteses = this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
315
- const argumentos = [];
316
- // Sem não houver parâmetros, retorna vetor com literal vazio.
317
- if (this.simbolos[this.atual].tipo === visualg_1.default.PARENTESE_DIREITO) {
318
- this.avancarEDevolverAnterior();
319
- return [new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), new construtos_1.Literal(this.hashArquivo, Number(simboloParenteses.linha), ''))
320
- ];
321
- }
322
- do {
323
- const valor = this.declaracao();
324
- let espacos = 0;
325
- let casasDecimais = 0;
326
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
327
- // Espaços
328
- const simboloEspacos = this.consumir(visualg_1.default.NUMERO, 'Esperado número após sinal de dois-pontos após identificador como argumento.');
329
- espacos = Number(simboloEspacos.lexema) - 1;
330
- }
331
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
332
- // Casas decimais
333
- const simboloCasasDecimais = this.consumir(visualg_1.default.NUMERO, 'Esperado número após segundo sinal de dois-pontos após identificador como argumento.');
334
- casasDecimais = Number(simboloCasasDecimais.lexema);
335
- }
336
- argumentos.push(new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), valor, espacos, casasDecimais));
337
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
338
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
339
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
340
- return argumentos;
341
- }
342
- declaracaoEscreva() {
343
- const simboloAtual = this.avancarEDevolverAnterior();
344
- const argumentos = this.logicaComumEscreva();
345
- return new declaracoes_1.Escreva(Number(simboloAtual.linha), this.hashArquivo, argumentos);
346
- }
347
- declaracaoEscrevaMesmaLinha() {
348
- const simboloAtual = this.avancarEDevolverAnterior();
349
- const argumentos = this.logicaComumEscreva();
350
- return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), this.hashArquivo, argumentos);
351
- }
352
- /**
353
- * Criação de declaração "repita".
354
- * @returns Um construto do tipo Fazer
355
- */
356
- declaracaoFazer() {
357
- const simboloAtual = this.avancarEDevolverAnterior();
358
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após instrução 'repita'.");
359
- const declaracoes = [];
360
- do {
361
- declaracoes.push(this.declaracao());
362
- } while (![visualg_1.default.ATE].includes(this.simbolos[this.atual].tipo));
363
- this.consumir(visualg_1.default.ATE, "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'.");
364
- const condicao = this.expressao();
365
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após condição de continuidade em instrução 'repita'.");
366
- return new declaracoes_1.Fazer(this.hashArquivo, Number(simboloAtual.linha), new declaracoes_1.Bloco(this.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)), condicao);
367
- }
368
- /**
369
- * Criação de declaração "interrompa".
370
- * Em VisuAlg, "sustar" é chamada de "interrompa".
371
- * @returns Uma declaração do tipo Sustar.
372
- */
373
- declaracaoInterrompa() {
374
- const simboloAtual = this.avancarEDevolverAnterior();
375
- // TODO: Contar blocos para colocar esta condição de erro.
376
- /* if (this.blocos < 1) {
377
- this.erro(this.simbolos[this.atual - 1], "'interrompa' deve estar dentro de um laço de repetição.");
378
- } */
379
- return new declaracoes_1.Sustar(simboloAtual);
380
- }
381
- /**
382
- * Análise de uma declaração `leia()`. No VisuAlg, `leia()` aceita 1..N argumentos.
383
- * @returns Uma declaração `Leia`.
384
- */
385
- declaracaoLeia() {
386
- const simboloAtual = this.avancarEDevolverAnterior();
387
- this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes do argumento em instrução `leia`.");
388
- const argumentos = [];
389
- do {
390
- argumentos.push(this.declaracao());
391
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
392
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após o argumento em instrução `leia`.");
393
- this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após fechamento de parênteses pós instrução `leia`.');
394
- return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
395
- }
396
- declaracaoPara() {
397
- const simboloPara = this.avancarEDevolverAnterior();
398
- const variavelIteracao = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
399
- this.consumir(visualg_1.default.DE, "Esperado palavra reservada 'de' após variáve de controle de 'para'.");
400
- const numeroInicio = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
401
- this.consumir(visualg_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
402
- const numeroFim = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
403
- this.consumir(visualg_1.default.FACA, "Esperado palavra reservada 'faca' após valor final do laço de repetição 'para'.");
404
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' do laço de repetição 'para'.");
405
- const declaracoesBlocoPara = [];
406
- let simboloAtualBlocoPara = this.simbolos[this.atual];
407
- while (simboloAtualBlocoPara.tipo !== visualg_1.default.FIM_PARA) {
408
- declaracoesBlocoPara.push(this.declaracao());
409
- simboloAtualBlocoPara = this.simbolos[this.atual];
410
- }
411
- this.consumir(visualg_1.default.FIM_PARA, '');
412
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'fimpara'.");
413
- const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
414
- return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroInicio.literal)), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroFim.literal)), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1))), corpo);
415
- }
416
- logicaComumParametros() {
417
- const parametros = [];
418
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
419
- while (!this.verificarTipoSimboloAtual(visualg_1.default.PARENTESE_DIREITO)) {
420
- const dadosParametros = this.logicaComumParametroVisuAlg();
421
- for (let parametro of dadosParametros.identificadores) {
422
- parametros.push({
423
- tipo: 'padrao',
424
- nome: parametro
425
- });
426
- }
427
- }
428
- // Consumir parêntese direito
429
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado parêntese direito para finalização da leitura de parâmetros.");
430
- }
431
- return parametros;
432
- }
433
- /**
434
- * Procedimentos nada mais são do que funções que não retornam valor.
435
- */
436
- declaracaoProcedimento() {
437
- const simboloProcedimento = this.avancarEDevolverAnterior();
438
- const nomeProcedimento = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado nome do procedimento após palavra-chave `procedimento`.");
439
- // Parâmetros
440
- const parametros = this.logicaComumParametros();
441
- this.validarSegmentoVar();
442
- this.validarSegmentoInicio('procedimento');
443
- const corpo = this.blocoEscopo();
444
- return new declaracoes_1.FuncaoDeclaracao(nomeProcedimento, new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloProcedimento.linha), parametros, corpo.filter(d => d)));
445
- }
446
- declaracaoSe() {
447
- const simboloSe = this.avancarEDevolverAnterior();
448
- const condicao = this.expressao();
449
- this.consumir(visualg_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
450
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'entao' em declaração 'se'.");
451
- const declaracoes = [];
452
- do {
453
- declaracoes.push(this.declaracao());
454
- } while (![visualg_1.default.SENAO, visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
455
- let caminhoSenao = null;
456
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SENAO)) {
457
- const simboloSenao = this.simbolos[this.atual - 1];
458
- const declaracoesSenao = [];
459
- do {
460
- declaracoesSenao.push(this.declaracao());
461
- } while (![visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
462
- caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
463
- }
464
- this.consumir(visualg_1.default.FIM_SE, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
465
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimse'.");
466
- return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
467
- }
468
- declaracao() {
469
- // Refatorar isso no futuro.
470
- const simboloAtual = this.simbolos[this.atual];
471
- switch (simboloAtual.tipo) {
472
- case visualg_1.default.ENQUANTO:
473
- return this.declaracaoEnquanto();
474
- case visualg_1.default.ESCOLHA:
475
- return this.declaracaoEscolha();
476
- case visualg_1.default.ESCREVA:
477
- return this.declaracaoEscrevaMesmaLinha();
478
- case visualg_1.default.ESCREVA_LINHA:
479
- return this.declaracaoEscreva();
480
- case visualg_1.default.FUNCAO:
481
- return this.funcao('funcao');
482
- case visualg_1.default.INTERROMPA:
483
- return this.declaracaoInterrompa();
484
- case visualg_1.default.LEIA:
485
- return this.declaracaoLeia();
486
- case visualg_1.default.PARA:
487
- return this.declaracaoPara();
488
- case visualg_1.default.PARENTESE_DIREITO:
489
- throw new Error('Não deveria estar caindo aqui.');
490
- case visualg_1.default.PROCEDIMENTO:
491
- return this.declaracaoProcedimento();
492
- case visualg_1.default.QUEBRA_LINHA:
493
- this.avancarEDevolverAnterior();
494
- return null;
495
- case visualg_1.default.REPITA:
496
- return this.declaracaoFazer();
497
- case visualg_1.default.SE:
498
- return this.declaracaoSe();
499
- default:
500
- return this.expressao();
501
- }
502
- }
503
- /**
504
- * No VisuAlg, há uma determinada cadência de validação de símbolos.
505
- * - O primeiro símbolo é `algoritmo`, seguido por um identificador e
506
- * uma quebra de linha.
507
- * - O segundo símbolo é `var`, que pode ser seguido por uma série de
508
- * declarações de variáveis e finalizado por uma quebra de linha.
509
- * - O terceiro símbolo é `inicio`, seguido por uma quebra de linha.
510
- * - O último símbolo deve ser `fimalgoritmo`, que também é usado para
511
- * definir quando não existem mais construtos a serem adicionados.
512
- * @param retornoLexador Os símbolos entendidos pelo Lexador.
513
- * @param hashArquivo Obrigatório por interface mas não usado aqui.
514
- */
515
- analisar(retornoLexador, hashArquivo) {
516
- this.erros = [];
517
- this.atual = 0;
518
- this.blocos = 0;
519
- this.hashArquivo = hashArquivo || 0;
520
- this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
521
- let declaracoes = [];
522
- this.validarSegmentoAlgoritmo();
523
- declaracoes = declaracoes.concat(this.validarSegmentoVar());
524
- this.validarSegmentoInicio('algoritmo');
525
- while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== visualg_1.default.FIM_ALGORITMO) {
526
- declaracoes.push(this.declaracao());
527
- }
528
- return {
529
- declaracoes: declaracoes.filter((d) => d),
530
- erros: this.erros,
531
- };
532
- }
533
- }
534
- exports.AvaliadorSintaticoVisuAlg = AvaliadorSintaticoVisuAlg;
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.AvaliadorSintaticoVisuAlg = void 0;
7
+ const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
8
+ const declaracoes_1 = require("../../declaracoes");
9
+ const construtos_1 = require("../../construtos");
10
+ const lexador_1 = require("../../lexador");
11
+ const visualg_1 = __importDefault(require("../../tipos-de-simbolos/visualg"));
12
+ class AvaliadorSintaticoVisuAlg extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
13
+ validarSegmentoAlgoritmo() {
14
+ this.consumir(visualg_1.default.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");
15
+ this.consumir(visualg_1.default.CARACTERE, "Esperad cadeia de caracteres após palavra-chave 'algoritmo'.");
16
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");
17
+ }
18
+ criarVetorNDimensional(dimensoes) {
19
+ if (dimensoes.length > 0) {
20
+ const dimensao = dimensoes[0] + 1;
21
+ const resto = dimensoes.slice(1);
22
+ const novoArray = Array(dimensao);
23
+ for (let i = 0; i < dimensao; i++) {
24
+ novoArray[i] = this.criarVetorNDimensional(resto);
25
+ }
26
+ return novoArray;
27
+ }
28
+ else {
29
+ return undefined;
30
+ }
31
+ }
32
+ validarDimensoesVetor() {
33
+ let dimensoes = [];
34
+ do {
35
+ const numeroInicial = this.consumir(visualg_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
36
+ this.consumir(visualg_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
37
+ this.consumir(visualg_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
38
+ const numeroFinal = this.consumir(visualg_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
39
+ dimensoes.push(Number(numeroFinal.literal) - Number(numeroInicial.literal));
40
+ } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
41
+ return dimensoes;
42
+ }
43
+ logicaComumParametroVisuAlg() {
44
+ const identificadores = [];
45
+ do {
46
+ identificadores.push(this.consumir(visualg_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
47
+ } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
48
+ this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
49
+ if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
50
+ throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido.');
51
+ }
52
+ const simboloAnterior = this.simbolos[this.atual - 1];
53
+ const tipoVariavel = simboloAnterior.tipo;
54
+ return {
55
+ identificadores,
56
+ tipo: tipoVariavel,
57
+ simbolo: simboloAnterior
58
+ };
59
+ }
60
+ /**
61
+ * Validação do segmento de declaração de variáveis (opcional).
62
+ * @returns Vetor de Construtos para inicialização de variáveis.
63
+ */
64
+ validarSegmentoVar() {
65
+ // Podem haver linhas de comentários acima de `var`, que geram
66
+ // quebras de linha.
67
+ while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
68
+ this.avancarEDevolverAnterior();
69
+ }
70
+ if (!this.verificarTipoSimboloAtual(visualg_1.default.VAR)) {
71
+ return [];
72
+ }
73
+ const inicializacoes = [];
74
+ this.avancarEDevolverAnterior(); // Var
75
+ // Quebra de linha é opcional aqui.
76
+ // this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.QUEBRA_LINHA);
77
+ while (!this.verificarTipoSimboloAtual(visualg_1.default.INICIO)) {
78
+ // Se ainda houver quebras de linha, volta para o começo do `while`.
79
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.QUEBRA_LINHA)) {
80
+ continue;
81
+ }
82
+ const simboloAtual = this.simbolos[this.atual];
83
+ switch (simboloAtual.tipo) {
84
+ case visualg_1.default.PROCEDIMENTO:
85
+ const dadosProcedimento = this.declaracaoProcedimento();
86
+ inicializacoes.push(dadosProcedimento);
87
+ break;
88
+ default:
89
+ const dadosVariaveis = this.logicaComumParametroVisuAlg();
90
+ // Se chegou até aqui, variáveis são válidas.
91
+ // Devem ser declaradas com um valor inicial padrão.
92
+ for (let identificador of dadosVariaveis.identificadores) {
93
+ switch (dadosVariaveis.tipo) {
94
+ case visualg_1.default.CARACTERE:
95
+ inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), '')));
96
+ break;
97
+ case visualg_1.default.INTEIRO:
98
+ case visualg_1.default.REAL:
99
+ inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0)));
100
+ break;
101
+ case visualg_1.default.LOGICO:
102
+ inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false)));
103
+ break;
104
+ case visualg_1.default.VETOR:
105
+ // TODO: Validar vetor
106
+ this.consumir(visualg_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
107
+ const dimensoes = this.validarDimensoesVetor();
108
+ this.consumir(visualg_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
109
+ this.consumir(visualg_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
110
+ if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
111
+ throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido para inicialização de vetor.');
112
+ }
113
+ inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes))));
114
+ break;
115
+ }
116
+ }
117
+ break;
118
+ }
119
+ this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após declaração de variável.');
120
+ }
121
+ return inicializacoes;
122
+ }
123
+ validarSegmentoInicio(algoritmoOuFuncao) {
124
+ this.consumir(visualg_1.default.INICIO, `Esperada expressão 'inicio' para marcar escopo de ${algoritmoOuFuncao}.`);
125
+ }
126
+ estaNoFinal() {
127
+ return this.atual === this.simbolos.length;
128
+ }
129
+ metodoBibliotecaGlobal() {
130
+ const simboloAnterior = this.simbolos[this.atual - 1];
131
+ switch (simboloAnterior.lexema) {
132
+ case 'int':
133
+ return new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(visualg_1.default.IDENTIFICADOR, 'inteiro', null, Number(simboloAnterior.linha), this.hashArquivo)), null, []);
134
+ default:
135
+ return null;
136
+ }
137
+ }
138
+ primario() {
139
+ const simboloAtual = this.simbolos[this.atual];
140
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.FALSO))
141
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
142
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VERDADEIRO))
143
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
144
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.IDENTIFICADOR, visualg_1.default.METODO_BIBLIOTECA_GLOBAL)) {
145
+ return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
146
+ }
147
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.NUMERO, visualg_1.default.CARACTERE)) {
148
+ const simboloAnterior = this.simbolos[this.atual - 1];
149
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
150
+ }
151
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
152
+ const expressao = this.expressao();
153
+ this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
154
+ return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
155
+ }
156
+ }
157
+ comparacaoIgualdade() {
158
+ let expressao = this.comparar();
159
+ while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DIFERENTE, visualg_1.default.IGUAL)) {
160
+ // TODO: Este é um caso que o interpretador não deveria ter conhecimento
161
+ // do que é um símbolo.
162
+ // Em VisuAlg não existe '==', apenas '=', já que o símbolo de atribuição
163
+ // é uma seta: '<-'.
164
+ const simboloAnterior = this.simbolos[this.atual - 1];
165
+ let operador = new lexador_1.Simbolo('IGUAL_IGUAL', '=', null, this.hashArquivo, Number(simboloAnterior.linha));
166
+ if (simboloAnterior.tipo === visualg_1.default.DIFERENTE) {
167
+ operador = simboloAnterior;
168
+ }
169
+ const direito = this.comparar();
170
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
171
+ }
172
+ return expressao;
173
+ }
174
+ /**
175
+ * Método que resolve atribuições.
176
+ * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoSobrescrita`.
177
+ */
178
+ atribuir() {
179
+ const expressao = this.ou();
180
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SETA_ATRIBUICAO)) {
181
+ const setaAtribuicao = this.simbolos[this.atual - 1];
182
+ const valor = this.atribuir();
183
+ if (expressao instanceof construtos_1.Variavel) {
184
+ const simbolo = expressao.simbolo;
185
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
186
+ }
187
+ else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
188
+ return new construtos_1.AtribuicaoSobrescrita(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
189
+ }
190
+ this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
191
+ }
192
+ return expressao;
193
+ }
194
+ expressao() {
195
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.LEIA))
196
+ return this.declaracaoLeia();
197
+ return this.atribuir();
198
+ }
199
+ blocoEscopo() {
200
+ const declaracoes = [];
201
+ while (![
202
+ visualg_1.default.FIM_FUNCAO,
203
+ visualg_1.default.FIM_PROCEDIMENTO
204
+ ].includes(this.simbolos[this.atual].tipo) && !this.estaNoFinal()) {
205
+ declaracoes.push(this.declaracao());
206
+ }
207
+ // Se chegou até aqui, simplesmente consome o símbolo.
208
+ this.avancarEDevolverAnterior();
209
+ // this.consumir(tiposDeSimbolos.FIM_FUNCAO, "Esperado palavra-chave 'fimfuncao' após o bloco.");
210
+ return declaracoes;
211
+ }
212
+ chamar() {
213
+ let expressao = this.primario();
214
+ while (true) {
215
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
216
+ expressao = this.finalizarChamada(expressao);
217
+ }
218
+ else if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.COLCHETE_ESQUERDO)) {
219
+ const indices = [];
220
+ do {
221
+ indices.push(this.expressao());
222
+ } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
223
+ const indice = indices[0];
224
+ const simboloFechamento = this.consumir(visualg_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
225
+ expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
226
+ }
227
+ else {
228
+ break;
229
+ }
230
+ }
231
+ return expressao;
232
+ }
233
+ corpoDaFuncao(tipo) {
234
+ const simboloAnterior = this.simbolos[this.atual - 1];
235
+ this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de função.');
236
+ // Tipo retornado pela função.
237
+ if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.INTEIRO, visualg_1.default.CARACTERE)) {
238
+ throw this.erro(this.simbolos[this.atual], 'Esperado um tipo válido para retorno de função');
239
+ }
240
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após tipo retornado por 'funcao'.");
241
+ this.validarSegmentoVar();
242
+ this.validarSegmentoInicio('função');
243
+ const corpo = this.blocoEscopo();
244
+ return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), null, corpo);
245
+ }
246
+ declaracaoEnquanto() {
247
+ const simboloAtual = this.avancarEDevolverAnterior();
248
+ const condicao = this.expressao();
249
+ this.consumir(visualg_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
250
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' em declaracão 'enquanto'.");
251
+ const declaracoes = [];
252
+ do {
253
+ declaracoes.push(this.declaracao());
254
+ } while (![visualg_1.default.FIM_ENQUANTO].includes(this.simbolos[this.atual].tipo));
255
+ this.consumir(visualg_1.default.FIM_ENQUANTO, "Esperado palavra-chave 'fimenquanto' para fechamento de declaração 'enquanto'.");
256
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimenquanto'.");
257
+ return new declaracoes_1.Enquanto(condicao, declaracoes);
258
+ }
259
+ logicaCasosEscolha() {
260
+ const literais = [];
261
+ // let simboloAtualCaso: SimboloInterface = this.avancarEDevolverAnterior();
262
+ let simboloAtualCaso = this.simbolos[this.atual];
263
+ while (simboloAtualCaso.tipo !== visualg_1.default.QUEBRA_LINHA) {
264
+ literais.push(this.primario());
265
+ this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA);
266
+ simboloAtualCaso = this.avancarEDevolverAnterior();
267
+ }
268
+ return literais;
269
+ }
270
+ declaracaoEscolha() {
271
+ const simboloAtual = this.avancarEDevolverAnterior();
272
+ // Parênteses são opcionais para delimitar o identificador.
273
+ this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO);
274
+ const identificador = this.primario();
275
+ this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_DIREITO);
276
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após variável ou literal de declaração 'caso'.");
277
+ // Blocos de caso
278
+ const caminhos = [];
279
+ let simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
280
+ while (![visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(simboloAtualBlocoCaso.tipo)) {
281
+ const caminhoCondicoes = this.logicaCasosEscolha();
282
+ /* this.consumir(
283
+ tiposDeSimbolos.QUEBRA_LINHA,
284
+ "Esperado quebra de linha após último valor de declaração 'caso'."
285
+ ); */
286
+ const declaracoes = [];
287
+ do {
288
+ declaracoes.push(this.declaracao());
289
+ } while (![visualg_1.default.CASO, visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(this.simbolos[this.atual].tipo));
290
+ caminhos.push({
291
+ condicoes: caminhoCondicoes.filter((c) => c),
292
+ declaracoes: declaracoes.filter((d) => d),
293
+ });
294
+ simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
295
+ }
296
+ let caminhoPadrao = null;
297
+ if (simboloAtualBlocoCaso.tipo === visualg_1.default.OUTRO_CASO) {
298
+ const declaracoes = [];
299
+ do {
300
+ declaracoes.push(this.declaracao());
301
+ } while (!this.verificarTipoSimboloAtual(visualg_1.default.FIM_ESCOLHA));
302
+ caminhoPadrao = {
303
+ declaracoes: declaracoes.filter((d) => d),
304
+ };
305
+ simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
306
+ }
307
+ if (simboloAtualBlocoCaso.tipo !== visualg_1.default.FIM_ESCOLHA) {
308
+ throw this.erro(this.simbolos[this.atual], "Esperado palavra-chave 'fimescolha' para fechamento de declaração 'escolha'.");
309
+ }
310
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimescolha'.");
311
+ return new declaracoes_1.Escolha(identificador, caminhos, caminhoPadrao);
312
+ }
313
+ logicaComumEscreva() {
314
+ const simboloParenteses = this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
315
+ const argumentos = [];
316
+ // Sem não houver parâmetros, retorna vetor com literal vazio.
317
+ if (this.simbolos[this.atual].tipo === visualg_1.default.PARENTESE_DIREITO) {
318
+ this.avancarEDevolverAnterior();
319
+ return [new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), new construtos_1.Literal(this.hashArquivo, Number(simboloParenteses.linha), ''))
320
+ ];
321
+ }
322
+ do {
323
+ const valor = this.declaracao();
324
+ let espacos = 0;
325
+ let casasDecimais = 0;
326
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
327
+ // Espaços
328
+ const simboloEspacos = this.consumir(visualg_1.default.NUMERO, 'Esperado número após sinal de dois-pontos após identificador como argumento.');
329
+ espacos = Number(simboloEspacos.lexema) - 1;
330
+ }
331
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
332
+ // Casas decimais
333
+ const simboloCasasDecimais = this.consumir(visualg_1.default.NUMERO, 'Esperado número após segundo sinal de dois-pontos após identificador como argumento.');
334
+ casasDecimais = Number(simboloCasasDecimais.lexema);
335
+ }
336
+ argumentos.push(new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), valor, espacos, casasDecimais));
337
+ } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
338
+ this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
339
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
340
+ return argumentos;
341
+ }
342
+ declaracaoEscreva() {
343
+ const simboloAtual = this.avancarEDevolverAnterior();
344
+ const argumentos = this.logicaComumEscreva();
345
+ return new declaracoes_1.Escreva(Number(simboloAtual.linha), this.hashArquivo, argumentos);
346
+ }
347
+ declaracaoEscrevaMesmaLinha() {
348
+ const simboloAtual = this.avancarEDevolverAnterior();
349
+ const argumentos = this.logicaComumEscreva();
350
+ return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), this.hashArquivo, argumentos);
351
+ }
352
+ /**
353
+ * Criação de declaração "repita".
354
+ * @returns Um construto do tipo Fazer
355
+ */
356
+ declaracaoFazer() {
357
+ const simboloAtual = this.avancarEDevolverAnterior();
358
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após instrução 'repita'.");
359
+ const declaracoes = [];
360
+ do {
361
+ declaracoes.push(this.declaracao());
362
+ } while (![visualg_1.default.ATE].includes(this.simbolos[this.atual].tipo));
363
+ this.consumir(visualg_1.default.ATE, "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'.");
364
+ const condicao = this.expressao();
365
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após condição de continuidade em instrução 'repita'.");
366
+ return new declaracoes_1.Fazer(this.hashArquivo, Number(simboloAtual.linha), new declaracoes_1.Bloco(this.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)), condicao);
367
+ }
368
+ /**
369
+ * Criação de declaração "interrompa".
370
+ * Em VisuAlg, "sustar" é chamada de "interrompa".
371
+ * @returns Uma declaração do tipo Sustar.
372
+ */
373
+ declaracaoInterrompa() {
374
+ const simboloAtual = this.avancarEDevolverAnterior();
375
+ // TODO: Contar blocos para colocar esta condição de erro.
376
+ /* if (this.blocos < 1) {
377
+ this.erro(this.simbolos[this.atual - 1], "'interrompa' deve estar dentro de um laço de repetição.");
378
+ } */
379
+ return new declaracoes_1.Sustar(simboloAtual);
380
+ }
381
+ /**
382
+ * Análise de uma declaração `leia()`. No VisuAlg, `leia()` aceita 1..N argumentos.
383
+ * @returns Uma declaração `Leia`.
384
+ */
385
+ declaracaoLeia() {
386
+ const simboloAtual = this.avancarEDevolverAnterior();
387
+ this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes do argumento em instrução `leia`.");
388
+ const argumentos = [];
389
+ do {
390
+ argumentos.push(this.declaracao());
391
+ } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
392
+ this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após o argumento em instrução `leia`.");
393
+ this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após fechamento de parênteses pós instrução `leia`.');
394
+ return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
395
+ }
396
+ declaracaoPara() {
397
+ const simboloPara = this.avancarEDevolverAnterior();
398
+ const variavelIteracao = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
399
+ this.consumir(visualg_1.default.DE, "Esperado palavra reservada 'de' após variáve de controle de 'para'.");
400
+ const numeroInicio = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
401
+ this.consumir(visualg_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
402
+ const numeroFim = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
403
+ this.consumir(visualg_1.default.FACA, "Esperado palavra reservada 'faca' após valor final do laço de repetição 'para'.");
404
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' do laço de repetição 'para'.");
405
+ const declaracoesBlocoPara = [];
406
+ let simboloAtualBlocoPara = this.simbolos[this.atual];
407
+ while (simboloAtualBlocoPara.tipo !== visualg_1.default.FIM_PARA) {
408
+ declaracoesBlocoPara.push(this.declaracao());
409
+ simboloAtualBlocoPara = this.simbolos[this.atual];
410
+ }
411
+ this.consumir(visualg_1.default.FIM_PARA, '');
412
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'fimpara'.");
413
+ const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
414
+ return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroInicio.literal)), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroFim.literal)), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1))), corpo);
415
+ }
416
+ logicaComumParametros() {
417
+ const parametros = [];
418
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
419
+ while (!this.verificarTipoSimboloAtual(visualg_1.default.PARENTESE_DIREITO)) {
420
+ const dadosParametros = this.logicaComumParametroVisuAlg();
421
+ for (let parametro of dadosParametros.identificadores) {
422
+ parametros.push({
423
+ abrangencia: 'padrao',
424
+ nome: parametro
425
+ });
426
+ }
427
+ }
428
+ // Consumir parêntese direito
429
+ this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado parêntese direito para finalização da leitura de parâmetros.");
430
+ }
431
+ return parametros;
432
+ }
433
+ /**
434
+ * Procedimentos nada mais são do que funções que não retornam valor.
435
+ */
436
+ declaracaoProcedimento() {
437
+ const simboloProcedimento = this.avancarEDevolverAnterior();
438
+ const nomeProcedimento = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado nome do procedimento após palavra-chave `procedimento`.");
439
+ // Parâmetros
440
+ const parametros = this.logicaComumParametros();
441
+ this.validarSegmentoVar();
442
+ this.validarSegmentoInicio('procedimento');
443
+ const corpo = this.blocoEscopo();
444
+ return new declaracoes_1.FuncaoDeclaracao(nomeProcedimento, new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloProcedimento.linha), parametros, corpo.filter(d => d)));
445
+ }
446
+ declaracaoSe() {
447
+ const simboloSe = this.avancarEDevolverAnterior();
448
+ const condicao = this.expressao();
449
+ this.consumir(visualg_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
450
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'entao' em declaração 'se'.");
451
+ const declaracoes = [];
452
+ do {
453
+ declaracoes.push(this.declaracao());
454
+ } while (![visualg_1.default.SENAO, visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
455
+ let caminhoSenao = null;
456
+ if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SENAO)) {
457
+ const simboloSenao = this.simbolos[this.atual - 1];
458
+ const declaracoesSenao = [];
459
+ do {
460
+ declaracoesSenao.push(this.declaracao());
461
+ } while (![visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
462
+ caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
463
+ }
464
+ this.consumir(visualg_1.default.FIM_SE, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
465
+ this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimse'.");
466
+ return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
467
+ }
468
+ declaracao() {
469
+ // Refatorar isso no futuro.
470
+ const simboloAtual = this.simbolos[this.atual];
471
+ switch (simboloAtual.tipo) {
472
+ case visualg_1.default.ENQUANTO:
473
+ return this.declaracaoEnquanto();
474
+ case visualg_1.default.ESCOLHA:
475
+ return this.declaracaoEscolha();
476
+ case visualg_1.default.ESCREVA:
477
+ return this.declaracaoEscrevaMesmaLinha();
478
+ case visualg_1.default.ESCREVA_LINHA:
479
+ return this.declaracaoEscreva();
480
+ case visualg_1.default.FUNCAO:
481
+ return this.funcao('funcao');
482
+ case visualg_1.default.INTERROMPA:
483
+ return this.declaracaoInterrompa();
484
+ case visualg_1.default.LEIA:
485
+ return this.declaracaoLeia();
486
+ case visualg_1.default.PARA:
487
+ return this.declaracaoPara();
488
+ case visualg_1.default.PARENTESE_DIREITO:
489
+ throw new Error('Não deveria estar caindo aqui.');
490
+ case visualg_1.default.PROCEDIMENTO:
491
+ return this.declaracaoProcedimento();
492
+ case visualg_1.default.QUEBRA_LINHA:
493
+ this.avancarEDevolverAnterior();
494
+ return null;
495
+ case visualg_1.default.REPITA:
496
+ return this.declaracaoFazer();
497
+ case visualg_1.default.SE:
498
+ return this.declaracaoSe();
499
+ default:
500
+ return this.expressao();
501
+ }
502
+ }
503
+ /**
504
+ * No VisuAlg, há uma determinada cadência de validação de símbolos.
505
+ * - O primeiro símbolo é `algoritmo`, seguido por um identificador e
506
+ * uma quebra de linha.
507
+ * - O segundo símbolo é `var`, que pode ser seguido por uma série de
508
+ * declarações de variáveis e finalizado por uma quebra de linha.
509
+ * - O terceiro símbolo é `inicio`, seguido por uma quebra de linha.
510
+ * - O último símbolo deve ser `fimalgoritmo`, que também é usado para
511
+ * definir quando não existem mais construtos a serem adicionados.
512
+ * @param retornoLexador Os símbolos entendidos pelo Lexador.
513
+ * @param hashArquivo Obrigatório por interface mas não usado aqui.
514
+ */
515
+ analisar(retornoLexador, hashArquivo) {
516
+ this.erros = [];
517
+ this.atual = 0;
518
+ this.blocos = 0;
519
+ this.hashArquivo = hashArquivo || 0;
520
+ this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
521
+ let declaracoes = [];
522
+ this.validarSegmentoAlgoritmo();
523
+ declaracoes = declaracoes.concat(this.validarSegmentoVar());
524
+ this.validarSegmentoInicio('algoritmo');
525
+ while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== visualg_1.default.FIM_ALGORITMO) {
526
+ declaracoes.push(this.declaracao());
527
+ }
528
+ return {
529
+ declaracoes: declaracoes.filter((d) => d),
530
+ erros: this.erros,
531
+ };
532
+ }
533
+ }
534
+ exports.AvaliadorSintaticoVisuAlg = AvaliadorSintaticoVisuAlg;
535
535
  //# sourceMappingURL=avaliador-sintatico-visualg.js.map