Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 –...

24
Aula de SableCC Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss

Transcript of Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 –...

Page 1: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

Aula de SableCCAula de SableCCTeoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1

Artur Ribeiro de Aquino – araAllan Jefferson – ajss

Page 2: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

RoteiroRoteiroIntroduçãoMotivaçãoProcedimentosGramáticaExecução do SableCCPós-execução do SableCCPackage nodeExecuçãoAlternative output

Page 3: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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.

Page 4: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 5: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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.

Page 6: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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.

Page 7: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 8: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

Procedimentos (2/2)Procedimentos (2/2)

Page 9: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 10: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 11: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 12: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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;

Page 13: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 14: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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 ‘)’;

Page 15: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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;

Page 16: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

Execução do SableCCExecução do SableCC

Page 17: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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)

Page 18: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 19: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 20: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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;

Page 21: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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

Page 22: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

Execução (2/2) - ASTExecução (2/2) - AST

Page 23: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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)

Page 24: Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss.

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>