Upload
internet
View
107
Download
0
Embed Size (px)
Citation preview
1
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]
Site: http://www.alexandrecordel.com.br/fbv
Celular: (81) 9801-1878
3
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
4
Parser Recursivo Descendente
Técnica para implementar tabelas LL
Exemplo:
Regras = { X a X
X b }
Tabela LL:
Parser recursivo descendente:
void readTerm(Terminal c) {
if (currentTerm!=c)
throw new SyntaxError();
currentTerm = getNextTerm();
}
void readX() {
switch (currentTerm) {
case a: readTerm(a);
readX(); break;
case b: readTerm(b); break;
default:
throw new SyntaxError();
}
}
a b
X a X b
5
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.
6
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;
7
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
8
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">
}
9
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.
10
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
11
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
12
Descrição Completa
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>
}
13
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/
15
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/
16
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)