Advertisement
BenjaminWade

Code

Sep 17th, 2023
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.67 KB | Software | 0 0
  1. Package bemtevi;
  2.  
  3. Helpers
  4. digito = ['0' .. '9'];
  5. espaco = ' ';
  6. tab = 9;
  7. rc = 13;
  8. nl = 10;
  9. under = 95;
  10. maiusculas = ['A'..'Z'];
  11. minusculas = ['a'..'z'];
  12. letras = maiusculas | minusculas;
  13. aspa = 39;
  14. aspas_duplas = 34;
  15. tudo = [0 .. 0xFFFF];
  16. tudomenosnl = [tudo-nl];
  17. tracotraco = '--';
  18. tudomenosaspas = [tudo-aspa];
  19. not_eol = [tudo - [rc + nl]];
  20. not_single = [not_eol - 39];
  21. not_double = [not_eol - 34];
  22. hifen = '-';
  23. virgula = 44;
  24. negative = 45;
  25. exponencial = 'e' | 'E';
  26. chaveesquerda = '{';
  27. chavedireita = '}';
  28. d_tudomenoschave = [tudo - chavedireita];
  29. e_tudomenoschave = [tudo - chaveesquerda];
  30. comentario_linhas = tracotraco tudomenosnl*;
  31. comentario_bloco = chaveesquerda d_tudomenoschave* chavedireita;
  32.  
  33. Tokens
  34. classe = 'molde';
  35. objeto = 'objeto';
  36. initmolde = 'contem';
  37. final = 'fim';
  38. chamada = '.';
  39. se = 'se';
  40. passa = 'passa';
  41. por = 'por';
  42. funcao = 'funcao';
  43. tipobool = 'Bool';
  44. separador = '|';
  45. principal = '>>';
  46. pontovirgula = ';';
  47. doispontos = ':';
  48. vazio = (espaco | rc | nl | tab)+;
  49. entao = 'entao';
  50. senao = 'senao';
  51. falso = 'falso';
  52. sum = '+';
  53. sub = '-';
  54. mult = '*';
  55. div = '/';
  56. mod = '%';
  57. define = '=';
  58. igualigual = '==';
  59. menorque = '<';
  60. lte = '<=';
  61. not = '!';
  62. and = 'e';
  63. or = 'ou';
  64. paresquerdo = '(';
  65. pardireito = ')';
  66. colcheteesquerdo = '[';
  67. colchetedireito = ']';
  68. constante = 'constante';
  69. tiponumero = 'Numero';
  70. repeticao = 'recursao';
  71. verdadeiro = 'verdade';
  72. tipotexto = 'Texto';
  73. numero = digito+ ( virgula digito+ | exponencial hifen? digito+ )?;
  74. texto = aspas_duplas [tudo - aspas_duplas]* aspas_duplas;
  75. identificador_molde = maiusculas (minusculas | maiusculas | under)*;
  76. identificador_atributo_funcao = minusculas (minusculas | maiusculas | under | digito)*;
  77. comentario = (comentario_linhas | comentario_bloco);
  78.  
  79.  
  80.  
  81. Ignored Tokens
  82. vazio,
  83. comentario;
  84.  
  85.  
  86. Productions
  87.  
  88.  
  89. start {-> P.start } = {start_programa} programa {-> New start.programa (programa.a_programa ) }
  90. | {start_definicao} definicao {-> New start.definicao (definicao )};
  91.  
  92. expr_mat
  93. {-> P.expr_mat } =
  94.  
  95. {fator} fator
  96. {-> fator.expr_mat } |
  97.  
  98. {sum} expr_mat sum fator
  99. {-> New expr_mat.sum (expr_mat , fator.expr_mat ) } |
  100.  
  101. {menos} expr_mat sub fator
  102. {-> New expr_mat.menos (expr_mat , fator.expr_mat ) }
  103. ;
  104.  
  105. fator
  106. {-> P.expr_mat } =
  107.  
  108. {termo} termo
  109. {-> termo.expr_mat } |
  110.  
  111. {mult} fator mult termo
  112. {-> New expr_mat.mult (fator.expr_mat , termo.expr_mat ) } |
  113.  
  114. {div} fator div termo
  115. {-> New expr_mat.div (fator.expr_mat , termo.expr_mat ) } |
  116.  
  117. {mod} fator mod termo
  118. {-> New expr_mat.mod (fator.expr_mat , termo.expr_mat ) }
  119. ;
  120.  
  121. termo {-> P.expr_mat } =
  122. {numero} numero
  123. {-> New expr_mat.numero (numero ) } |
  124.  
  125. {negativo} sub termo
  126. {-> New expr_mat.negativo (termo.expr_mat ) } |
  127.  
  128. {exp_atributo} atributo
  129. {-> New expr_mat.exp_atributo (atributo ) } |
  130.  
  131. {not} not termo
  132. {-> New expr_mat.not (termo.expr_mat ) } |
  133.  
  134. {exp_id} identificador_atributo_funcao
  135. {-> New expr_mat.exp_id (identificador_atributo_funcao ) } |
  136.  
  137. {exp_chamada} chamada
  138. {-> New expr_mat.exp_chamada (chamada ) } |
  139.  
  140. {par} paresquerdo exp_geral pardireito
  141. {-> New expr_mat.par (exp_geral ) }
  142. ;
  143.  
  144.  
  145. programa {-> a_programa} = {programa} familia? def_molde+ {->New a_programa.ar_programa(familia.familia, [def_molde.def_molde])};
  146.  
  147.  
  148.  
  149. aux_familia
  150. {-> P.familia } =
  151.  
  152. {aux_familia} pontovirgula relacao
  153. {-> New familia.aux_familia (relacao ) }
  154. ;
  155.  
  156. familia
  157. {-> P.familia } =
  158.  
  159. {afamiliafamilia1} relacao T.chamada
  160. {-> New familia.afamiliafamilia1 (relacao ) } |
  161.  
  162. {afamiliafamilia2} relacao P.a_aux_familia
  163. {-> New familia.afamiliafamilia2 (relacao , [ a_aux_familia.familia ]) }
  164. ;
  165.  
  166. relacao
  167. {-> P.relacao } =
  168.  
  169. {relacao} classe [first]: identificador_molde se passa por [second]: identificador_molde
  170. {-> New relacao.relacao (first , second ) }
  171. ;
  172.  
  173. def_molde
  174. {-> P.def_molde } =
  175.  
  176. {def_molde} classe identificador_molde initmolde atributos metodos final
  177. {-> New def_molde.def_molde (identificador_molde , atributos , metodos ) }
  178. ;
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191. aux_atributos
  192. {-> P.aux_atributos } =
  193.  
  194. {dec_cons} dec_cons
  195. {-> New aux_atributos.dec_cons (dec_cons ) } |
  196.  
  197. {dec_obj} dec_obj
  198. {-> New aux_atributos.dec_obj (dec_obj ) }
  199. ;
  200.  
  201. atributos
  202. {-> P.atributos } =
  203.  
  204. {aatributosatributos1}
  205. {-> New atributos.atributos ([ ] ) } |
  206.  
  207. {aatributosatributos2} P.a_aux_atributos
  208. {-> New atributos.atributos ([ a_aux_atributos.aux_atributos ] ) }
  209. ;
  210.  
  211. dec_cons
  212. {-> P.dec_cons } =
  213.  
  214. {def_cons} constante doispontos tipo_primitivo identificador_atributo_funcao pontovirgula
  215. {-> New dec_cons.def_cons (tipo_primitivo , identificador_atributo_funcao) } |
  216.  
  217. {ini_cons} constante doispontos tipo_primitivo definicao
  218. {-> New dec_cons.ini_cons (tipo_primitivo , definicao ) }
  219. ;
  220.  
  221. dec_obj
  222. {-> P.dec_obj } =
  223.  
  224. {def_obj} objeto doispontos tipo_molde identificador_atributo_funcao pontovirgula
  225. {-> New dec_obj.def_obj (tipo_molde , identificador_atributo_funcao ) } |
  226.  
  227. {ini_obj} objeto doispontos tipo_molde definicao
  228. {-> New dec_obj.ini_obj (tipo_molde , definicao ) }
  229. ;
  230.  
  231. tipo_primitivo
  232. {-> P.tipo_primitivo } =
  233.  
  234. {tipobool} tipobool
  235. {-> New tipo_primitivo.tipobool (tipobool ) } |
  236.  
  237. {tiponumero} tiponumero
  238. {-> New tipo_primitivo.tiponumero (tiponumero ) } |
  239.  
  240. {tipotexto} tipotexto
  241. {-> New tipo_primitivo.tipotexto (tipotexto ) }
  242. ;
  243.  
  244. tipo_molde
  245. {-> P.tipo_molde } =
  246.  
  247. {tipo_molde} identificador_molde
  248. {-> New tipo_molde.tipo_molde (identificador_molde ) }
  249. ;
  250.  
  251. tipo
  252. {-> P.tipo } =
  253.  
  254. {tipo_molde} tipo_molde
  255. {-> New tipo.tipo_molde (tipo_molde ) } |
  256.  
  257. {tipo_primitivo} tipo_primitivo
  258. {-> New tipo.tipo_primitivo (tipo_primitivo ) }
  259. ;
  260.  
  261. metodos
  262. {-> P.metodos } =
  263.  
  264. {ametodosmetodos1}
  265. {-> New metodos.metodos ([ ] ) } |
  266.  
  267. {ametodosmetodos2} P.a_dec_funcao
  268. {-> New metodos.metodos ([ a_dec_funcao.dec_funcao ] ) }
  269. ;
  270.  
  271. dec_funcao
  272. {-> P.dec_funcao } =
  273.  
  274. {adeffuncaoinidecfuncao1} funcao doispontos tipo identificador_atributo_funcao paresquerdo pardireito bloco
  275. {-> New dec_funcao.adeffuncaoinidecfuncao1 (tipo , identificador_atributo_funcao , bloco ) } |
  276.  
  277. {adeffuncaoinidecfuncao2} principal funcao doispontos tipo identificador_atributo_funcao paresquerdo pardireito bloco
  278. {-> New dec_funcao.adeffuncaoinidecfuncao2 (tipo , identificador_atributo_funcao , bloco ) } |
  279.  
  280. {adeffuncaoinidecfuncao3} funcao doispontos tipo identificador_atributo_funcao paresquerdo parametros pardireito bloco
  281. {-> New dec_funcao.adeffuncaoinidecfuncao3 (tipo , identificador_atributo_funcao , parametros, bloco ) } |
  282.  
  283. {adeffuncaoinidecfuncao4} principal funcao doispontos tipo identificador_atributo_funcao paresquerdo parametros pardireito bloco
  284. {-> New dec_funcao.adeffuncaoinidecfuncao4 (tipo , identificador_atributo_funcao , parametros , bloco ) } |
  285.  
  286. {adeffuncaodecfuncao1} funcao doispontos tipo identificador_atributo_funcao paresquerdo pardireito pontovirgula
  287. {-> New dec_funcao.adeffuncaodecfuncao1 (tipo , identificador_atributo_funcao ) } |
  288.  
  289. {adeffuncaodecfuncao2} principal funcao doispontos tipo identificador_atributo_funcao paresquerdo pardireito pontovirgula
  290. {-> New dec_funcao.adeffuncaodecfuncao2 (tipo , identificador_atributo_funcao) } |
  291.  
  292. {adeffuncaodecfuncao3} funcao doispontos tipo identificador_atributo_funcao paresquerdo parametros pardireito pontovirgula
  293. {-> New dec_funcao.adeffuncaodecfuncao3 ( tipo , identificador_atributo_funcao , parametros ) } |
  294.  
  295. {adeffuncaodecfuncao4} principal funcao doispontos tipo identificador_atributo_funcao paresquerdo parametros pardireito pontovirgula
  296. {-> New dec_funcao.adeffuncaodecfuncao4 (tipo , identificador_atributo_funcao , parametros ) }
  297. ;
  298.  
  299. aux_parametros
  300. {-> P.aux_parametros } =
  301.  
  302. {aux_parametros} separador parametro
  303. {-> New aux_parametros.aux_parametros (separador , parametro )};
  304.  
  305. parametros
  306. {-> P.parametros } =
  307.  
  308. {aparametrosparametros1} parametro
  309. {-> New parametros.parametros (parametro , [ ] ) } |
  310.  
  311. {aparametrosparametros2} parametro P.a_aux_parametros
  312. {-> New parametros.parametros (parametro , [ a_aux_parametros.aux_parametros ] ) }
  313. ;
  314.  
  315. parametro
  316. {-> P.parametro } =
  317.  
  318. {parametro_id} tipo identificador_atributo_funcao
  319. {-> New parametro.parametro_id (tipo , identificador_atributo_funcao ) } |
  320.  
  321. {parametro_ass} assinatura
  322. {-> New parametro.parametro_ass (assinatura ) }
  323. ;
  324.  
  325. assinatura
  326. {-> P.assinatura } =
  327.  
  328. {aassinaturaassinatura1} tipo identificador_atributo_funcao paresquerdo pardireito
  329. {-> New assinatura.aassinaturaassinatura1 (tipo , identificador_atributo_funcao ) } |
  330.  
  331. {aassinaturaassinatura2} tipo identificador_atributo_funcao paresquerdo parametros_assinatura pardireito
  332. {-> New assinatura.aassinaturaassinatura2 (tipo , identificador_atributo_funcao , parametros_assinatura ) }
  333. ;
  334.  
  335. aux_parametros_assinatura
  336. {-> P.aux_parametros_assinatura } =
  337.  
  338. {aux_parametros_assinatura} separador parametro_assinatura
  339. {-> New aux_parametros_assinatura.aux_parametros_assinatura (separador , parametro_assinatura ) }
  340. ;
  341.  
  342. parametros_assinatura
  343. {-> P.parametros_assinatura } =
  344.  
  345. {aparamsassinaturaparametrosassinatura1} parametro_assinatura
  346. {-> New parametros_assinatura.params_assinatura (parametro_assinatura , [ ] ) } |
  347.  
  348. {aparamsassinaturaparametrosassinatura2} parametro_assinatura P.a_aux_parametros_assinatura
  349. {-> New parametros_assinatura.params_assinatura (parametro_assinatura , [ a_aux_parametros_assinatura.aux_parametros_assinatura ] ) }
  350. ;
  351.  
  352. parametro_assinatura
  353. {-> P.parametro_assinatura } =
  354.  
  355. {param_tipo} tipo
  356. {-> New parametro_assinatura.param_tipo (tipo ) } |
  357.  
  358. {param_assinatura} assinatura
  359. {-> New parametro_assinatura.param_assinatura (assinatura ) }
  360. ;
  361.  
  362. aux_bloco
  363. {-> P.aux_bloco } =
  364.  
  365. {aux_bloco_cons} dec_cons
  366. {-> New aux_bloco.aux_bloco_cons (dec_cons ) } |
  367.  
  368. {aux_bloco_obj} dec_obj
  369. {-> New aux_bloco.aux_bloco_obj (dec_obj ) } |
  370.  
  371. {aux_bloco_def} definicao
  372. {-> New aux_bloco.aux_bloco_def (definicao ) }
  373. ;
  374.  
  375. bloco
  376. {-> P.bloco } =
  377.  
  378. {ablocobloco1} colcheteesquerdo exp_geral colchetedireito
  379. {-> New bloco.ablocobloco1 (exp_geral) } |
  380.  
  381. {ablocobloco2} colcheteesquerdo P.a_aux_bloco exp_geral colchetedireito
  382. {-> New bloco.ablocobloco2 ([ a_aux_bloco.aux_bloco ], exp_geral) }
  383. ;
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396. aux_definicao
  397. {-> P.aux_definicao } =
  398. {aux_definicao} identificador_atributo_funcao
  399. {-> New aux_definicao.aux_definicao (identificador_atributo_funcao ) } |
  400.  
  401. atributo
  402. {-> New aux_definicao (atributo ) }
  403. ;
  404.  
  405. definicao
  406. {-> P.definicao } =
  407.  
  408. {definicao} aux_definicao define exp_geral pontovirgula
  409. {-> New definicao.definicao (aux_definicao , exp_geral ) }
  410. ;
  411.  
  412. aux_atributo
  413. {-> P.aux_atributo } =
  414.  
  415. {aux_atributo} T.chamada identificador_atributo_funcao
  416. {-> New aux_atributo.aux_atributo (identificador_atributo_funcao ) }
  417. ;
  418.  
  419. atributo
  420. {-> P.atributo } =
  421.  
  422. {atributo} identificador_atributo_funcao P.a_aux_atributo
  423. {-> New atributo.atributo (identificador_atributo_funcao , [ a_aux_atributo.aux_atributo ] ) }
  424. ;
  425.  
  426. exp_geral {-> P.exp_geral } = {exp_condicional} se paresquerdo exp_geral pardireito entao [first]:exp_geral_op_logico senao [second]: exp_geral_op_logico {-> New exp_geral.n_definicao (exp_geral , first.exp_geral , second.exp_geral )}
  427. | {op_logico4} op_logico4 {-> op_logico4.exp_geral };
  428.  
  429. op_logico4 {-> P.exp_geral } = {op_logico3} op_logico3 {-> op_logico3.exp_geral }
  430. | {op_logico_ou} exp_geral or exp_geral_op_logico {-> New exp_geral.ou_op_logico_ou (exp_geral , exp_geral_op_logico.exp_geral ) }
  431. ;
  432.  
  433. op_logico3 {-> P.exp_geral } = {op_logico2} op_logico2 {-> op_logico2.exp_geral }
  434. | {op_logico_e} exp_geral and exp_geral_op_logico {-> New exp_geral.e_op_logico_e (exp_geral , exp_geral_op_logico.exp_geral ) }
  435. ;
  436.  
  437. op_logico2 {-> P.exp_geral } = {op_logico1} op_logico1 {-> op_logico1.exp_geral }
  438. | {igualigual} exp_geral igualigual exp_geral_op_logico
  439. {-> New exp_geral.n_igualigual (exp_geral , exp_geral_op_logico.exp_geral ) }
  440. ;
  441.  
  442. op_logico1 {-> P.exp_geral } = {exp_geral_op_logico} exp_geral_op_logico {-> exp_geral_op_logico.exp_geral }
  443. | {menor_que} exp_geral menorque exp_geral_op_logico {-> New exp_geral.n_menor_que (exp_geral , exp_geral_op_logico.exp_geral ) }
  444. | {lte} exp_geral lte exp_geral_op_logico {-> New exp_geral.n_lte (exp_geral , exp_geral_op_logico.exp_geral ) }
  445. ;
  446.  
  447. exp_geral_op_logico {-> P.exp_geral } = {exp_bloco} bloco {-> New exp_geral.exp_bloco (bloco ) } |
  448.  
  449. {terminal} terminais {-> terminais.exp_geral }
  450. ;
  451.  
  452. terminais
  453. {-> P.exp_geral } =
  454.  
  455. {exp_matematica} expr_mat {-> New exp_geral.exp_matematica (expr_mat ) } |
  456.  
  457. {valor_texto} texto
  458. {-> New exp_geral.valor_texto (texto ) } |
  459.  
  460. {bool_verdade} verdadeiro
  461. {-> New exp_geral.bool_verdade (verdadeiro ) } |
  462.  
  463. {bool_falso} falso
  464. {-> New exp_geral.bool_falso (falso ) } |
  465.  
  466. {exp_instancia} instancia
  467. {-> New exp_geral.exp_instancia (instancia ) }
  468. ;
  469.  
  470. instancia
  471. {-> P.instancia } =
  472.  
  473. {ainstanciainstancia} identificador_molde colcheteesquerdo lista_inicializacao colchetedireito
  474. {-> New instancia.instancia (identificador_molde , lista_inicializacao ) }
  475. ;
  476.  
  477. aux_lista_inicializacao
  478. {-> P.aux_lista_inicializacao } =
  479.  
  480. {aauxlistainicializacaoauxlistainicializacao1} separador
  481. {-> New aux_lista_inicializacao.aux_lista_inicializacao (separador , [ ] ) } |
  482.  
  483. {aauxlistainicializacaoauxlistainicializacao2} separador P.a_inicializacao_objeto
  484. {-> New aux_lista_inicializacao.aux_lista_inicializacao (separador , [ a_inicializacao_objeto.inicializacao_objeto ] ) }
  485. ;
  486.  
  487. lista_inicializacao
  488. {-> P.lista_inicializacao } =
  489.  
  490. {alistainilistainicializacao1} inicializacao_objeto
  491. {-> New lista_inicializacao.lista_inicializacao (inicializacao_objeto , [ ] ) } |
  492.  
  493. {alistainilistainicializacao2} inicializacao_objeto P.a_aux_lista_inicializacao
  494. {-> New lista_inicializacao.lista_inicializacao (inicializacao_objeto , [ a_aux_lista_inicializacao.aux_lista_inicializacao ] ) }
  495. ;
  496.  
  497. aux_inicializacao_objeto
  498. {-> P.aux_inicializacao_objeto } =
  499.  
  500. {aux_inicializacao_objeto} T.chamada identificador_atributo_funcao
  501. {-> New aux_inicializacao_objeto.aux_inicializacao_objeto (identificador_atributo_funcao ) }
  502. ;
  503.  
  504. inicializacao_objeto
  505. {-> P.inicializacao_objeto } =
  506.  
  507. {ainiobjetoinicializacaoobjeto1} objeto T.chamada identificador_atributo_funcao define exp_geral
  508. {-> New inicializacao_objeto.ini_objeto (identificador_atributo_funcao , [ ], exp_geral ) } |
  509.  
  510. {ainiobjetoinicializacaoobjeto2} objeto T.chamada identificador_atributo_funcao P.a_aux_inicializacao_objeto define exp_geral
  511. {-> New inicializacao_objeto.ini_objeto (identificador_atributo_funcao , [ a_aux_inicializacao_objeto.aux_inicializacao_objeto ], exp_geral ) }
  512. ;
  513.  
  514. chamada_p
  515. {-> P.chamada_p } =
  516.  
  517. {achamadachamadap1} identificador_atributo_funcao paresquerdo pardireito
  518. {-> New chamada_p.achamadachamadap1 (identificador_atributo_funcao ) } |
  519.  
  520. {achamadachamadap2} identificador_atributo_funcao P.a_aux_atributo paresquerdo pardireito
  521. {-> New chamada_p.achamadachamadap2 (identificador_atributo_funcao , [ a_aux_atributo.aux_atributo ] ) } |
  522.  
  523. {achamadachamadap3} identificador_atributo_funcao paresquerdo lista_exp_geral pardireito
  524. {-> New chamada_p.achamadachamadap3 (identificador_atributo_funcao , lista_exp_geral ) } |
  525.  
  526. {achamadachamadap4} identificador_atributo_funcao P.a_aux_atributo paresquerdo lista_exp_geral pardireito
  527. {-> New chamada_p.achamadachamadap4 (identificador_atributo_funcao , [ a_aux_atributo.aux_atributo ] , lista_exp_geral ) }
  528. ;
  529.  
  530. aux_lista_exp_geral
  531. {-> P.aux_lista_exp_geral } =
  532.  
  533. {aux_lista_exp_geral} separador exp_geral
  534. {-> New aux_lista_exp_geral.aux_lista_exp_geral ( exp_geral ) }
  535. ;
  536.  
  537. lista_exp_geral
  538. {-> P.lista_exp_geral } =
  539.  
  540. // {alistaexplistaexpgeral1} exp_geral
  541. // {-> New lista_exp_geral.lista_exp (exp_geral ) } |
  542.  
  543. {alistaexplistaexpgeral2} exp_geral P.a_aux_lista_exp_geral
  544. {-> New lista_exp_geral.lista_exp (exp_geral , [ a_aux_lista_exp_geral.aux_lista_exp_geral ] ) }
  545. ;
  546.  
  547. a_def_molde
  548. {-> P.def_molde* } =
  549.  
  550. {terminal} P.def_molde
  551. {-> [ P.def_molde.def_molde ] } |
  552.  
  553. {non_terminal} P.a_def_molde P.def_molde
  554. {-> [ a_def_molde.def_molde, P.def_molde.def_molde ] }
  555. ;
  556.  
  557.  
  558. a_aux_familia
  559. {-> P.familia* } =
  560.  
  561. {terminal} P.aux_familia
  562. {-> [ P.aux_familia.familia ] } |
  563.  
  564. {non_terminal} P.a_aux_familia P.aux_familia
  565. {-> [ a_aux_familia.familia, P.aux_familia.familia ] }
  566. ;
  567.  
  568. a_aux_atributos
  569. {-> P.aux_atributos* } =
  570.  
  571. {terminal} P.aux_atributos
  572. {-> [ P.aux_atributos.aux_atributos ] } |
  573.  
  574. {non_terminal} P.a_aux_atributos P.aux_atributos
  575. {-> [ a_aux_atributos.aux_atributos, P.aux_atributos.aux_atributos ] }
  576. ;
  577.  
  578.  
  579. a_dec_funcao
  580. {-> P.dec_funcao* } =
  581.  
  582. {terminal} P.dec_funcao
  583. {-> [ P.dec_funcao.dec_funcao ] } |
  584.  
  585. {non_terminal} P.a_dec_funcao P.dec_funcao
  586. {-> [ a_dec_funcao.dec_funcao, P.dec_funcao.dec_funcao ] }
  587. ;
  588.  
  589. a_aux_parametros
  590. {-> P.aux_parametros* } =
  591.  
  592. {terminal} P.aux_parametros
  593. {-> [ P.aux_parametros.aux_parametros ] } |
  594.  
  595. {non_terminal} P.a_aux_parametros P.aux_parametros
  596. {-> [ a_aux_parametros.aux_parametros, P.aux_parametros.aux_parametros ] }
  597. ;
  598.  
  599. a_aux_parametros_assinatura
  600. {-> P.aux_parametros_assinatura* } =
  601.  
  602. {terminal} P.aux_parametros_assinatura
  603. {-> [ P.aux_parametros_assinatura.aux_parametros_assinatura ] } |
  604.  
  605. {non_terminal} P.a_aux_parametros_assinatura P.aux_parametros_assinatura
  606. {-> [ a_aux_parametros_assinatura.aux_parametros_assinatura, P.aux_parametros_assinatura.aux_parametros_assinatura ] }
  607. ;
  608.  
  609. a_aux_bloco
  610. {-> P.aux_bloco* } =
  611.  
  612. {terminal} P.aux_bloco
  613. {-> [ P.aux_bloco.aux_bloco ] } |
  614.  
  615. {non_terminal} P.a_aux_bloco P.aux_bloco
  616. {-> [ a_aux_bloco.aux_bloco, P.aux_bloco.aux_bloco ] }
  617. ;
  618.  
  619. a_aux_atributo
  620. {-> P.aux_atributo* } =
  621.  
  622. {terminal} P.aux_atributo
  623. {-> [ P.aux_atributo.aux_atributo ] } |
  624.  
  625. {non_terminal} P.a_aux_atributo P.aux_atributo
  626. {-> [ a_aux_atributo.aux_atributo, P.aux_atributo.aux_atributo ] }
  627. ;
  628.  
  629. a_inicializacao_objeto
  630. {-> P.inicializacao_objeto* } =
  631.  
  632. {terminal} P.inicializacao_objeto
  633. {-> [ P.inicializacao_objeto.inicializacao_objeto ] } |
  634.  
  635. {non_terminal} P.a_inicializacao_objeto P.inicializacao_objeto
  636. {-> [ a_inicializacao_objeto.inicializacao_objeto, P.inicializacao_objeto.inicializacao_objeto ] }
  637. ;
  638.  
  639. a_aux_lista_inicializacao
  640. {-> P.aux_lista_inicializacao* } =
  641.  
  642. {terminal} P.aux_lista_inicializacao
  643. {-> [ P.aux_lista_inicializacao.aux_lista_inicializacao ] } |
  644.  
  645. {non_terminal} P.a_aux_lista_inicializacao P.aux_lista_inicializacao
  646. {-> [ a_aux_lista_inicializacao.aux_lista_inicializacao, P.aux_lista_inicializacao.aux_lista_inicializacao ] }
  647. ;
  648.  
  649.  
  650.  
  651. a_aux_inicializacao_objeto
  652. {-> P.aux_inicializacao_objeto* } =
  653.  
  654. {terminal} P.aux_inicializacao_objeto
  655. {-> [ P.aux_inicializacao_objeto.aux_inicializacao_objeto ] } |
  656.  
  657. {non_terminal} P.a_aux_inicializacao_objeto P.aux_inicializacao_objeto
  658. {-> [ a_aux_inicializacao_objeto.aux_inicializacao_objeto, P.aux_inicializacao_objeto.aux_inicializacao_objeto ] }
  659. ;
  660.  
  661. a_aux_lista_exp_geral
  662. {-> P.aux_lista_exp_geral* } =
  663.  
  664. {terminal} P.aux_lista_exp_geral
  665. {-> [ P.aux_lista_exp_geral.aux_lista_exp_geral ] } |
  666.  
  667. {non_terminal} P.a_aux_lista_exp_geral P.aux_lista_exp_geral
  668. {-> [ a_aux_lista_exp_geral.aux_lista_exp_geral, P.aux_lista_exp_geral.aux_lista_exp_geral ] }
  669. ;
  670.  
  671. Abstract Syntax Tree
  672.  
  673.  
  674.  
  675. start = {programa} a_programa
  676. | {definicao} definicao;
  677.  
  678. expr_mat = {sum} [esq]:expr_mat [dir]:expr_mat
  679. |{menos} [esq]:expr_mat [dir]:expr_mat
  680. |{mult} [esq]:expr_mat [dir]:expr_mat
  681. |{div} [esq]:expr_mat [dir]:expr_mat
  682. |{mod} [esq]:expr_mat [dir]:expr_mat
  683. |{exp_atributo} atributo
  684. |{exp_chamada} chamada
  685. |{numero} numero
  686. |{negativo} expr_mat
  687. |{not} expr_mat
  688. |{exp_id} identificador_atributo_funcao
  689. |{par} exp_geral;
  690.  
  691.  
  692.  
  693. a_programa = {ar_programa} familia? def_molde+;
  694.  
  695.  
  696.  
  697. familia = {aux_familia} relacao
  698. |{afamiliafamilia1} relacao
  699. |{afamiliafamilia2} relacao familia*;
  700.  
  701. relacao =
  702. {relacao} [first]: identificador_molde [second]: identificador_molde
  703. ;
  704.  
  705. def_molde =
  706. {def_molde} identificador_molde atributos metodos
  707. ;
  708.  
  709. aux_atributos =
  710. {dec_cons} dec_cons |
  711. {dec_obj} dec_obj
  712. ;
  713.  
  714. atributos =
  715. {atributos} aux_atributos*
  716. ;
  717.  
  718. dec_cons =
  719. {def_cons} tipo_primitivo identificador_atributo_funcao |
  720. {ini_cons} tipo_primitivo definicao
  721. ;
  722.  
  723. dec_obj =
  724. {def_obj} tipo_molde identificador_atributo_funcao |
  725. {ini_obj} tipo_molde definicao
  726. ;
  727.  
  728. tipo_primitivo =
  729. {tipobool} tipobool |
  730. {tiponumero} tiponumero |
  731. {tipotexto} tipotexto
  732. ;
  733.  
  734. tipo_molde =
  735. {tipo_molde} identificador_molde
  736. ;
  737.  
  738. tipo =
  739. {tipo_molde} tipo_molde |
  740. {tipo_primitivo} tipo_primitivo
  741. ;
  742.  
  743. metodos =
  744. {metodos} dec_funcao*
  745. ;
  746.  
  747. dec_funcao =
  748. {adeffuncaoinidecfuncao1} tipo identificador_atributo_funcao bloco |
  749. {adeffuncaoinidecfuncao2} tipo identificador_atributo_funcao bloco |
  750. {adeffuncaoinidecfuncao3} tipo identificador_atributo_funcao parametros? bloco |
  751. {adeffuncaoinidecfuncao4} tipo identificador_atributo_funcao parametros? bloco |
  752. {adeffuncaodecfuncao1} tipo identificador_atributo_funcao |
  753. {adeffuncaodecfuncao2} tipo identificador_atributo_funcao |
  754. {adeffuncaodecfuncao3} tipo identificador_atributo_funcao parametros? |
  755. {adeffuncaodecfuncao4} tipo identificador_atributo_funcao parametros? |
  756. {def_funcao} tipo identificador_atributo_funcao parametros?
  757. ;
  758.  
  759.  
  760.  
  761. aux_parametros =
  762. {aux_parametros} separador parametro
  763. ;
  764.  
  765. parametros =
  766. {parametros} parametro aux_parametros*
  767. ;
  768.  
  769. parametro =
  770. {parametro_id} tipo identificador_atributo_funcao |
  771. {parametro_ass} assinatura
  772. ;
  773.  
  774. assinatura =
  775. {aassinaturaassinatura1} tipo identificador_atributo_funcao |
  776. {aassinaturaassinatura2} tipo identificador_atributo_funcao parametros_assinatura?
  777.  
  778. ;
  779.  
  780. aux_parametros_assinatura =
  781. {aux_parametros_assinatura} separador parametro_assinatura
  782. ;
  783.  
  784. parametros_assinatura =
  785. {params_assinatura} parametro_assinatura aux_parametros_assinatura*
  786. ;
  787.  
  788. parametro_assinatura =
  789. {param_tipo} tipo |
  790. {param_assinatura} assinatura
  791. ;
  792.  
  793. aux_bloco =
  794. {aux_bloco_cons} dec_cons |
  795. {aux_bloco_obj} dec_obj |
  796. {aux_bloco_def} definicao
  797. ;
  798.  
  799. bloco =
  800. {ablocobloco1} exp_geral |
  801. {ablocobloco2} aux_bloco* exp_geral
  802. ;
  803.  
  804.  
  805. aux_definicao =
  806. {aux_definicao} identificador_atributo_funcao |
  807. atributo
  808. ;
  809.  
  810. definicao =
  811. {definicao} aux_definicao exp_geral
  812. ;
  813.  
  814. aux_atributo =
  815. {aux_atributo} identificador_atributo_funcao
  816. ;
  817.  
  818. atributo =
  819. {atributo} identificador_atributo_funcao aux_atributo+
  820. ;
  821.  
  822. exp_geral =
  823. {n_definicao} [third]:exp_geral [first]:exp_geral [second]:exp_geral
  824. |{ou_op_logico_ou} [first]:exp_geral [second]: exp_geral
  825. |{e_op_logico_e} [first]:exp_geral [second]: exp_geral
  826. | {n_igualigual} [first]:exp_geral [second]: exp_geral
  827. | {n_menor_que} [first]:exp_geral [second]: exp_geral
  828. | {n_lte} [first]:exp_geral [second]: exp_geral
  829. | {exp_bloco} bloco
  830. | {exp_instancia} instancia
  831. | {exp_matematica} expr_mat
  832. | {valor_texto} texto
  833. | {bool_verdade} verdadeiro
  834. | {bool_falso} falso
  835. ;
  836.  
  837.  
  838. terminais =
  839. {exp_matematica} expr_mat |
  840. {valor_texto} texto |
  841. {bool_verdade} verdadeiro |
  842. {bool_falso} falso |
  843. {exp_instancia} instancia
  844. ;
  845.  
  846. instancia =
  847. {instancia} identificador_molde lista_inicializacao?
  848. ;
  849.  
  850. // aux_lista_inicializacao = {aux_lista_inicializacao} separador inicializacao_objeto* ;
  851. //;
  852. lista_inicializacao = {lista_inicializacao} inicializacao_objeto aux_lista_inicializacao* ;
  853. // ;
  854. // aux_lista_inicializacao = {aux_lista_inicializacao} separador lista_inicializacao;
  855. aux_lista_inicializacao = {aux_lista_inicializacao} separador inicializacao_objeto*;
  856.  
  857.  
  858.  
  859. aux_inicializacao_objeto =
  860. {aux_inicializacao_objeto} identificador_atributo_funcao
  861. ;
  862.  
  863. inicializacao_objeto =
  864. {ini_objeto} identificador_atributo_funcao aux_inicializacao_objeto* exp_geral
  865. ;
  866.  
  867. //chamada_p =
  868. // {chamada} identificador_atributo_funcao aux_atributo* lista_exp_geral?
  869. // ;
  870.  
  871. chamada_p = {achamadachamadap1} identificador_atributo_funcao
  872. | {achamadachamadap2} identificador_atributo_funcao aux_atributo*
  873. | {achamadachamadap3} identificador_atributo_funcao lista_exp_geral?
  874. | {achamadachamadap4} identificador_atributo_funcao aux_atributo* lista_exp_geral?
  875. ;
  876. aux_lista_exp_geral =
  877. {aux_lista_exp_geral} exp_geral
  878. ;
  879.  
  880. lista_exp_geral =
  881. {lista_exp} exp_geral aux_lista_exp_geral*
  882. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement