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.