Projeto de Linguagem de Programação
Aula 1: Apresentação da Disciplina
Prof Joaquim Pessôa Filho
O que são Compiladores e Interpretadores?
Quais as linguagens que nós conhecemos hoje?
Qual a melhor linguagem atualmente?
Qual a linguagem mais utilizada? Por quê?
Qual a diferença entre interpretadores e compiladores?
E Java?
O que esperar da disciplina?
Objetivos
Apresentar os conceitos e algoritmos fundamentais para construção de
compiladores de linguagens.
Criar analisadores léxico e sintático
Utilizar ferramentas automáticas para
geração de analisadores.
Ementa do Curso
Fundamentos do processo de compilação
Análise léxica
Fundamentos
Prática
Análise sintática
Fundamentos
Prática
Estratégia de Ensino
Aulas teóricas expositivas, exercícios individuais e em grupo.
Aulas de laboratório utilizando geradores de
analisadores léxicos/sintáticos e linguagem Java para programação de analisadores semânticos e geradores de código.
Utilização do ambiente Blackboard
Notas de aulas
Listas de exercícios
Conteúdo Programático
1. Fundamentos do processo de compilação
1. Noções elementares de linguagens formais
2. Compilação x interpretação
3. Módulos e interfaces de um compilador
4. Ferramentas de geração automática de analisadores 2. Análise léxica
1. Tokens léxicos
2. Expressões regulares
3. Autômatos finitos
4. Geradores de analisadores léxicos 3. Análise sintática
1. Gramáticas livres de contexto
2. Análise preditiva
3. Análises LL e LR
4. Geradores de analisadores sintáticos
Conteúdo Programático
4. Análise semântica
1. Tabelas de símbolos
2. Verificação de tipos 5. Registros de Ativação
1. Organização de memória em tempo de execução: segmento de código, segmento de dados, pilhas e heaps.
2. Registro de ativação
6. Geração de código intermediário
1. Máquinas virtuais
2. Árvores de representação intermediárias
3. Geração de árvores de representação intermediárias
4. Árvores canônicas
Avaliação
2 Avaliações Parciais - 3.0 (1,5 cada)
Atividades em Sala/Laboratório - 1.0
Atividades online - 1.0
Prova Regimental - 5.0
Bibliografia
Livro(s) texto(s):
AHO, A. V. Compiladores: Principios, Tecnicas e Ferramentas. 2. ed. São Paulo: Pearson, 2008.
LOUDEN, K. C. Compiladores: Principios e Praticas. São Paulo:
Bookman, 2004.
Livros de referência:
APPEL, A.W. Modern Compiler Implementation in Java, 2a. Edição, Cambridge: Cambridge University Press, 2002.
COOPER, K. D.; TORCZON, L. Engineering a Compiler. New York: Morgan Kaufmann Publishers,inc, 2004.
MAK, R. Writing Compilers And Interpreters: An Applied Approach Using C++. 2. ed. New York: John Wiley Consumer, 1996.
SRIKANT, Y. N.; SHANKER, P. The Compiler Design Handbook:
Optimizations & Machine Code Generation. New York: Crc Press, 2003.
WATT, D. A. Programming Language Processors In Java. New York:
Prentice Hall, 2000.
Tradutor
É um programa que traduz o programa fonte para o programa objeto.
Tradutor
Programa Fonte
Programa
Objeto
Compilador
É o tradutor de um programa em linguagem de alto nível para um programa em linguagem de baixo nível (assembly).
Compilador
PF em linguagem de alto nível
PO em
linguagem de baixo nível
Interpretador
Interpreta diretamente as instruções do programa fonte.
Interpretador
Programa
Fonte Resultados
Montador
Montador
PF em
linguagem de baixo nível
PO em
linguagem de Máquina
Pré-processador
Pré-processador
PF em
linguagem de alto nível
PO em linguagem de
alto nível
Compilador x Interpretador
As Fases de Análise
As Fases de Análise
Análise Léxica Análise Sintática Análise Semântica
Geração de código intermediário Otimização de código
Geração de código Síntese
Análise
Programa Fonte
Programa Executável
Compilador Atual
Analisador Léxico
Objetivos:
Ler o programa fonte
Encontrar os tokens:
Identificadores
Constantes
Palavras reservadas
Símbolos especiais
Ignorar elementos como: Espaços, comentários e caracteres de controle
Detectar erros léxicos: Símbolos inválidos, tamanho inválido de constantes, literais e identificadores.
Exemplo
Program exemplo;
var X, Y: Integer;
begin
! Início do programa read (A);
...
Program é uma palavra reservada
exemplo é um identificador
; é um símbolo especial var é uma palavra
reservada ...
Analisador Sintático
Agrupa os tokens em estruturas sintáticas
expressões
declarações
comandos
chamadas
...
Detecta problemas sintáticos
ordem dos tokens
ausência ou excesso de elementos
...
Sintaxe
Gramáticas são escritas geralmente na notação BNF (Backus-Naur Form). Em BNF, uma regra é escrita na forma N ::= α, onde N é um símbolo não terminal e α é uma cadeia de símbolos terminais e/ou não terminais.
Exemplo de um programa escrito na linguagem Mini-Triangle
! This is a comment.
let
const m ~ 7;
var n: Integer;
in
begin
n := 2 * m * m;
putint(n);
end
Exemplo de um programa escrito na linguagem Mini-Triangle
Quais são os símbolos terminais da linguagem?
Quais os símbolos não terminais?
E as regras de produção?
Exemplo de um programa escrito na linguagem Mini-Triangle
Símbolos terminais:
begin const do else end if
in let then var while
; : := ~ ( )
+ - * / < > = \
Exemplo de um programa escrito na linguagem Mini-Triangle
Símbolos não-terminais:
Program (Símbolo inicial)
Comando Comando-simples
Expressão Expressão-primária
V-nome
Declaração Declaração-simples Tipo
Operador Identificador
Inteiro-Literal
Exemplo de um programa escrito na linguagem Mini-Triangle
Regras de Produção:
Programa ::= Comando
Comando ::= Comando-simples
| Comando ; Comando-simples
Exemplo de um programa escrito na linguagem Mini-Triangle
Comando-simples ::=
V-nome := Expressão
| Identificador ( Expressão )
| if Expressão then Comando-simples | else Comando-simples
| while Expressão do Comando-simples | let Declaração in Comando-simples
| begin Comando end
Exemplo de um programa escrito na linguagem Mini-Triangle
Expressão ::= Expressão-primária
| Expressão Operador Expressão-primária Expressão-Primária ::= Inteiro-Literal
| V-nome
| Operador Expressão-primária
| (Expressão)
Exemplo de um programa escrito na linguagem Mini-Triangle
V-nome ::= Identificador
Declaração ::= Declaração-simples
| Declaração ; Declaração-simples Declaração-simples ::=
const Identificador ~ Expressão
| var Identificador : Tipo
Exemplo de um programa escrito na linguagem Mini-Triangle
Tipo ::= Identificador
Operador ::= + | - | * | / | < | > | = | \
Identificador ::= Letra | Identificador Letra | Identificador Dígito
Inteiro-Literal ::= Dígito
| Inteiro-Literal Dígito
Comentário ::= ! Símbolo* eol
Exemplo de um programa escrito na linguagem Mini-Triangle
Como seriam as regras para:
Dígito Letra
Símbolo
Dígito ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Letra ::= a | b | c | ... | z | A | B | C | ... | Z
Símbolo ::= Letra | “ ” | Caracter-especial
Exercícios
Escreva a gramática para a seguinte linguagem:
1. L(G)={w | w ∈ {00,11}* e w=(0011)n, n≥0}
Escreva uma gramática para cada uma das linguagens abaixo:
1. L(G1)={w|w ∈ {a,b,c}* e w=abnc, n≥0}
2. L(G2)={w|w ∈ {0,1}* e w=0m1n,m≥n e ≥1}