Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
9 – Compiladores I
Prof. Msc. Carlos de Salles
1 - EMENTA
O Processo de Compilação. Deteção e Recuperação de Erros.
Introdução à geração de Código Intermediário. Geração de
Código de Máquina. Otimização. Uma visão sobre alguns
compiladores. A construção de um compilador.
2 - O PROCESSO DE COMPILAÇÃO
2.1 - Introdução
2.2 - Aspectos do Processo de Compilação
3 - DEFINIÇÃO DE LINGUAGEM
3.1 - Introdução
3.2 - Sintaxe e Semântica
3.3 - Gramáticas - Definição Formal de Linguagem de
Programação
3.4 - O Problema da Análise
4 - ANÁLISE LÉXICA
4.1 - Introdução
4.2 - Construção Manual de Analisadores
4.3 - Construção Sistemática de Analisadores
4.4 - Saídas do Analisador Léxico
4.5 - Implementação
4.6 - Erros
Slide 1 Compiladores I
CP 5017.9 – Compiladores I
Prof. Msc. Carlos de Salles
Ementa (continuação)
6 - ANÁLISE SINTÁTICA DESCENDENTES
6.1 - Formalização
6.2 - Análise com Recuperação
6.3 - Análise sem Recuperação
6.3.1 - Analisadores Recursivos
6.3.2 - Analisadores Preditivos
7 - ANÁLISE SNTÁTICA ASCENDENTE
7.1 - Formalização
7.2 - Analisadores de Precedência
8 - TRADUÇÃO DIRIGIDA POR SINTAXE
8.1 - Esquemas da Tradução Dirigida por Sintaxe
8.2 - Implementação de Tradutores Dirigidos por Sintaxe
9 - TABELA DE SÍMBOLOS
9.1 - Os Conteúdos da Tabela de Símbolo
9.2 – Organizações de Tabelas de Símbolos
10 - ORGANIZAÇÃO DE MEMÓRIA
11 - CONSTRUÇÃO AUTOMÁTICA DE
ANALISADORES EFICIENTES
Bibliografia
• GRUNE, DICK et al. Projeto Moderno de Compiladores.
Editora Campus.
• AHO, Alfred; SETHI, Ravi; ULLMAN, Jeffrey D. Compiladores
– Princípios, Técnicas e Ferramentas. Editora Guanabara.
Editora LTC.
Slide 2 Compiladores I
Paradigma análise/síntese
Slide 3 Compiladores I
Interface de vanguarda do compilador
• Análise léxica
– Converte uma seqüência de caracteres no(s)
arquivo(s) de entrada com o código fonte em uma
seqüência de tokens equivalente;
– Cada token representa um elemento atômico da
linguagem;
• Análise sintática
– Transforma a seqüência de tokens em uma árvore
sintática que representa o código fonte;
– É dividido em dois grupos de métodos: os top-down
e os bottom-up;
• Tratamento de contexto
– Avalia erros de tipagem e nos identificadores;
– Baseia-se em informações coletadas numa
estrutura chamada tabela de símbolos.
Slide 4 Compiladores I
Geração de código X Interpretação
• Geração de código
– Transforma a representação semântica intermediária em
código executável em uma linguagem alvo;
– Características:
• Processamento considerável;
• A forma intermediária resultante, que é de código binário
específico da máquina, é de baixo-nível;
• O mecanismo de interpretação é o próprio hardware da
CPU;
• A execução do programa é relativamente rápida;
• Interpretação
– Ao invés de traduzir para uma linguagem alvo, realiza as
ações semânticas diretamente;
– Vantagens:
• Geralmente um interpretador é escrito em uma linguagem de
mais alto nível, portanto irá rodar em várias máquinas
diferentes. Um gerador de código é voltado para uma
máquina específica;
• Escrever um interpretador exige esforço bem menor;
• Executar as ações diretamente da representação semântica
permite tanto uma melhor verificação quanto informação de
erros;
• Melhor segurança (explorado por Java)
– Características:
• O processamento do programa é de mínimo a moderado;
• A forma intermediária resultante, alguma estrutura de dados
específica de sistema, de médio a alto nível;
• O mecanismo de interpretação é um programa;
• A execução do programa é relativamente lenta.
Slide 5 Compiladores I
Por que estudar Compiladores?
Slide 6 Compiladores I
Por que estudar Compiladores?
Slide 7 Compiladores I
Propriedades de um bom compilador
Slide 8 Compiladores I
Histórico de compiladores
Slide 9 Compiladores I
Análise Léxica
Slide 10 Compiladores I
Implementação de um Analisador Léxico
Slide 11 Compiladores I
Interface de Programação (API) Léxica
Arquivos fonte Tokens
Análise Léxica
• Funções públicas
– void startLex(string fileName);
• Abre o arquivo fonte de entrada fileName
e o copia por inteiro para a memória
• Caso o compilador manipule múltiplos
arquivos, utiliza uma pilha para armazenar
a posição em que estava manipulando o
arquivo atual e abre o novo arquivo
– Token nextToken();
• Avalia o arquivo fonte atual, caractere por
caractere, e retorna o próximo token
• Implementação de autômatos
• Algumas funções privadas úteis
– char nextChar();
• Retorna o próximo caractere do arquivo
atual, contando as linhas e colunas;
– void skipLayoutAndComment();
• Percorre o fonte ignorando comentários
até encontrar um caractere que não seja
espaço, tabulação ou pulo de linha
Slide 12 Compiladores I
Expressões Regulares (ER)
Operadores de repetição:
R? Um R ou nada (opcionalmente R)
R* Zero ou mais ocorrências de R
R+ Uma ou mais ocorrências de R
Operadores de composição:
R1R2 Um R1 seguido de um R2
R1|R2 Ou R1, ou R2
Agrupamento:
(R) R por si só
Exemplos:
inteiro := [0..9]+
real := [0-9]*{.}[0-9]+
identificador := [a-zA-Z][a-zA-Z0-9_]*
Slide 13 Compiladores I
Autômatos expressando ER's
0-9
• Número inteiro – [0-9]+
0-9
1 2
0-9 0-9
1 2 . 3 4
.
• Identificador – [a-zA-Z][a-zA-Z0-9_]*
a-zA-Z0-9_
a-zA-Z
1 2
Slide 14 Compiladores I
Análise Sintática
Tokens Árvore Sintática
Análise Sintática
Slide 15 Compiladores I
Árvore sintática – expressão b*b-4*a*c
Árvore Abstrata
Anotada
Slide 16 Compiladores I
Parser Recursivo Descendente
Slide 17 Compiladores I
Parser Recursivo Descendente
bool entrada() {
return expressao() && tk(EOF);
}
bool expressao() {
return termo() && resto_expressao();
}
bool termo() {
return tk(IDENT) || parenteses_exp();
}
bool parenteses_exp() {
return tk('(') && expressao() &&
tk(')');
}
bool resto_expressao() {
return (operador() && expressao() )
|| true;
}
bool operador() {
return tk('+') || tk('-') || tk('*')
|| tk('/');
}
bool tk(Token tt) {
if(tokenAtual!=tt) return false;
getNextToken(); return true;
}Slide 18 Compiladores I
Conjunto FIRST de uma gramática
Data definitions:
1. Token sets called FIRST sets for all terminals, non-terminals and
alternatives of non-terminals in G.
2. A token set called FIRST for each alternative tail in G; an
alternative tail is a sequence of zero or more grammar symbols α if
A α is an alternative or alternative tail in G.
Initializations:
1. For all terminals T, set FIRST(T) to {T}.
2. For all non-terminals N, set FIRST(N) to the empty set.
3. For all non-empty alternatives and alternative tails α, set
FIRST(α) to the empty set.
4. Set the FIRST set of all empty alternatives and alternative tails
to {ε}.
Inference rules:
1. For each rule N→α in G, FIRST(N) must contain all tokens in
FIRST(α), including ε if FIRST(α) contains it.
2. For each alternative or alternative tail α of the form Aβ,
FIRST(α) must contain all tokens in FIRST(A), excluding ε, should
FIRST(A) contain it.
3. For each alternative or alternative tail α of the form Aβ and
FIRST(A) contains ε, FIRST(α) must contain all tokens in
FIRST(β), including ε if FIRST(β) contains it.
• entrada { IDENT ’(’ }
• expressao { IDENT ’(’ }
• termo { IDENT ’(’ }
• parenteses_exp { ’(’ }
• resto_expressao { ’+’ ε }
Slide 19 Compiladores I