Projeto de Compiladores. FIR Faculdade Integrada do Recife João Ferreira joaoferreira@fir.br 5 e 6 de março de 2007



Documentos relacionados
Compiladores. Análise léxica. Plano da aula. Vocabulário básico. Motivação para análise léxica. Estrutura de um compilador

Geração de código intermediário. Novembro 2006

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

Sintaxe e Semântica. Fases da Compilação. programa fonte

Programa fonte token padrões lexema Tokens

Como construir um compilador utilizando ferramentas Java

Implementação de um analisador léxico: a primeira etapa na construção do compilador Marvel

Introdução à Lógica de Programação

Compiladores Aula 1. Celso Olivete Júnior.

INE5317 Linguagens Formais e Compiladores. AULA 2: Es trutura geral dos Compiladores

COMPILADORES E INTERPRETADORES

1.1. Organização de um Sistema Computacional

Processamento da Informação Teoria. Algoritmos e Tipos de dados

Autómatos Finitos Determinísticos

Compiladores Aula 5. Celso Olivete Júnior.

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

Implementando uma Classe e Criando Objetos a partir dela

Teoria da Computação Linguagens e Expressões Regulares, Autómatos de Estados Finitos

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos?

Resolução de problemas e desenvolvimento de algoritmos

Autômatos a pilha. UFRN/DIMAp/DIM0330 Linguagens formais. David Déharbe. david/enseignement/2003.

Orientação a Objetos

MC102 Algoritmos e Programação de Computadores 2ª Aula Programa, entrada e saída de dados

e à Linguagem de Programação Python

COMPILADORES. Análise léxica. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

O que queremos. Processamento Estatístico da Linguagem Natural. Parsing Morfológico. Regras Simples. Adicionando palavras. Regras Derivacionais

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Aluísio Eustáquio da Silva

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

Java. Marcio de Carvalho Victorino

Algoritmos e Programação de Computadores

Software Básico. Conceito de Linguagem de Máquina e Montagem: introdução ao Assembly. Prof. MSc. Hugo Vieira L. Souza

Pratica JFlex. Prática criando o primeiro analisador léxico

CAPÍTULO 6 CIRCUITOS SEQUENCIAIS IV: PROJETO DE REDES SEQUENCIAIS

Síntese. Compiladores. Geração de código intermediário. Linguagens Intermediárias. Modelo Clássico. Linguagens Intermediárias. Código intermediário

6.3 Equivalência entre Autômatos com Pilha Não-Determinísticos e Gramáticas Livre do Contexto

Introdução aos cálculos de datas

Compiladores. ICC1 e ICC2 Arquivos, ponteiros, alocação dinamica, modularização, recursividade, matrizes LM MOV, MUL, DIV, CMP,...

Programação de Computadores III

1 O que são e para que servem?

CONVENÇÃO DE CÓDIGO JAVA

Um compilador é um programa que lê um programa escrito numa dada linguagem, a linguagem objecto (fonte), e a traduz num programa equivalente

Algoritmos e Estruturas de Dados I 01/2013. Arquivos. Pedro O.S. Vaz de Melo

Analisadores Ascendentes ou Empilha-Reduz. Mais um exemplo... Mais um exemplo... Top-Down x Bottom Up. Conteúdo da aula. Analisadores Ascendentes

MC102 Algoritmos e Programação de Computadores 1ª Aula Introdução à Programação de Computadores

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

20 Caracteres - Tipo char

LINGUAGEM C UMA INTRODUÇÃO

2 Orientação a objetos na prática

Linguagens Formais e Compilação Ficha de exercícios

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

DEFINIÇÃO DE MÉTODOS

Algoritmo. Linguagem natural: o Ambígua o Imprecisa o Incompleta. Pseudocódigo: o Portugol (livro texto) o Visualg (linguagem) Fluxograma

Portas Lógicas Básicas Prof. Rômulo Calado Pantaleão Camara. Carga Horária: 2h/60h

Linguagem e Técnicas de Programação I Programação estruturada e fundamentos da linguagem C

Arquitetura de Rede de Computadores

9 Comandos condicionais

Universidade de São Paulo São Carlos, SP Instituto de Ciências Matemáticas e de Computação. SSC0206 1/2010 Introdução à Compilação

Conceitos básicos da linguagem C

Avaliação de Expressões

3 Parsing Expression Grammars

Compiladores - Análise Preditiva

NetBeans. Conhecendo um pouco da IDE

Sistemas de numeração

Componentes do Computador e. aula 3. Profa. Débora Matos

O Processo de Programação

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

Introdução à Programação

Geração e Otimização de Código

ALGORITMOS E FLUXOGRAMAS

Universidade Estadual de Santa Cruz. Departamento de Ciências Exatas e Tecnológicas. Especialização em Matemática. Disciplina: Estruturas Algébricas

JSP - ORIENTADO A OBJETOS

Métodos de Pesquisa em Memória Primária

PROGRAMAÇÃO DE COMPUTADORES (Teoria)

BCC242. Alfabeto, Strings, Linguagens. Registro aqui o agradecimento à Profa. Lucília por ceder slides que fazem parte deste material.

ARQUITETURA DE COMPUTADORES. Rogério Spindula Rosa

4 RECURSOS AUTOMATIZADOS DO EXCEL

SISTEMAS DIGITAIS Prof. Ricardo Rodrigues Barcelar

13 Números Reais - Tipo float

Algoritmo. Prof. Anderson Almeida Ferreira. Agradeço ao prof. Guilherme Tavares de Assis por fornecer slides que fazem parte desta apresentação

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Algoritmos não se aprendem: Copiando algoritmos Estudando algoritmos Algoritmos só se aprendem: Construindo algoritmos Testando algoritmos

A Linguagem Algorítmica Estrutura de Repetição. Ex. 2

Introdução aos critérios de consulta. Um critério é semelhante a uma fórmula é uma cadeia de caracteres que pode consistir em

Desenvolvendo Websites com PHP

Roteiro do Programa e Entrada/Saída

Curso de Programação Computadores

Programação para Computação

1. NÍVEL CONVENCIONAL DE MÁQUINA

Introdução a Java. Hélder Nunes

Transcrição:

Projeto de Compiladores FIR Faculdade Integrada do Recife João Ferreira joaoferreira@fir.br 5 e 6 de março de 2007

Agenda da Aula Resposta exercício da aula passada Revisão As Fases de Um Compilador Analisador Léxico Scanner e Parser Especificação de Tokens Reconhecimento de Tokens

As Fases de Um Compilador programa-fonte Análise do programa-fonte análise léxica Síntese análise sintática gerenciador da tabela de símbolos análise semântica gerador de código intermediário tratamento de erros otimizador de código gerador de código programa-destino

Exemplo Completo position := initial + rate * 60 análise léxica id1 := id2 + id3 * 60 análise sintática := id + 1 * id 2 id 60 3 análise semântica gerador de código intermediário temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 otimizador de código temp1 := id3 * 60.0 id1 := id2 + temp1 := + id 1 id 2 id 3 * intotoreal 60 gerador de código MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1

Onde Estamos? programa-fonte análise léxica análise sintática gerenciador da tabela de símbolos análise semântica gerador de código intermediário tratamento de erros otimizador de código gerador de código programa-destino

Análise Léxica Leitura de caracteres para formação de tokens que serão utilizados pela Análise Sintática Geralmente é implementado como uma subrotina ( get next token ) do parser scanner token get next token parser tabela de símbolos

Por que separar Scanner e Parser? Torna o projeto e implementação mais simples Ex: Remoção de espaços e comentários pelo Analisador Léxico, torna mais simples o Parser Aumento de performance através da especialização de atividades Buffering Aumento da portabilidade através do isolamento da camada de entrada de dados

Tokens, Padrões e Lexemas Token é uma unidade léxica (ex. identificador, palavra reservada, operador) Padrão é um conjunto de regras para formação de um token Lexema é uma seqüência de caracteres que casa com um padrão

IFS2 Exemplo Token if relacao id num Lexema if <, <=, =, <>, >, >= pi,count, D2 3.1416, 0, 15 Padrão if < ou <= ou = ou <> ou > ou >= letra seguida por letra ou dígitos constante numérica

Slide 9 IFS2 Verificar se é necessário falar de linguagens como FORTRAN que dificultam a definição de padrões justamente por exigir que certos comandos sejam aplicados em determinadas colunas Verificar se é importante colocar o exemplo da página 86 do dragon book que explica o problema de não se ignorar espaços em branco In Forma Software; 23/2/2007

Exemplo class Programa { //comentario void teste() { } } CLASS IDEN( Programa ) LBRACE VOID IDEN( teste ) LPAREN RPAREN LBRACE RBRACE RBRACE

Atributos dos Tokens É importante saber que lexema casou com o padrão O analisador deve coletar informações influenciarão a tradução do token <id, ponteiro para rate na tabela de símbolos> <op_atribuicao, > <num, valor real 60.0> Nem todos os atributos são obrigatórios

Erros Léxicos Poucos erros podem ser verificados pelo analisador devido a sua visão localizada do código Ex: em fi ( a == f(x) ) O analisador léxico entende fi como um identificador e não como um erro

Erros Léxicos Técnicas de recuperação de erros Panic Mode Remoção de caracteres até que um token válido seja encontrado Remoção do caractere estranho Inserção do caractere ausente Substituição do caractere incorreto Transposição dos caracteres adjacentes A maioria das técnicas pressupõem que apenas um caractere está errado

Buferização de Entrada Análise Léxica é a única fase do compilador que lê o código-fonte, por isso deve-se investir tempo no seu projeto Abordagens (Dificuldade X Eficiência) Utilizar um Gerador de Analisadores Léxicos Lex GALS Escrever um Analisador Léxico usando I/O Escrever um Analisador em Assembly gerenciando explicitamente a leitura

Pares de Buffers Funcionamento Divide o buffer em 2 metades de N-caracteres Realiza a leitura e armazenamento em cada uma das metades Se um número menor que N for lido na segunda metade adiciona um eof Dois apontadores são utilizados lexema adiante

Pares de Buffers Funcionamento (cont.) A string de caracteres entre os dois apontadores é o lexema Comentários e espaços em branco são padrões que não produzem tokens Se o apontador adiante chega à metade, a metade direita recebe um novo conjunto de N caracteres Se o apontador adiante chega ao final do buffer, a metade esquerda recebe um novo conjunto de N caracteres E = M * C * * 2 eof lexema adiante

Sentinelas A técnica anterior precisa verificar a cada deslocamento dos apontadores se os limites do buffer foram ultrapassados O uso se sentinelas (eof) ao final de cada metade do buffer facilita a identificação dos limites E = M * eof C * * 2 eof lexema adiante

Especificação de Tokens Cadeias e Linguagens Operações em Linguagens Expressões Regulares Definições Regulares Simplificações Notacionais Conjuntos Não-regulares

jz10 Cadeias e Linguagens Alfabeto é um conjunto finito de símbolos (letras, números,...) Alfabeto binário = {0,1} Vogais = {a,e,i,o,u} Palavra é uma seqüência/cadeia finita de caracteres de um alfabeto Palavra do alfabeto binário ex: 101 Palavra do alfabeto vogais ex: oi, ei, ao O comprimento da cadeia é denotado por s, onde s é o número de ocorrências

Slide 19 jz10 Adicionar a figura 3.7 e seu conteúdo teórico jz; 28/2/2007

Cadeias e Linguagens A cadeia vazia é representada por ε Linguagem é um conjunto de cadeias sobre um alfabeto e pode ser {ε} ou ø O significado das palavras será discutido mais adiante Concatenação é a união em seqüência de duas ou mais palavras X = laranja, Y = cravo, XY = laranjacravo Se a concatenação pode ser tratada como um produto, temos exponenciação em s 0 = ε e εs = s Para i>0, s i = s i-1 s s 1 = s s 2 = ss

jz11 Operações em Linguagens Assim como podemos realizar operações com palavras podemos realizar operações com linguagens União L U M = { s s está em L ou s está em M } Concatenação LM = { st s está em L e t está em M } Fechamento Kleene L * (zero ou mais) Fechamento Positivo L + (um ou mais)

Slide 21 jz11 Juntar as definições e exemplos em apenas um slide Melhorar isso. Talvez deixar mais claro antes de entrar em detalhes qual a real necessidade de se aprender esse conteúdo jz; 28/2/2007

Operações em Linguagens Exemplo: Sejam L = {A..Z, a..z} e D = {0..9} linguagens finitas. Podem ser derivadas L U D = conjunto de letras e dígitos LD = conjunto de cadeias de uma letra seguida por um dígito L 4 = conjunto de cadeias com quatro letras L* = conjunto de todas as cadeias de letras, ε inclusive L(L U D)* = conjunto de cadeias de letras e dígitos que começam com uma letra D + = conjunto de cadeias de um ou mais dígitos

jz12 Expressões Regulares Permite definir precisamente conjuntos/padrões Exemplo: Pascal identificador é um letra seguida por zero ou mais letras ou dígitos letra ( letra dígito )* Uma expressão regular é formada por expressões regulares mais simples usando um conjunto de regras de definição A expressão r representa um linguagem L(r)

Slide 23 jz12 Aqui é bom fazer um gancho e mostrar outras aplicações e expressões regulares, se possível levar um exemplo (escrito em java) de como utilizar expressões regulares jz; 28/2/2007

jz13 Expressões Regulares: Algumas Regras 1. ε denota um conjunto com uma cadeia vazia 2. Se a é um símbolo em, a denota {a} 3. Se r e s são expressões regulares de L(r) e L(s) a. (r) (s) = L(r) U L(s) b. (r)(s) = L(r)L(s) c. (r)* = (L(r))* d. (r) = L(r)

Slide 24 jz13 Aqui é bom fazer um gancho e mostrar outras aplicações e expressões regulares, se possível levar um exemplo (escrito em java) de como utilizar expressões regulares jz; 28/2/2007

Expressões Regulares: Precedência Regras de precedência podem ser adotadas para reduzir o número de parênteses O * tem maior precedência e é associativo à esquerda A Concatenação tem a segunda maior precedência e é associativa à esquerda O possui a menor precedência e é associativo à esquerda (a) ( (b)*(c) ) = a b*c

Expressões Regulares: Exemplos Seja = {a,b} a b = {a,b} a* =? (a b)* =? a a*b =? (a b)(a b) =?

Propriedades Algébricas das Expressões Regulares Axioma r s = s r r (s t) = (r s) t (rs)t = r(st) r(s t) = rs rt εr = r rε = r r* = (r ε)* r** = r* Descrição é comutativo é associativa A concatenação é associativa A concatenação se distribui sobre ε é o elemento identidade da concatenação Relação entre ε e * * é idempotente

Definições Regulares Podemos nomear as expressões regulares para simplificar referências d 1 r 1 d n r n Exemplo, Identificador em Pascal letra A.. Z a.. z dígito 0.. 9 id letra ( letra dígito )*

IFS6 Definições Regulares Exemplo Números (sem sinal) em Pascal dígito 0.. 9 dígitos dígito dígito* op_fração. dígitos ε op_exp ( E ( + - ε ) dígitos ) ε num dígitos op_fração op_exp A expressão regular num é capaz de representar 5.37? 3.06E-2? 1.0? 1.? 1? sim sim sim não sim

Slide 29 IFS6 procurar uma definição melhor Como mostrar exemplos da utilização ou padrões que casam ex: 1.0, 5.35 E-4 In Forma Software; 1/3/2007

Simplificações Notacionais Servem como atalhos para simplificar a escrita de uma expressão regular + - Uma ou mais instâncias? - Zero ou uma instância * - Zero ou mais instâncias [ ] - Classes de caracteres Cada ferramenta tem sua própria notação para expressões regulares

IFS8 Conjuntos Não-regulares Algumas regras não podem ser descritas com expressões regulares. Em alguns casos são utilizadas Gramáticas Livres de Contexto para expressar tais regras

Slide 31 IFS8 Será que é necessário mesmo? In Forma Software; 1/3/2007

Exemplo em Java?

Reconhecimento de Tokens Já sabemos como especificar tokens. E agora, como encontrá-los? A forma mais recomendada no aprendizado é o Diagrama de Transições seguido da implementação de uma máquina de estados AFN Autômatos Finitos Não-determinísticos AFD Autômatos Finitos Determinísticos

jz15 Diagrama de Transições É um tipo de fluxograma que delimita as ações de um analisador léxico para obter tokens Controla informações sobre caracteres através de posições (ou estados) Estados são conectados por setas (ou lados) Os lados possuem rótulos que indicam o caractere que motivou a transição O rótulo outro representa um caractere não identificado Um estado inicial indica o ponto de partida

Slide 34 jz15 Acho que se deixar apenas o diagrama fica melhor para explicar É melhor definir logo o que é uma máquina de estados assim corta o bla bla bla jz; 1/3/2007

Diagrama de Transições Exemplo, seja a linguagem expr termo relop termo termo termo id num relop < <= = <> > >= id letra ( letra dígito)* letra [A..Za..z] dígito [0..9] num dígito + (. dígito + )? ( E( + - )? dígito + )?

Diagrama de Transições Diagrama de transições que reconhece >= estado de partida 0 > 1 = 2 (Maior ou igual a) outro 3 * (Maior que)

Diagrama de Transições Diagrama de transições que reconhece identificadores e palavras reservadas letra ou dígito estado de partida 0 letra 1 outro 2 * (id ou palavra-reservada) Como diferenciar id de palavra-reservada?

jz16 Máquina de Estados Finita Uma FSM (Finite State Machine) que reconhece M r M s = inicial M M s r = final = intermediário

Slide 38 jz16 Talvez fique redundante falar de Máquina de Estados Finit e Diagrama de Transições Talvez fosse o certo mesmo, e em seguida falar brevemente sobre automatos jz; 1/3/2007

Autômatos Finitos Não-Determinísticos Definição: Um AFN é um modelo matemático que consiste em (S, Σ, δ, S 0, F) S = Conjunto finito de estados Σ = Alfabeto de símbolos de entrada (ex: ASCII) δ = Função de transição S 0 = Estado inicial F = Estado final = initial state M M r s = final state = non-final state

Autômatos Finitos Determinísticos Definição: Um AFD é um tipo especial de AFN jz19 Nenhum estado possui uma transição-ε Para cada estado s de entrada a existe no máximo um lado rotulado a deixando s M r s = initial state = final state = non-final state

Slide 40 jz19 tentar entender melhor este conceito ou colocar a definicao do slide 19 do sprog jz; 1/3/2007

Parece divertido???

Lex Gerador de analisadores léxicos. Lê uma cadeia de caracteres que especificam o analisador léxico e produz o código fonte do analisador léxico em linguagem C Apenas em C? JLex (Java) RunCC (Java) GALS (Java) Definição de Tokens Expressões Regulares JLex Java File: Scanner Reconhece Tokens

Lex - Estrutura declarações variáveis, constantes, %% regras de tradução expr.regulares e ações em C %% procedimentos auxiliares

IFS12 Lex - Exemplo %{ /* definição de constantes LT, LE, EQ, */ %} delim [ \t\n] ws {delim}+ letter [A-Za-z] digit [0-9] id {letter}({letter} {digit})* number {digit}+(\.{digit}+)? (E[+\-]?{digit}+)? %%

Slide 44 IFS12 Conferir com o exemplo do livro do dragão In Forma Software; 2/3/2007

Lex - Exemplo {ws} {/* no action and no return */} if {return(if);} then {return(then);} else {return(else);} {id} {yylval=install_id();return(id);} {number} {yylval=install_num(); return(number);} < {yylval = LT; return(relop);} <= {yylval = LE; return(relop);} %%

Lex - Exemplo int install_id() { Copia o lexema de um id para a tabela de símbolos. } int install_num() { Copia o lexema de um número para a tabela de símbolos. }

Resumo Scanner e Parser Tokens, Padrões e Lexemas Especificação de Tokens Expressões Regulares Reconhecimento de Tokens AFN AFD Lex

Pra Finalizar... Onde encontro material para estudar? Livro UFRGS (Capítulo 2) Livro do dragão (Capítulo 3) WEB! JLex/JFlex RunCC GALS Java RegExp java.sun.com/docs/books/tutorial/essential/regex/index.html

Só mais uma coisa... Monitoria Data: 13/02 20:00 Local: Sala 42 ou Lab Tarefa de Casa 1. No contexto de compiladores defina Bootstrap(ping) 2. Como escrever (usando a linguagem X) um compilador para a linguagem X? 3. Dada uma linguagem binária que só aceite 0 e 1, defina as expressões regulares (em Java) que 1. representem os números binários (0s e 1s) que são potência de 2 2. representem os números binários (0s e 1s) que são pares 3. representem os números binários (0s e 1s) que são ímpares Entrega na próxima aula Até a próxima semana!