1 / 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. Roteiro. Introdução Motivação Procedimentos Gramática Execução do SableCC Pós-execução do SableCC Package node Execução

monty
Download Presentation

Aula de SableCC

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Roteiro • Introdução • Motivação • Procedimentos • Gramática • Execução do SableCC • Pós-execução do SableCC • Package node • Execução • Alternative output

  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.

  4. 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

  5. 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.

  6. 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.

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

  8. Procedimentos (2/2)

  9. 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

  10. 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

  11. 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

  12. 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;

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

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

  15. 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;

  16. Execução do SableCC

  17. 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)

  18. 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)+;

  19. 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

  20. 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_; }

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

  22. Execução (2/2) - AST

  23. 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)

  24. 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>

More Related