Planeamento

Aulas Teóricas

Apresentação

Objectivos

Gramáticas

Compiladores

Ambientes de desenvolvimento

Funcionamento da disciplina: Avaliação, Projecto, Corpo docente, Horários, Bibliografia

Introdução

Processo de compilação: Análise lexical, Análise sintáctica, Análise semântica, Interpretação, Geração de código, Optimização de código.

Tratamento e recuperação de erros.

Compiladores de compiladores.

Ferramentas de desenvolvimento

Controlo de versões. Controlo de configurações. Compilador de C. Depuração de código. Ficheiros objecto e executáveis. Bibliotecas.

Linguagens Regulares

Linguagens regulares.

Expressão regular. Operadores de expressões regulares. Extensões.

Diagramas de transição. Autómato finito não determinista (AFND). Algoritmo de Thompson. Autómato finito determinista (AFD).

Construção de um AFD a partir de um AFND. Minimizar os estados de um AFD.

Analisador lexical.

Tempo de computação e ocupação de memória.

Análise Lexical

Analisador lexical. Tarefas do analisador lexical.

Lex: formato do ficheiro lex; expressões regulares; tratamento de expressões regulares; funções; variágeis globais; macros predefinidas; acesso a funções de entrada/saída; substituições; ligação ao yacc; extensões do Flex.

Eficiência de processamento.

Gramática livre de contexto

Definição e compilação de uma linguagem.

Gramática como descrição sintáctica.

Notação BNF.

Gramática livre de contexto.

Gramática dependente de contexto.

Derivações.

Árvores sintácticas.

Recursividade e ambiguidade.

Prioridade e associatividade.

Análise sintáctiva descendente

Conjuntos FIRST, FOLLOW, LOOKAHEAD.

Gramáticas LL(1).

Eliminação de produções não atingíveis. Factorização à esquerda. Substituição de singularidades. Substituição de cantos à esquerda. Eliminação de recursividade à esquerda.

Autómatos de pilha. Construção da tabela de análise. Análise preditiva por tabela.

Gramáticas atributivas

Gramáticas atributivas. Avaliação dirigida pela sintaxe. Grafos de dependências. Eliminação de atributos herdados. Esquemas de avaliação de atributos. Atributos na eliminação da recusividade à esquerda.

Yacc

Yacc:

Formato do ficheiro. Elementos lexicais. Prioridade e associatividade. Acções semânticas. Ambiente do analisador. Tratamento de erros. Depuração gramatical. Conflitos na gramática LALR(1).

Análise ascendente

Acções de um analisador ascendente: exemplo.

Autómato não determinista LR(0), SLR(1) e LALR(1).

Transporte dos LOOKAHEAD no fecho-e do LALR(1).

Tabela LR(0), SLR(1) e LARL(1).

Utilização determinista de gramáticas ambíguas.

Compactação de tabelas LR.

Compactação por propagação de reduções.

Analisadores ascendentes LR.

Semântica

Semântica estática:

Árvore sintáctiva abstracta; constução da árvore sintáctiva abstracta; utilização de árvore sintáctica abstracta; manipulação de nomes; registo de alcance e tabela de símbolos.

Análise Semântica:

Tipos de dados; verificações estáticas; árvores e registos de activação; reserva de memória.

Síntese

Síntese.

Interpretação: linha a linha; dirigida pela sintaxe; dirigida pela árvore sintáctica; por máquina virtual e threading.

Geração de código

Notação postfixada: Postfix.

Postfix: Processador imaginário SL0; Tradução dirigida pela sintaxe; Tradução dirigida por árvore sintáctica.

Directivas de assembler.

Questões práticas.

Guia de geração de código: labels; qualificadores; variáveis; expressões; instruções condicionais; ciclos; funções e procedimentos.

Optimização

Optimização.

Níveis de optimização: optimização pelo utilizador; independente da máquina; dependente da máquina.

Optimização

Optimização.

Níveis de optimização: optimização pelo utilizador; independente da máquina; dependente da máquina.

Geração de código final

Geração de código.

Arquitecturas de computadores: Load-store machines; accumulator machines; stack machines; memory machines.

Exemplo.

Register spilling.

Modos de endereçamento.

Custo das instruções.

Blocos básicos.