240 likes | 353 Views
Aula de SableCC. Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1. Artur Ribeiro de Aquino – ara Allan Jefferson – ajss. Roteiro. Introdução Motivação Procedimentos Gramática Execução do SableCC Pós-execução do SableCC Package node Execução
E N D
Aula de SableCC Teoria e Implementação de Linguagens Computacionais (Compiladores) - IF688 – 2008.1 Artur Ribeiro de Aquino – ara Allan Jefferson – ajss
Roteiro • Introdução • Motivação • Procedimentos • Gramática • Execução do SableCC • Pós-execução do SableCC • Package node • Execução • Alternative output
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) Código fonte Análise Léxica Tokens e lexemas implementação abstração Árvoresintáticaabstrata Análise Sintática Análise Semântica AST decorada CódigoMáquina Geração de Código
Introdução (3/3) • “SableCC is a parsergeneratorwhichgeneratesfullyFeaturedobject-oriented frameworks for buildingcompilers, interpretersandothertextparsers.” 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ção • Geraçã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) • Construção do compilador • Criar arquivo de especificação • Definições léxicas e a gramática • Gerar o framework (rodar o SableCC) • Criar classes para análise semântica, geração de código, otimizações, etc. • Criar a “Driver Class” – “O” compilador • Compilar o compilador
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) - Package • Informa 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) - Helper • Usados como auxiliares para outras declarações (“constantes”) • Mapeiam e identificam os caracteres a serem utilizados • Exemplos: • a = ‘a’ | ‘A’ ; • digit = [‘0’ .. ‘9’] ; • letter = [‘a’..‘z’]; • id = letter (letter|digit)* // Uso no token
Gramática (4/7) - States • Usados 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. States bol, inline Tokens {bol -> inline, inline} char [[0..0xffff] – [10 + 13]]; {bol, inline -> bol} eol = 10 | 13 | 10 13;
Gramática (5/7) - Tokens • Definições dos terminais para uso nas produções - significado • Palavras reservadas, identificadores, comentários, “ignored tokens”, ... • Exemplos: • number = digit+ ; • plus = ‘+’ ; • id = letter (letter | digit)* ;
Gramática (6/7) - Productions • Regras 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) - Exemplo /*simpleAdder.sable - A verysimpleprogramthatrecognizestwointegersbeingadded.*/ Package simpleAdder; Helpers //Ourhelpers digit = ['0' .. '9'] ; sp = ' ' ; nl = 10 ; Tokens // Oursimpletokendefinition(s) integer = digit+ sp*; plus = '+' sp*; semi = ';' nl?; Productions // Oursuper-simplegrammar program = [left]:integerplus [right]:integer semi;
Pós-execução do SableCC • Quatro 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)
PackageNode(1/3) • Cada token -> TNomeToken • Exemplos: Classes Geradas TNumber.java TPlus.java TMinus.java TMult.java TDiv.java TMod.java TLPar.java TRPar.java TBlank Extends Token.java Tokens number = ['0' .. '9']+; plus = '+'; minus = '-'; mult = '*'; div = '/'; mod = '%'; l_par = '('; r_par = ')'; blank = (' ' | 13 | 10)+;
PackageNode(2/3) • Cada produção -> PNomeProdução • Cada alternativa -> ANomeAlternativa • Exemplos: 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; Classes Geradas PExp.java AFactorExp.java APlusExp.java .... Extends PExp.java PFactor.java ATermFactor.java .... Extends PFactor.java PTerm.java ANumberTerm.java ... Extends PTerm.java
PackageNode(3/3) expr = {factor} factor | {plus} expr plus factor | {minus} expr minus factor; class APlusExpr extends PExpr { private PExpr expr_; private TPlus plus_; private PFactor factor_; } class AFactorExpr extends PExpr { private PFactor factor_; }
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!!!
Alternative output • Geraçã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ências • SableCC - <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>