You are on page 1of 35

SCC 206 Introduo a Compilao (11/03/2013)

Introduo a Compilao

JavaCC - Java Compiler Compiler

Lianet Seplveda Torres e Mara Luca Castro Jorge {lisepul, mluciacj}@icmc.usp.br

SCC 206 Introduo a Compilao (11/03/2013)

Fases de um compilador
Analisadores lxicos
Quebra um programa em tokens e classifica estes tokens
Identificar erros lxicos

Analisadores sintticos (Parsers)


Analisa um programa de acordo com as regras da gramtica Programas que recebem como entrada um arquivo fonte e diz se ele est correto sintaticamente, segundo uma gramtica pr-definida.

2
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Parsers
Implementar um parser manualmente pode ser uma tarefa muito trabalhosa Geradores de Parsers H dois tipos de parsers
Parser Top-down (no curso implementaremos este) Parser Bottom-up
3
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Geradores de Parsers
Arquivo de especificao da gramtica a ser aceita pelo parser Gerador de Parser

Parser que reconhece esta gramtica

4
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Java Compiler Compiler


um gerador de analisadores lxicos e de parsers COMPILADOR / INTERPRETADOR incorpora um analisador lxico e um parser
O analisador semntico e a gerao de cdigo so possveis via incluso de cdigo JAVA

5
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC
Converte a gramtica para um programa em JAVA que pode reconhecer programas para a dada gramtica A descrio dos tokens dada em expresso regular Est no mesmo arquivo da gramtica (p.ex. lex e yacc geram arquivos separados)

6
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC
Sequncia de caracteres do programa Analisador Lxico

Sequncia de objetos da classe Token ( dada pelo JavaCC) + especificao da gramtica (regras so sequncias de funes)

Analisador Sinttico (Parser)

Programa Java que executar o parsing do programa


7
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Sada do Analisador Sinttico


Pode gerar uma representao intermediria na forma de uma rvore sinttica abstrata via ferramenta JJTree, que acompanha o JavaCC Pode gerar um especificao dos ferramenta JJDoc documento HTML com a tokens e da gramtica via

JJTree e JJDoc ferramentas de JavaCC mas no exigiremos no projeto


8
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC
L uma gramtica no formato EBNF Gramtica LL(k) L - Left-right: sentido de leitura da esquerda para a direita L Leftmost derivation: tipo de derivao considerada derivao mais esquerda (k) k lookahead: nmero de smbolos necessrios para distinguir a produo correta

9
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

LL(k)
LL(1):
1. Dada: A -> X1A1 | X2A2|...| XnAn First(Xis) no so disjuntos.
Os conjuntos primeiro das produes da gramtica devem ser disjuntos entre si

2. Somente uma produo pode derivar em 3. Para toda produo A-> | :


Se =>* no deriva cadeias comeando com um terminal no Follow(A)
First() Follow(A)

Se =>* no deriva cadeias comeando com um terminal no Follow(A)


First() Follow(A) 10
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Algumas restries de LL(k)


A gramtica LL(k) no pode conter recurso a esquerda:
ERRADO
Todo top-down no pode ter recurso a esquerda

E -> T (+ T)* T -> F (* F)* F -> NUM | ( E )

CORRETO
Exemplos retirados de: Using JAVACC: http://www.cs.lmu.edu/~ray/notes/javacc/

11
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Algumas restries de LL(k)


A gramtica LL(k) no pode ser ambgua:
Gera duas rvores sintticas para a expresso 1+2*3

Exemplos retirados de: Building your own languages with JAVACC: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-cooltools.html

12

Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Algumas restries de LL(k)


A gramtica LL(k) no pode ser ambgua:
expr -> term() ( "+" expr | "-" expr )* term -> unary() ( "*" term | "/" term )* unary -> "-" element | element element -> <NUMBER> | "(" expr ")"

Gera somente uma rvores sinttica para 1+2*3

O Parser LL(k) determinstico, por isso no pode ter ambiguidade

Exemplos retirados de: Building your own languages with JAVACC: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-cooltools.html

13

Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

LL(1)
Exerccio de casa
Verificar se CLike com as extenses LL(1)

14
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Instalao do JavaCC
Instale o JAVA (jdk 6.0, por exemplo) Faa o download do JAVACC e descompacte: http://javacc.java.net/ Adicione o diretrio /bin do JAVACC na varivel de ambiente do sistema PATH JavaCC Plug-in de Eclipse (Help/Install New Software http://eclipse-javacc.sourceforge.net/)
15
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo - Calculadora


Realizar operaes de soma, subtrao e multiplicao com nmero inteiros Exemplo de funcionamento:
Operao = 1+2 Resultado = 3 Operao = -2+1 Resultado = -1

Gramtica:
Start -> Expression Expression Term (PLUS Term | MINUS Term) Term Primary (TIMES Primary) Primary -> NUMBER
Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/ Lianet Seplveda Torres e Maria Luca Castro Jorge

16

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora


1. Definio da classe do Parser Bloco para inserir declaraes de java dentro da classe (podem ser definidos mtodos e variveis auxiliares)
Classe Principal (Parser que ser gerado Calculator.java)

Entrada de tokens

Mtodo gerado pelo smbolo inicial da gramtica Classes de excees geradas pelo JAVACC

17
Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/ Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora

2. Definio dos Tokens (Componente Lxico)


Serve para especificar os tipos de tokens e as expresses regulares associadas Nesta seo so descritas as palavras reservadas
Caracteres desconsiderados durante a anlise

Tokens so definidos por ERs Token local

Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/

18
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Start -> Expression Expression Term (PLUS Term | MINUS Term) Term Primary (TIMES Primary) Primary -> <NUMBER>

Primeiro exemplo Calculadora 3. Definio das Produes (Componente Sinttico) Aes semnticas associadas
Cada no terminal da gramtica um mtodo do parser

Cdigo Java inserido


Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/

19
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Start -> Expression Expression Term (PLUS Term | MINUS Term) Term Primary (TIMES Primary) Primary -> NUMBER

Primeiro exemplo Calculadora

Cada no terminal da gramtica um mtodo do parser

Cdigo Java inserido


Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/

20
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora


Opes do Parser (No obrigatrio)
STATIC diz se os mtodos do parser sero estticos (default: true) LOOKAHEAD informa o nvel de profundidade do lookahead (default: 1) DEBUG_PARSER instrui o parser a registrar todas as informaes durante o parsing do arquivo (default: false) DEBUG_LOOKAHEAD instrui o parser a registrar tambm as tentativas de lookahead (default: false)

21
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Gerando o Parser (Calculator.jj)


javacc Calculator.jj Gera 7 arquivos:
Calculator.java -> parser CalculatorConstants.java CalculatorTokenManage.java ParseException.java SimpleCharStream.java Token.java TokenMgrError.java

javac Calculator.java compilar java Calculator Executar o programa


22
Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/ Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC- Gerando o Parser


Calculator.java parser CalculatorTokenManage.java analisador lxico TokenMgrError.java para detectar erros lxicos ParseException.java para detectar erros sintticos
Subclasse de Throwable (Exception)

SimpleCharStream.java responsvel por adaptar a entrada para o analisador lxico Token.java classe que representa os tokens
Image string que representa o token Kind nmero que representa o tipo do token ... Exemplo adaptado de: JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/

23

Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora (Calculator.jj) Mensagens para erros lxicos podem ser editadas no arquivo TokenMgrError.java Exemplo de erro lxico uso do operador / no definido
Operao: 33/1 Erro lxico!

24
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora (Calculator.jj) Mensagens para erros sintticos podem ser editadas no arquivo ParserException.java Exemplo de erro sinttico algo no definido nas regras da gramtica
Operao: +33 Erro sinttico!

25
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora (Calculator.jj) Erros semnticos so identificados durante a anlise sinttica Exemplo de erro semntico overflow
Operao: 777766669999+33 Erro semntico!
Trecho de cdigo retirado do mtodo Primary() identificao de erro semntico

26
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Start -> Expression Expression Term (PLUS Term | MINUS Term) Term Primary (TIMES Primary) Primary -> NUMBER

Primeiro exemplo Calculadora (Calculator.jj) Exerccio: Incluir operaes de negao e operaes parentesadas na calculadora, com as prioridades: Parnteses e negao tem a mesma prioridade de nmero

27
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora (Calculator.jj) Exerccio:


Incluir operaes de negao e operaes parentesadas na calculadora, com as prioridades: Parnteses e negao tem a mesma prioridade de nmero
Start -> Expression Expression Term (PLUS Term | MINUS Term) Term Primary (TIMES Primary) Primary -> NUMBER | OPEN_PAR Expression CLOSE_PAR | MINUS Primary
28
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Primeiro exemplo Calculadora (Calculator.jj) Exerccio:


int Primary() : TOKEN : { < OPEN_PAR : "(" > } { TOKEN : { < CLOSE_PAR : ")" > } Token t ; Int d; } { t = <NUMBER> { try{ return Integer.parseInt( t.image ) ; }catch (NumberFormatException e){ System.out.println("\nErro Semantico na linha " + t.beginLine + ", coluna " + t.beginColumn + ": overflow"); } } | <OPEN_PAR> d=Expression() <CLOSE_PAR> { return d ; } | <MINUS> d=Primary(){ return -d ; } }

29
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Regras de Desambiguao


Como o JAVACC realiza a desambiguao Exemplo expresso regular: Palavra reservada: program Identificador: programa Duas regras: Busca o maior prefixo que define um token vlido Se uma string corresponde a dois tipos usar o tipo que definido primeiro no arquivo
30
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Regras de Desambiguao


Lookahead = 1 (default) Aparece o warning porque o JavaCC reconheceu que a gramtica no LL(1) Se no mostra warning ento a gramtica LL(1) Neste exemplo a gramtica ambgua

31
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Regras de Desambiguao


Aparece o warning porque o JavaCC reconheceu que a gramtica no LL(1) Se no mostra warning ento a gramtica LL(1) Neste exemplo a gramtica ambgua Quando

aparece o warning Duas solues


32
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Regras de Desambiguao


1 soluo: Transformar a gramtica em LL(1)

33
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

JavaCC - Regras de Desambiguao


2 soluo: Indicar ao parser quando a gramtica no LL(1) uso do Lookahead >1 Local lookahead : Trata como LL(K) determinadas produes da gramtica Global Lookahead: Trata toda a gramtica como LL(K)
34
Lianet Seplveda Torres e Maria Luca Castro Jorge

SCC 206 Introduo a Compilao (11/03/2013)

Referncias
JavaCC [tm]: Documentation Index: http://javacc.java.net/doc/docindex.html Building your own languages with JAVACC: http://www.javaworld.com/javaworld/jw-122000/jw-1229-cooltools.html JAVACC Tutorial: http://www.engr.mun.ca/~theo/JavaCC-Tutorial/ Using JAVACC: http://www.cs.lmu.edu/~ray/notes/javacc/ Java Compiler Compiler Documentation: http://javacc.java.net/doc/ JAVACC: Java compilers compiler: http://ltiwww.epfl.ch/~petitp/GenieLogiciel/GenLog7.pdf Writing Interpreters with JAVACC: http://www.cs.nmsu.edu/~rth/cs/cs471/InterpretersJavaCC.html A Start Kit for JAVACC: http://w3.msi.vxu.se/users/jonasl/javacc/ Gramticas LL(k) Notas de Aula: http://winandy.voila.net/LLk_NotasAula.pdf Notas de aula da professora Sandra Maria Alusio Aho, A. V., Lam, M. S., Sethi, R. e Ullman, J. D. (2008): Compiladores: Princpios, tcnicas e ferramentas. 2Edio, Pearson Addison-Wesley Create your own Programming Languege: http://www.codeproject.com/Articles/50377/Create-Your-Own-Programming-Language JavaCC Eclipse Plug-in: http://eclipse-javacc.sourceforge.net/

35
Lianet Seplveda Torres e Maria Luca Castro Jorge

You might also like