JavaCC JavaCC • Gerador de parser 100% Java – O mais utilizado pela comunidade Java • Desenvolvido inicialmente pela Sun – Hoje é mantido pela java.net • É um parser top-down – Mais fácil de depurar • Utiliza uma sintaxe muito próxima de Java JavaCC • Desvantagens – Mistura código Java com a gramática – Não checa a corretude do código Java inserido – Pode gerar classes que não compilam JavaCC • Inclui um pré-processador para geração de árvores sintáticas (jjTree) • Possui um repositório de gramáticas bastante extenso disponível – inclui linguagens como Java, C, C++, Perl, etc • Possui uma interface gráfica fácil de usar • Definições léxicas e sintáticas em um único arquivo • Não aceita ambigüidades. – Ex: A gramática não pode possuir recursão à esquerda.(ex: expr:= expr ‘+’ expr) JavaCC • Instalação – Via Eclipse MarketPlace OU – Update site: http://eclipse-javacc.sourceforge.net/ Gramáticas em JavaCC • Uma gramática JavaCC possui a seguinte estrutura: – Opções do Parser (Não obrigatório) – Definição da classe do Parser – Definição dos Tokens (Componente Léxico) • Terminais – Definição das Produções (Componente Sintático) • Ações semânticas associadas • Não-Terminais Opções do parser • STATIC – diz se os métodos do parser serão estáticos (default: true) • LOOKAHEAD – informa o nível de profundidade do lookahead (default: 1) • IGNORE_CASE– instrui o parser a ser ou não case sensitive (default: false) • DEBUG_PARSER – instrui o parser a registrar todas as informações durante o parsing do arquivo (default: false) • Mais opções : https://javacc.java.net/doc/javaccgrm.html Definição do Parser • Este trecho define a classe do Parser. Nesta classe, podem ser definidos métodos e variáveis auxiliares. O formato é o seguinte: PARSER_BEGIN(parser_name) ... class parser_name ...{ ... } ... PARSER_END(parser_name) Definição dos tokens • Serve para especificar os tipos de tokens e as expressões regulares associadas • Nesta seção são descritas as palavras reservadas TOKEN: { < NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? > | < DIGIT: ["0"-"9"] > | < EOL: "\n" > } Definição das produções • Obedecem o seguinte formato: tipoRetorno nomeProducao(listaParametros): { Declaração de variáveis, código Java invocação de métodos, etc } { subProducao1() { ação semântica correspondente } [lista de subProducoes] } Código Java. Em geral, corresponde a montagem da árvore Exemplo: BNF SOMA Calculadora ::= Soma | Subtracao Soma ::= Numero “+” Numero Subtracao ::= Numero “-” Numero Numero::= [0-9]+ Exemplo: EBNF Programa ::= Expressao Expressao ::= Valor | ExpUnaria | ExpBinaria Valor ::= ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao Exemplo: EBNF Lembre-se de que o JavaCC Programa ::= Expressao Expressao ::= Valor | ExpUnaria | ExpBinaria não permite recursão à esquerda, por isso, é Valor ::= ValorConcreto necessário modificar a ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString gramática antes de traduzí-la. ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao Exemplo: EBNF Programa ::= Expressao Expressao ::= ExpressaoPar ExpressaoPar ::= ExpCondicionalOr ExpCondicionalOr ::= ExpCondicionalAnd ("or" ExpCondicionalAnd)* ExpCondicionalAnd ::= ExpIgualdade ("and" ExpIgualdade)* ExpIgualdade ::= ExpAritmetica ("==" ExpAritmetica)? ExpAritmetica ::= ExpConcatenacao (("+" | "-") ExpConcatenacao)* ExpConcatenacao ::= ExpUnaria ("++" ExpUnaria)* ExpUnaria ::= "-" Expressao | "not" Expressao | ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ExpPar ExpPar ::= “(“Expressao“)” Exercício • Altere o exemplos dados para que estes possam reconhecer as seguintes expressões: – exponenciação -> expr ::= expr ^ expr – Valor concreto String e a expressão “length” • Acrescente o que for necessário para fazer o parser de Expressões2 Exemplo: EBNF Programa ::= Expressao Expressao ::= ExpressaoPar ExpressaoPar ::= ExpCondicionalOr ExpCondicionalOr ::= ExpCondicionalAnd ("or" ExpCondicionalAnd)* ExpCondicionalAnd ::= ExpIgualdade ("and" ExpIgualdade)* ExpIgualdade ::= ExpAritmetica ("==" ExpAritmetica)? ExpAritmetica ::= ExpConcatenacao (("+" | "-") ExpConcatenacao)* ExpConcatenacao ::= ExpUnaria ("++" ExpUnaria)* ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao | ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ExpPar ExpPar ::= “(“Expressao“)” Referências • • • • • • https://javacc.dev.java.net/ https://javacc.dev.java.net/doc/docindex.html http://www.cs.aau.dk/~bt/SPOF07/Lecture4.htm http://www.antlr.org/works/index.html http://en.wikipedia.org/wiki/Top-down_parsing http://en.wikipedia.org/wiki/Bottom-up_parsing PLP – JavaCC Java Compiler Compiler Joabe Jesus - [email protected] Prof. Augusto Sampaio