JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife ‹#› Contatos Prof. Guilherme Alexandre Monteiro Reinaldo Apelido: Alexandre Cordel E-mail/gtalk: [email protected] [email protected] Site: http://www.alexandrecordel.com.br/fbv Celular: (81) 9801-1878 JavaCC Java Compiler-Compiler Ferramenta geradora de compiladores para a linguagem Java Abrange as fases de análise léxica e sintática Suporta E-BNF Produz parsers recursivos descendentes 3 Parser Recursivo Descendente Técnica para implementar tabelas LL Parser recursivo descendente: void readTerm(Terminal c) { if (currentTerm!=c) Exemplo: throw new SyntaxError(); Regras = { X a X currentTerm = getNextTerm(); Xb} } void readX() { Tabela LL: switch (currentTerm) { a X aX case a: readTerm(a); b readX(); break; case b: readTerm(b); break; b default: throw new SyntaxError(); } } 4 Utilização javacc desc •Implementa a linguagem descrita em “desc” jjdoc desc •Produz uma E-BNF da linguagem “desc” jjtree desc •Implementa a árvore sintática para “desc” •Será estudado futuramente. 5 Formato de uma Descrição Configura o parser gerado (opcional): Options { opções } Alguns tipos de opções: lookahead = 2; ignore_case = true; unicode_input = false; 6 Formato de uma Descrição (cont.) Define a classe em que será implementada o Parser: PARSER_BEGIN(ReadExpr) public class ReadExpr { ... Colocar aqui definições de métodos e variáveis úteis ... } PARSER_END(ReadExpr) Características da classes gerada: • Construtor: ReadExpr(InputStream source) .... • Implementação dos não-terminais através de métodos 7 Formato de uma Descrição (cont.) Define os caracteres que devem ser ignorados: SKIP : { " " | "\t" } Define os tokens importantes da linguagem: TOKEN : { <A : "a"> | <B : "b"> | <ENTER : "\n"> } 8 Resolução de ambigüidade Se a mesma palavra puder produzir dois ou mais tokens diferentes será considerado: •O token que consumir mais caracteres •O que foi declarado primeiro. 9 Formato de uma Descrição (cont.) Define o não-terminal S: void S() : {} { X() <ENTER> } Equivalente: S X enter Sintaxe Geral: TipoDoNaoTerminal NomeNaoTerminal(Argumentos) : { Declaração de variáveis Locais } { Declaração das regras e Ações } Conflitos na tabela LL geram erros que serão reportados ao projetista 10 Formato de uma Descrição (cont.) Declaração do não-terminal X: void X() : {} { <A> X() | <B> } Equivale a: XaX Xb 11 Descrição Completa PARSER_BEGIN(ReadExpr) void S() : { } public class ReadExpr { { } X() <ENTER> } PARSER_END(ReadExpr) void X() : { } SKIP : { " " | "\t" } { <A> X() | TOKEN : { <A : (["a"-"z"])+ > <B> } | <B : (["0“-”9”])+ > | <ENTER : "\n"> } 12 Programa Principal Programa que cria e executa um parser: public static void main(String args[]) { ReadExpr parser = new ReadExpr(System.in); try { parser.S(); System.out.println("OK!!!!"); } catch (ParseException ex) { System.out.println("Error : " + ex); } } 13 Próxima Aula – 07/NOV Estudem/Revisem as aulas dadas até o presente momento. Estudar o JavaCC seguindo as referências passadas a seguir. Existe bastante material na internet (Ex. youtube) Principais Referências: •http://www.javaworld.com/javaworld/jw12-2000/jw-1229-cooltools.html •https://javacc.java.net/ Referências JavaCC •https://javacc.dev.java.net/ Eclipse JavaCC Plug-in •http://eclipse-javacc.sourceforge.net/ Tutorial •http://www.javaworld.com/javaworld/jw12-2000/jw-1229-cooltools.html Site Oficial •https://javacc.java.net/ 15 Bibliografia AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princípios, técnicas e ferramentas. Ed. Addison Wesley. 2a Edição, 2008 (Capítulo 4) 16