SableCC José Francisco Pereira Equipe de Monitores Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco – UFPE jfp@cin.ufpe.br
Motivação Geraçã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.
Roteiro Introdução Passos para construir um compilador usando SableCC Arquivo de Especificação SableCC Pós-Execução SableCC Subdiretório Node (AST Nodes) Exemplo
Introdução Framework orientado a objetos para geração de compiladores implementado em JAVA; Possui vasta documentação Muitos exemplos de linguagem (PHP, Java etc) Produzido no meio acadêmico Utiliza uma versão estendida do Visitor
Construção do compilador Criar o arquivo de especificação Definicões léxicas e a gramática Gerar o framework utilizando o SableCC Criar classe para a análise semântica, geração de código, otimizações etc. Criar a “Driver Class”, o compilador propriamente dito Compilar o compilador
Arquivo de Especificação A sintaxe do SableCC é baseada no BNF Membros do arquivo: <Grammar> → [<package declaration>] [<helper declarations>] [<states declarations>] [<token declarations>] [<ignored tokes>] [<productions>] Um arquivo vazio é aceito
Package Basicamente informa os pacotes que serão utilizados no código JAVA gerado do compilador. Ex: br.ufpe.cin.if688.AulaMonitoria O código será gerado no diretório .\br\ufpe\cin\if688\AulaMonitoria
Helper Declarations Funcionam como constantes. Utilizados para auxiliar outras declarações. Helpers letter = [‘a’ .. ‘z’]; digit = [‘0’ .. ‘9’]; id = letter (letter | digit)* // Token Ou id = [‘a’ .. ‘z’] ([‘a’ .. ‘z’] | [‘0’ .. ‘9’])*
Token Declarations Definições dos terminais e “Tokens” para serem utilizados nas produções Tokens id = letter number = digit+; plus = ‘+’;
Exemplo Helpers 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 SableCC 4 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.java TPlus.java TMinus.java TMult.java TDiv.java TMod.java TLPar.java TRPar.java TBlank Extends Token.java
Subdiretório Node (AST Nodes) Para cada: Production = PNomeProducao.java Alternativa da producão = ANomeAlternativa 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
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ências Brainy Creatures Sablecc.org http://www.brainycreatures.org/compiler/sablecc.asp Sablecc.org http://sablecc.org/