JavaCC  Java Compiler Compiler Paradigmas de Linguagens de Programação Adeline de Sousa Silva - adss@cin.ufpe.br
Definições preliminares: Parser <ul><li>Um  parser  é um programa que recebe como entrada um  arquivo fonte  e diz se ele ...
Definições Preliminares: Gerador de  parser <ul><li>Um  gerador de parser  é um programa que recebe como entrada um arquiv...
Geradores de Parsers em Java <ul><li>Nesta aula, iremos abordar o JavaCC, mas existem outros geradores de parser </li></ul...
JavaCC
JavaCC <ul><li>Gerador de parser 100% Java, o mais utilizado pela comunidade Java. Desenvolvido inicialmente pela Sun, já ...
JavaCC <ul><li>Inclui um pré-processador para geração de árvores sintáticas (jjTree) </li></ul><ul><li>Possui um repositór...
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...
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 ...
Mais opções <ul><li>UNICODE_INPUT – informa se a entrada usa a codificaçõo UNICODE  </li></ul><ul><li>OUTPUT_DIRECTORY – s...
Definição da classe do Parser <ul><li>Este trecho define a classe do Parser. Nesta classe, podem ser definidos métodos e v...
Definição dos tokens <ul><li>Serve para especificar os tipos de tokens e as expressões regulares associadas </li></ul><ul>...
Definição das produções <ul><li>Obedecem o seguinte formato: </li></ul>tipoRetorno nomeProducao(listaParametros): { código...
Exemplo: EBNF <ul><li>Dada a gramática na forma EBNF </li></ul><ul><ul><li>expr := number        | expr '+' expr        | ...
Exemplo: JavaCC <ul><ul><li>options  </li></ul></ul><ul><ul><li>{      LOOKAHEAD=2;  </li></ul></ul><ul><ul><li>STATIC=fal...
Exemplo:JavaCC <ul><ul><li>SKIP :  </li></ul></ul><ul><ul><li>{    &quot; &quot;  | &quot;
&quot;  | &quot;	&quot;  </li><...
Exemplo:JavaCC <ul><ul><li>double expr(): {}  </li></ul></ul><ul><ul><li>{      term() ( &quot;+&quot; expr() | &quot;-&qu...
Exemplo:JavaCC <ul><li>double unary(): { }  </li></ul><ul><li>{  </li></ul><ul><li>&quot;-&quot; a=element() |  a = elemen...
Exercício <ul><ul><li>Altere o exemplos dados para que estes possam reconhecer as seguintes expressões: </li></ul></ul><ul...
Próximos SlideShares
Carregando em…5
×

JavaCC

2.814 visualizações

Publicada em

Publicada em: Tecnologia, Educação
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
2.814
No SlideShare
0
A partir de incorporações
0
Número de incorporações
46
Ações
Compartilhamentos
0
Downloads
78
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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>

×