Planeamento
Aulas Teóricas
Aula T01: Apresentação
Apresentação da disciplina, do programa e do método de avaliação. Apresentação da estrutura geral de um compilador. Apresentação de pequenos exemplos sobre o processamento de linguagens e esclarecimento de dúvidas.
Aula T02: Tópicos de Programação Básica
Revisões sobre tópicos de programação: módulos, compilação separada, divisão de responsabilidades, bibliotecas, programas. Estrutura e formatos dos módulos de um programa. Coexistência de código proveniente de linguagens diferentes no mesmo programa. Ferramentas de desenvolvimento e análise (compilador e inspectores, e.g., nm, ldd, etc.). Revisões.
Aula T03: Apresentação do projecto
Apresentação do projecto: enunciado, material de apoio, aspectos técnicos (linguagem de trabalho, programação a desenvolver) para o desenvolvimento de cada entrega. Exemplo prático de desenvolvimento. Esclarecimento de dúvidas.
Aula T04: Programação OO
Continuação das revisões sobre tópicos de programação OO, com aplicação a C++: polimorfismo, herança, declarações e modificadores (const), referências e ponteiros. Exemplos de aspectos problemáticos na gestão de dependências (divisão em .h e .cpp).
Aula T05: Análise Lexical
Introdução à análise lexical: reconhecimento de elementos da linguagem, definição de alfabeto e sua caracterização. Expressões regulares (primitivas) e autómatos para reconhecimento/aceitação. Algoritmo de Thompson para construção de autómatos finitos não-deterministas (NFA). Autómatos finitos deterministas (DFA). Processo de determinização e compactação de autómatos.
Aula T06: Análise Lexical
Analisadores lexicais: reconhecimento de múltiplos tokens. Emissão de tokens e retrocesso. Exemplo de processamento de entradas.
Aula T07: Análise Lexical
Analise lexical: ferramenta Flex. Introdução ao uso da ferramenta Flex. Tokens e lexemas: ligação à ferramenta yacc. Especificação do ficheiro de entrada: definições e regras. Exemplos simples. Ferramentas no contexto do projecto. Esclarecimento de dúvidas sobre o projecto.
Aula T08: Análise Lexical
Analise lexical: ferramenta Flex. Start conditions. Exemplos. Discussão.
Aula T09: Introdução à Análise Sintáctica
Noção de gramática: terminais, não-terminais, produções. Gramáticas livres de contexto e dependentes de contexto. Notação BNF. Precedência, associatividade e ambiguidade. Parsers e gramáticas. Conjuntos FIRST e FOLLOW. Exemplos intuitivos.
Aula T10: Análise Sintáctica Descendente
Definição de LOOKAHEAD. Análise sintáctica descendente. Analisadores preditivos LL(1). Processo de construção do analisador: remoção de recursividade à esquerda e recursividade mútua, cantos, factorização da gramática. O processo de análise. Erros de análise. Conjunto de sincronização. Exemplo completo.
Aula T11: Gramáticas Atributivas
Gramáticas atributivas. Avaliação dirigida pela sintaxe. Atributos herdados e atributos sintetizados. Gramáticas de tipo L e de tipo S. Acções semânticas. Grafos de dependências. Exemplo (semáforo).
Aula T12: Gramáticas Atributivas
Gramáticas atributivas (continuação da aula anterior). Avaliação de atributos. Árvores semânticas. Exemplos. Atributos em especificações YACC.
Aula T13: YACC
Ferramenta YACC: estrutura de uma especificação YACC. Símbolos terminais (tokens) e não-terminais. Atributos associados a símbolos. Tipificação de atributos. Acções semânticas. Aplicação ao projecto.
Aula T14: YACC
Resolução de ambiguidades (conflitos). Atributos de símbolos e a definição YACC. Estruturas internas. Exemplo de aplicação e problemas ilustrativos (erros lexicais, erros sintácticos, conflitos, problemas na semântica). Exemplo de aplicação.
Aula T15: Análise Sintáctica Ascendente
Introdução à análise ascendente. Acções (shift/reduce) e transições (goto). Processo de análise. Contraste com análise descendente. Items LR(0) e o processo de análise. Conflitos shift/reduce e reduce/reduce. Analisadores LR(0) e SLR(1). Construção da tabela de análise. Exemplo simples.
Aula T16: Análise Sintáctica Ascendente SLR(1)
Análise ascendente (continuação): analisadores LR(0) e SLR(1). Contraste entre analisadores. Compactação da tabela de análise (reduções unitárias e não unitárias). Exemplo completo.
Aula T17: Análise Sintáctica Ascendente LALR(1)
Items LR(1) e antevisão (lookahead). Construção da tabela de análise LALR(1). Discussão das capacidades relativas de análise dos analisadores ascendentes (LR(0), SLR(1), LALR(1), LR(1)). Exemplo de processamento.
Aula T18: Análise Sintáctica Ascendente LALR(1)
Continuação da aula sobre LALR(1). Contraste com LR(0), SLR(1). Compactação da tabela de análise (reduções unitárias e não unitárias). Exemplo de processamento. Apoio ao projecto.
Aula T19: Semântica
Introdução à análise semântica. Árvores abstractas. Tipos, variáveis, funções. Natureza das variáveis. Logevidade, visibilidade e acessibilidade de variáveis. Tabela de símbolos e processamento de variáveis e funções. Problemas de endereçamento.
Aula T20: Semântica
Processamento da árvore abstracta: nós e classes de visita (visitors). Verificação de tipos. Organização do processamento. Tabela de símbolos e processamento de variáveis. Exemplo de validação de tipos no compilador exemplo Compact: uso de visitors e desacoplamento da verificação de tipos relativamente à geração de código.
Aula T21: Interpretação e Geração de Código
Interpretação e geração de código. Processos de interpretação de código: dirigidos pela sintaxe, dirigidos pela árvore sintáctica. Geração de código / tradução: dirigida pela sintaxe e dirigida pela árvore sintáctica. Máquina SL0 (single- large-stack 0-operand machine). Introdução à geração de código.
Aula T22: Geração de Código
Notação pós-fixada e linguagem Postfix. Geração de código Posfix: endereçamento, variáveis, expressões, definição e chamada de funções. Exemplos.
Aula T23: Geração de Código
Continuação da aula anterior: geração de código para funções. Variáveis locais. Relação com a tabela de símbolos. Uso de endereçamento indirecto. Exemplo de função com vectores. Discussão da aplicabilidade no projecto.
Aula T24: Geração de Código
Continuação da aula anterior: geração de código para funções. Pormenores de geração de expressões e left-values. Gestão da geração de código pelo visitor. Exemplo.
Aula T25: Optimização
Níveis de optimização. Optimização pelo utilizador. Optimização independente da máquina e dependente da máquina (endereçamento, registos, instruções). Blocos básicos. Discussão de exemplo prático de optimização. Problemas associados à optimização. Esclarecimento de dúvidas sobre o projecto.
Aula T26: Revisões; Acompanhamento do Projecto
Revisões sobre análise semântica e geração de código. Esclarecimento de dúvidas sobre o projecto.
Aula T27: Avaliação do Projecto
Avaliação do projecto. Realização do teste prático. Feedback sobre a entrega final do projecto.
Aula T28: Avaliação do Projecto
Avaliação do projecto. Feedback sobre a avaliação da entrega final do projecto.