190 likes | 285 Views
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.
E N D
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
HelperDeclarations • 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’])*
TokenDeclarations • 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)
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!!!
Referências • Brainy Creatures • http://www.brainycreatures.org/compiler/sablecc.asp • Sablecc.org • http://sablecc.org/