aula de sablecc teoria e implementação de linguagens computacionais (compiladores) - if688 –...
TRANSCRIPT
Aula de SableCCAula de SableCCTeoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1
Artur Ribeiro de Aquino – araAllan Jefferson – ajss
RoteiroRoteiroIntroduçãoMotivaçãoProcedimentosGramáticaExecução do SableCCPós-execução do SableCCPackage nodeExecuçãoAlternative output
Introdução (1/3)Introdução (1/3)Analisador léxico – lê a sequência
de caracteres e organiza como tokens;
Analisador sintático – agrupa caracteres ou tokens em estruturas hierárquicas com algum significado.
Introdução (2/3)Introdução (2/3)ab
stra
ção
implem
entação
Código fonte
Tokens e lexemas
Árvoresintáticaabstrata
CódigoMáquina
AST decorada
Análise Léxica
Análise SintáticaAnálise Semântica
Geração de Código
Introdução (3/3)Introdução (3/3) “SableCC is a parser generator which generates fully
Featured object-oriented frameworks for building compilers, interpreters and other text parsers.”
http://sablecc.org
Utiliza o parser LALR(1) – melhoramento sobre o LR(1);
Vasta documentação;Muitos exemplos de linguagens
(PHP, Java, etc.);Produzido no meio acadêmico;Versão estendida do padrão Visitor.
MotivaçãoMotivaçãoGeração automática do
analisador léxico e sintático;Constrói a árvore de sintaxe
abstrata;Fornece métodos para caminhar
na árvore;Ganho no ciclo de
desenvolvimento.
Procedimentos (1/2) Procedimentos (1/2) Construção do compilador
1. Criar arquivo de especificação• Definições léxicas e a gramática
2. Gerar o framework (rodar o SableCC)3. Criar classes para análise semântica,
geração de código, otimizações, etc.4. Criar a “Driver Class” – “O”
compilador5. Compilar o compilador
Procedimentos (2/2)Procedimentos (2/2)
Gramática (1/7)Gramática (1/7)A sintaxe é baseada na BNF (Backus-
Naur Form);Membros do arquivo de especificação:
<Grammar> → [<package declaration>] [<helper declarations>] [<states declarations>] [<token declarations>] [<ignored tokes>] [<productions>]
Arquivos vazios são aceitos
Gramática (2/7) - PackageGramática (2/7) - PackageInforma os pacotes que serão
utilizados como destino do código Java que será gerado pelo SableCC
Exemplo:◦br.ufpe.cin.if688.AulaMonitoria
O código será gerado no diretório.\br\ufpe\cin\if1688\AulaMonitoria
Gramática (3/7) - HelperGramática (3/7) - HelperUsados como auxiliares para outras
declarações (“constantes”)Mapeiam e identificam os caracteres
a serem utilizadosExemplos:
◦a = ‘a’ | ‘A’ ;◦digit = [‘0’ .. ‘9’] ;◦letter = [‘a’..‘z’];
id = letter (letter|digit)* // Uso no token
Gramática (4/7) - StatesGramática (4/7) - StatesUsados para lidar com declarações de
tokens, cada state está associado a um conjunto de tokens;
Quando o analisador léxico está num estado (state) somente reconhece tokens associados a este estado;
Transições de estado (AFD) são acionadas no reconhecimento dos tokens;
Exemplo:
Dispensável pro nosso projeto.
Statesbol, inlineTokens{bol -> inline, inline} char [[0..0xffff] – [10 + 13]];{bol, inline -> bol} eol = 10 | 13 | 10 13;
Gramática (5/7) - TokensGramática (5/7) - TokensDefinições dos terminais para
uso nas produções - significadoPalavras reservadas,
identificadores, comentários, “ignored tokens”, ...
Exemplos:◦number = digit+ ;◦plus = ‘+’ ;◦id = letter (letter | digit)* ;
Gramática (6/7) - Gramática (6/7) - ProductionsProductionsRegras da gramática, funcionam
como “operações” sobre os tokens;
SableCC suporta a sintaxe da EBNF (extended-BNF) para as produções;
Exemplo:Productions /* grammar */exp = [‘0’ .. ‘9’]| add;add = ‘(’ [l_exp]exp ‘+’ [r_exp]exp ‘)’;
Gramática (7/7) - ExemploGramática (7/7) - Exemplo/*simpleAdder.sable - A very simple program that
recognizes two integers being added.*/
Package simpleAdder;
Helpers//Our helpers
digit = ['0' .. '9'] ; sp = ' ' ; nl = 10 ;Tokens // Our simple token definition(s) integer = digit+ sp*; plus = '+' sp*;
semi = ';' nl?;Productions // Our super-simple grammar program = [left]:integer plus [right]:integer
semi;
Execução do SableCCExecução do SableCC
Pós-execução do SableCCPós-execução do SableCCQuatro subdiretórios gerados:
◦Lexer (Análise Léxica)◦Parser (Análise Sintática)◦Node (Nós da AST – Abstract Sintax
Tree)◦Analysis (usada pra definir
caminhamentos na AST)
PackagePackage NodeNode (1/3) (1/3)Cada token -> TNomeTokenExemplos:
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
PackagePackage NodeNode (2/3) (2/3)Cada produção ->
PNomeProduçãoCada alternativa ->
ANomeAlternativaExemplos:
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
PackagePackage NodeNode (3/3) (3/3)
class AFactorExpr extends PExpr{ private PFactor factor_;}
class APlusExpr extends PExpr{ private PExpr expr_; private TPlus plus_; private PFactor factor_;}
expr ={factor} factor |{plus} expr plus factor |{minus} expr minus factor;
Execução (1/2)Execução (1/2)Digite uma expressão aritmética: (45 + 36 / 2) * 3 + 5 * 2
Saída : Análise léxica e sintática realizadas com sucesso!!!
Execução (2/2) - ASTExecução (2/2) - AST
Alternative outputAlternative outputGeração de código Java para o
compilador;Para outras alternativas:
◦Utilizando o SableCC: <http://www.mare.ee/indrek/sablecc/>
◦Outras ferramentas: Visite a página da disciplina (link
Ferramentas)
ReferênciasReferênciasSableCC - <http://sablecc.org/>Teoria e implementação de
linguagens computacionais - <www.cin.ufpe.br/~if688>
Indrek’s SableCC page - <http://www.mare.ee/indrek/sablecc>