josé francisco pereira equipe de monitores teoria e implementação de linguagens computacionais -...

19
José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco – UFPE [email protected] SableCC

Upload: internet

Post on 19-Apr-2015

102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

José Francisco PereiraEquipe de Monitores

Teoria e Implementação de Linguagens Computacionais - IF688

Centro de Informática – CInUniversidade Federal de Pernambuco – UFPE

[email protected]

SableCC

Page 2: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

MotivaçãoGeração de analisador léxico e sintático

automática.Maior performance.

Parte do conteúdo desta apresentação foi extraída do original feito por Shirley Jacinto.

Page 3: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

RoteiroIntroduçãoPassos para construir um compilador

usando SableCCArquivo de Especificação SableCCPós-Execução SableCCSubdiretório Node (AST Nodes)Exemplo

Page 4: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Introdução Framework orientado a objetos para

geração de compiladores implementado em JAVA;Possui vasta documentaçãoMuitos exemplos de linguagem (PHP, Java

etc)Produzido no meio acadêmicoUtiliza uma versão estendida do Visitor

Page 5: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Construção do compilador1. Criar o arquivo de especificação

Definicões léxicas e a gramática

2. Gerar o framework utilizando o SableCC3. Criar classe para a análise semântica,

geração de código, otimizações etc.4. Criar a “Driver Class”, o compilador

propriamente dito5. Compilar o compilador

Page 6: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Arquivo de EspecificaçãoA sintaxe do SableCC é baseada no BNFMembros do arquivo:

<Grammar> → [<package declaration>] [<helper declarations>] [<states declarations>] [<token declarations>] [<ignored tokes>] [<productions>]

Um arquivo vazio é aceito

Page 7: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

PackageBasicamente informa os pacotes que serão

utilizados no código JAVA gerado do compilador. Ex:br.ufpe.cin.if688.AulaMonitoriaO código será gerado no diretório .\br\ufpe\

cin\if688\AulaMonitoria

Page 8: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Helper DeclarationsFuncionam como constantes. Utilizados

para auxiliar outras declarações.Helpers

letter = [‘a’ .. ‘z’]; digit = [‘0’ .. ‘9’];

id = letter (letter | digit)* // TokenOu

id = [‘a’ .. ‘z’] ([‘a’ .. ‘z’] | [‘0’ .. ‘9’])*

Page 9: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Token DeclarationsDefinições dos terminais e “Tokens” para

serem utilizados nas produções

Tokens id = letternumber = digit+; plus = ‘+’;

Page 10: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

ExemploHelpers

any_charater = [0x0 .. 0xfffff]; nl = ‘\n’;

Tokens comment = ‘⁄⁄’ any_character nl blank = 10 | 10 13 | 9;

Ignored Tokens comment; blank;

Page 11: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Exemplo: Arquivo de Especificação SableCC

Package compilador;

Tokens

number = ['0' .. '9']+;plus = '+';minus = '-';mult = '*';div = '/';mod = '%';l_par = '(';r_par = ')';blank = (' ' | 13 | 10)+;

Ignored Tokens

blank;

Productions

expr ={factor} factor |{plus} expr plus factor |{minus} expr minus factor;

factor ={term} term |{mult} factor mult term |{div} factor div term |{mod} factor mod term;

term ={number} number |{expr} l_par expr r_par;

Page 12: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Pós-Execução SableCC4 subdiretórios são gerados:

Lexer (Análise léxica)Parser (Análise Sintática)Node (Nodos da AST)Analysis (Análise Contextual)

Page 13: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Passos para construir um compilador usando SableCC

Page 14: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Subdiretório Node (AST Nodes)

Para cada Token, uma classe TNomeToken;

Tokens

number = ['0' .. '9']+;plus = '+';minus = '-';mult = '*';div = '/';mod = '%';l_par = '(';r_par = ')';blank = (' ' | 13 | 10)+;

Classes Geradas

TNumber.javaTPlus.javaTMinus.javaTMult.javaTDiv.javaTMod.javaTLPar.javaTRPar.javaTBlank

Extends Token.java

Page 15: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Subdiretório Node (AST Nodes)

Para cada: Production = PNomeProducao.javaAlternativa da producão = ANomeAlternativa

Productionsexpr ={factor} factor |{plus} expr plus factor |{minus} expr minus factor;

factor ={term} term |{mult} factor mult term |{div} factor div term |{mod} factor mod term;

term ={number} number |{expr} l_par expr r_par;

Classes GeradasPExp.javaAFactorExp.javaAPlusExp.java.... Extends PExp.java

PFactor.javaATermFactor.java.... Extends PFactor.java

PTerm.javaANumberTerm.java... Extends PTerm.java

Page 16: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Subdiretório Node (AST Nodes)

expr ={factor} factor |{plus} expr plus factor |{minus} expr minus factor;

class AFactorExpr extends PExpr{ private PFactor factor_;}

class APlusExpr extends PExpr{ private PExpr expr_; private TPlus plus_; private PFactor factor_;}

Page 17: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Exemplo: Execução Type an arithmetic expression: (45 + 36 / 2) * 3 + 5 * 2

Saída : Análise léxica e sintática realizadas com sucesso!!!

Page 18: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

Exemplo: AST Gerada

Page 19: José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal

ReferênciasBrainy Creatures

http://www.brainycreatures.org/compiler/sablecc.asp

Sablecc.orghttp://sablecc.org/