Compiladores - Programa
- Introdução:
Avaliação: um grande trabalho
(implementação de um compilador simples para uma linguagem simples)
feito em partes,
com notas para as várias partes.
Material, bibliografia.
Conceitos básicos -
compilação versus interpretação;
fases de um compilador típico;
"front end" e "back end";
representação intermediária (IR).
- Análise Léxica.
Estrutura léxica "convencional";
o conceito de token;
conteúdo sintático e conteúdo semântico;
estruturas léxicas não convencionais;
- Especificação da estrutura léxica: expressões regulares;
conceitos e notação básica para expressões regulares;
exemplos (identificadores, comentários, constantes numéricas, etc.);
- A ferramenta Lex.
- Introdução a Análise Sintática.
Gramáticas Livres de Contexto; BNF;
árvores de derivação;
- Ambiguidade e não-determinísmo em gramáticas.
- Construindo a árvore de derivação: o método LL.
- Construindo a árvore de derivação: o método LR.
- A ferramenta Yacc.
- Construindo analisadores léxicos e sintáticos a mão;
o método descendente-recursivo;
expressões aritméticas.
- Ações semânticas; Árvores de Sintaxe Abstrata.
- Tabelas de Símbolos e ASTs costuradas.
- Tipagem. Tipagem bottom-up; overloading e inferência de tipos.
- Código Intermediário: expressões simples
- Código Intermediário: estruturas de controle (if, while, switch)
- Código Intermediário: expressões complexas (curto-circuito,
chamadas de funções)
- Blocos básicos e o formato SSA
- A linguagem intermediária do LLVM
- Código LLVM para variáveis e expressões inteiras
- Código LLVM para expressões float, casts e curto-circuito
- Código LLVM para estruturas de controle básicas e atribuição
- Uma introdução à otimização de código