1 javacc prof. alexandre monteiro baseado em material cedido pelo prof. euclides arcoverde recife

16
1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Upload: internet

Post on 21-Apr-2015

106 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

1

JavaCC

Prof. Alexandre Monteiro

Baseado em material cedido pelo Prof. Euclides Arcoverde

Recife

Page 2: 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]

[email protected]

Site: http://www.alexandrecordel.com.br/fbv

Celular: (81) 9801-1878

Page 3: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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

Page 4: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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

Page 5: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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.

Page 6: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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;

Page 7: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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

Page 8: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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">

}

Page 9: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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.

Page 10: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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

Page 11: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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

Page 12: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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>

}

Page 13: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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); }}

Page 14: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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/

Page 15: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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/

Page 16: 1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

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)