josé francisco pereira equipe de monitores teoria e implementação de linguagens computacionais -...
TRANSCRIPT
José Francisco PereiraEquipe de Monitores
Teoria e Implementação de Linguagens Computacionais - IF688
Centro de Informática – CInUniversidade Federal de Pernambuco – UFPE
SableCC
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.
RoteiroIntroduçãoPassos para construir um compilador
usando SableCCArquivo de Especificação SableCCPós-Execução SableCCSubdiretório Node (AST Nodes)Exemplo
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
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
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
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
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’])*
Token DeclarationsDefinições dos terminais e “Tokens” para
serem utilizados nas produções
Tokens id = letternumber = digit+; plus = ‘+’;
ExemploHelpers
any_charater = [0x0 .. 0xfffff]; nl = ‘\n’;
Tokens comment = ‘⁄⁄’ any_character nl blank = 10 | 10 13 | 9;
Ignored Tokens comment; blank;
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;
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)
Passos para construir um compilador usando SableCC
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
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
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_;}
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!!!
Exemplo: AST Gerada
ReferênciasBrainy Creatures
http://www.brainycreatures.org/compiler/sablecc.asp
Sablecc.orghttp://sablecc.org/