Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JavaCC

2,911 views

Published on

Published in: Technology, Education
  • Be the first to comment

JavaCC

  1. 1. JavaCC Java Compiler Compiler Paradigmas de Linguagens de Programação Adeline de Sousa Silva - adss@cin.ufpe.br
  2. 2. Definições preliminares: Parser <ul><li>Um parser é um programa que recebe como entrada um arquivo fonte e diz se ele está correto sintaticamente, segundo uma gramática pré-definida. </li></ul><ul><li>Há parsers bottom-up e top-down </li></ul><ul><li>Definir um parser ‘na mão’ pode ser uma tarefa muito trabalhosa. </li></ul>
  3. 3. Definições Preliminares: Gerador de parser <ul><li>Um gerador de parser é um programa que recebe como entrada um arquivo de especificação da gramática a ser aceita pelo parser (o formato deste arquivo depende do gerador) e retorna um parser que reconhece esta gramática. </li></ul><ul><li>O formato do arquivo de especificação da gramática depende muito do tipo de parser gerado (top-down ou bottom-up) </li></ul>
  4. 4. Geradores de Parsers em Java <ul><li>Nesta aula, iremos abordar o JavaCC, mas existem outros geradores de parser </li></ul><ul><ul><li>SableCC </li></ul></ul><ul><ul><li>JLex & Cup </li></ul></ul><ul><li>O JavaCC é um dos mais populares na comunidade Java, sendo suportado hoje pela comunidade java.net </li></ul>
  5. 5. JavaCC
  6. 6. JavaCC <ul><li>Gerador de parser 100% Java, o mais utilizado pela comunidade Java. Desenvolvido inicialmente pela Sun, já passou por vários outros desenvolvedores e hoje é mantido pela java.net </li></ul><ul><li>É um parser top-down </li></ul><ul><ul><li>Mais fácil de depurar </li></ul></ul><ul><li>Utiliza uma sintaxe muito próxima de Java </li></ul><ul><li>Não checa a corretude do código Java inserido. Pode gerar classes que não compilam. </li></ul>
  7. 7. JavaCC <ul><li>Inclui um pré-processador para geração de árvores sintáticas (jjTree) </li></ul><ul><li>Possui um repositório de gramáticas bastante extenso disponível – inclui linguagens como Java, C, C++, Perl, etc </li></ul><ul><li>Possui uma interface gráfica fácil de usar </li></ul><ul><li>Definições léxicas e sintáticas em um único arquivo </li></ul><ul><li>Não aceita ambigüidades. </li></ul><ul><ul><li>Ex: A gramática não pode possuir recursão à esquerda .(ex: expr:= expr ‘+’ expr) </li></ul></ul>
  8. 8. Gramáticas em JavaCC <ul><li>Uma gramática JavaCC possui a seguinte estrutura: </li></ul><ul><ul><li>Opções do Parser (Não obrigatório) </li></ul></ul><ul><ul><li>Definição da classe do Parser </li></ul></ul><ul><ul><li>Definição dos Tokens (Componente Léxico) </li></ul></ul><ul><ul><ul><li>Terminais </li></ul></ul></ul><ul><ul><li>Definição das Produções (Componente Sintático) </li></ul></ul><ul><ul><ul><li>Ações semânticas associadas </li></ul></ul></ul><ul><ul><ul><li>Não-Terminais </li></ul></ul></ul>
  9. 9. Opções do parser <ul><li>STATIC – diz se os métodos do parser serão estáticos (default: true) </li></ul><ul><li>LOOKAHEAD – informa o nível de profundidade do lookahead (default: 1) </li></ul><ul><li>DEBUG_PARSER – instrui o parser a registrar todas as informações durante o parsing do arquivo (default: false) </li></ul><ul><li>DEBUG_LOOKAHEAD – instrui o parser a registrar também as tentativas de lookahead (default: false) </li></ul>
  10. 10. Mais opções <ul><li>UNICODE_INPUT – informa se a entrada usa a codificaçõo UNICODE </li></ul><ul><li>OUTPUT_DIRECTORY – seta o diretório onde os arquivos java serão gerados (o default é o atual) </li></ul><ul><li>FORCE_LA_CHECK- força a checagem do lookahead em todos os “choice points”, independente da especificação explícita do lookahead (default: false) </li></ul>
  11. 11. Definição da classe do Parser <ul><li>Este trecho define a classe do Parser. Nesta classe, podem ser definidos métodos e variáveis auxiliares. O formato é o seguinte: </li></ul>PARSER_BEGIN(parser_name) ... class parser_name ...{ ... } ... PARSER_END(parser_name)
  12. 12. Definição dos tokens <ul><li>Serve para especificar os tipos de tokens e as expressões regulares associadas </li></ul><ul><li>Nes t a seção são descritas as palavras reservadas </li></ul>TOKEN: { < NUMBER: (<DIGIT>)+ ( &quot;.&quot; (<DIGIT>)+ )? > | < DIGIT: [&quot;0&quot;-&quot;9&quot;] > | < EOL: &quot; &quot; > }
  13. 13. Definição das produções <ul><li>Obedecem o seguinte formato: </li></ul>tipoRetorno nomeProducao(listaParametros): { código Java } { subProducao1() { ação semântica correspondente } [lista de subProducoes] } Declaração de variáveis, invocação de métodos, etc Código Java. Em geral, corresponde a montagem da árvore
  14. 14. Exemplo: EBNF <ul><li>Dada a gramática na forma EBNF </li></ul><ul><ul><li>expr := number       | expr '+' expr       | expr '-' expr       | expr '*' expr       | expr '/' expr       | - expr number := digit+ ('.' digit+)? digit := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' </li></ul></ul><ul><li>A gramática do JavaCC que o representa é a seguinte (Lembre-se de que o JavaCC não permite recursão à esquerda, por isso, é necessário modificar a gramática antes de traduzí-la ): </li></ul>
  15. 15. Exemplo: JavaCC <ul><ul><li>options </li></ul></ul><ul><ul><li>{     LOOKAHEAD=2; </li></ul></ul><ul><ul><li>STATIC=false; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>PARSER_BEGIN(Arithmetic) public class Arithmetic { } </li></ul></ul><ul><ul><li>PARSER_END(Arithmetic) </li></ul></ul>
  16. 16. Exemplo:JavaCC <ul><ul><li>SKIP : </li></ul></ul><ul><ul><li>{   &quot; &quot; | &quot; &quot; | &quot; &quot; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>TOKEN: </li></ul></ul><ul><ul><li>{  < NUMBER: (<DIGIT>)+ ( &quot;.&quot; (<DIGIT>)+ )? > </li></ul></ul><ul><ul><li>| < DIGIT: [&quot;0&quot;-&quot;9&quot;] > </li></ul></ul><ul><ul><li>} </li></ul></ul>
  17. 17. Exemplo:JavaCC <ul><ul><li>double expr(): {} </li></ul></ul><ul><ul><li>{     term() ( &quot;+&quot; expr() | &quot;-&quot; expr() )* </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>double term(): {} </li></ul></ul><ul><ul><li>{     unary() ( &quot;*&quot; term() | &quot;/&quot; term() )* </li></ul></ul><ul><ul><li>} </li></ul></ul>
  18. 18. Exemplo:JavaCC <ul><li>double unary(): { } </li></ul><ul><li>{ </li></ul><ul><li>&quot;-&quot; a=element() | a = element() </li></ul><ul><li>} </li></ul><ul><li>double element(): {} </li></ul><ul><li>{ </li></ul><ul><li><NUMBER> </li></ul><ul><li>} </li></ul>
  19. 19. Exercício <ul><ul><li>Altere o exemplos dados para que estes possam reconhecer as seguintes expressões: </li></ul></ul><ul><ul><ul><li>parênteses “(“ , “)” -> expr ::= (expr) </li></ul></ul></ul><ul><ul><ul><li>exponenciação -> expr ::= expr ^ expr </li></ul></ul></ul><ul><ul><li>Onde a ordem de precedência é: parênteses > exponenciação </li></ul></ul>

×