160 likes | 275 Views
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 : alexandrecordel@gmail.com greinaldo@fbv.edu.br
E N D
JavaCC Prof. AlexandreMonteiro Baseadoem material cedidopelo Prof. EuclidesArcoverde Recife
Contatos • Prof. Guilherme Alexandre Monteiro Reinaldo • Apelido: Alexandre Cordel • E-mail/gtalk: alexandrecordel@gmail.com greinaldo@fbv.edu.br • 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
Técnica para implementar tabelas LL Exemplo: Regras = { X a X X b } Tabela LL: Parser recursivo descendente: voidreadTerm(Terminal c) { if (currentTerm!=c) throw new SyntaxError(); currentTerm = getNextTerm(); } voidreadX() { switch (currentTerm) { case a: readTerm(a); readX(); break; case b: readTerm(b); break; default: throw new SyntaxError(); } } Parser Recursivo Descendente
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.
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;
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
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"> }
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.
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
Formato de uma Descrição(cont.) • Declaração do não-terminal X: void X() : { } { <A> X() | <B> } • Equivale a: X a X X b
PARSER_BEGIN(ReadExpr) public class ReadExpr { } PARSER_END(ReadExpr) SKIP : { " " | "\t" } TOKEN : { <A : (["a"-"z"])+ > | <B : (["0“-”9”])+ > | <ENTER : "\n"> } void S() : { } { X() <ENTER> } void X() : { } { <A> X() | <B> } Descrição Completa
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); } }
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/jw-12-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/jw-12-2000/jw-1229-cooltools.html • Site Oficial • https://javacc.java.net/
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)