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();
Xb}
}
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:
XaX
Xb
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
Download

Aula 10 (08/04/2015)