ANLISE DE SISTEMAS / SISTEMAS DE INFORMAO COMPILADORES / FUNDAMENTOS DE COMPILADORES PROF. ANTONIO ATTA
Elaborar os mdulos de anlise lxica, sinttica, semntica e gerao de cdigo intermedirio para o subconjunto da gramtica original da linguagem Pascal especificada a seguir. Escrever os programas correspondentes a cada mdulo usando a linguagem definida em sala. Usar o mtodo descendente recursivo para o mdulo de anlise sinttica, emitindo mensagem indicando o erro correspondente quando encontrar uma sentena que esteja fora do especificado pela gramtica indicar tambm a linha em que ocorreu o erro. Incrementar o mdulo de anlise sinttica incorporando a checagem de tipos, declarao de identificadores, checagem de nmero de parmetros em procedimentos, etc. funes tpicas do analisador semntico. Considerar a existncia de duas funes predefinidas da linguagem: read e write usadas para a entrada e sada de dados. Comentrios podem ocorrer em qualquer ponto do programa, aparecem sempre entre chaves ({ ... }) e devem ser filtrados pelo analisador lxico.
1. <programa> : := program <identificador>; <bloco>. 2. <bloco> : := | <parte de declaraes de variveis> | | <parte de declaraes de sub-rotinas> | <comando composto> 3. <parte de declaraes de variveis> : := var <declarao de variveis> {;<declarao de variveis>};
4. <declarao de variveis>::=<lista de identificadores>: <tipo> 5. <lista de identificadores>::=<identificador> {, <identificador>} 6. <tipo>::= integer , boolean | real 7. <parte de declarao de sub-rotinas>::= {<declarao de procedimento>; , <declarao de funo>;}
8. <declarao de procedimento>::= procedure <identificador> |<parmetros formais>|; <bloco>
9. <declarao de funo>::= function <identificador> |<parmetros formais>|: <tipo>; <bloco>
10. <parmetros formais>::= (<seo de parmetros formais> {;<seo de parmetros formais>})
11. <seo de parmetros formais>::= |var | <lista de identificadores>:<tipo> 12. <comando composto>::=begin [<comando> {; <comando>}] end 13. <comando>::=<atribuio> , <chamada de procedimento> , <comando composto> , <comando condicional>| <comando repetitivo>
14. <atribuio>::=<varivel>:= <expresso> 15. <chamada de procedimento>::=<identificador> |( <lista de expresses> )| 16. <comando condicional>::=if <expresso> then <comando> | else <comando> | VIDE VERSO 17. <comando repetitivo>::= while <expresso> do <comando> 18. <lista de expresses>::=<expresso> {,<expresso>} 19. <expresso>::=<expresso simples> |<relao> <expresso simples>| 20. <relao>::= = | <>|<|>|>= | <= 21. <expresso simples>::= |+|| <termo> {(+||or) <termo>} 22. <termo>::= <fator> {(*| / | and) <fator>} 23. <fator>::= <varivel>|<nmero>|<nmero_real> | <chamada de funo>|(<expresso>) | not <fator> 24. <varivel>::=<identificador>|<identificador> |<lista de expresses>| 25. <chamada de funo>::=<identificador>|(<lista de expresses>)| 26. <nmero>::=<dgito>{<dgito>} 27. <nmero_real>::=<numero>.<numero> 28. <dgito>::= 0|1|2|3|4|5|6|7|8|9 29. <identificador>::=<letra>{<letra>|<dgito>} 30. <letra>::= a|b|c|d|e|f ... w|x|y|z