Processamento de Linguagens e Compiladores

Documentos relacionados
1 Autómatos Finitos Deterministas

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

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Gramáticas ( [HMU00], Cap. 5.1)

Compiladores Ficha de exercícios

Gramática. Prof. Yandre Maldonado e Gomes da Costa. Prof. Yandre Maldonado - 1

Gramática. Gramática. Gramática

Linguagens e Programação Gramáticas. Paulo Proença

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

Definições Hierarquia de Chomsky Exemplos de gramáticas. Gramáticas. Objetivo de ensinar o inglês pelo computador e conseguir um tradutor de línguas

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

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais

Pedro Vasconcelos DCC/FCUP. Programação Funcional 4 a Aula Listas

IBM1088 Linguagens Formais e Teoria da

Gramáticas e Linguagens independentes de contexto

Compiladores - Análise Léxica

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

Linguagens Livres de Contexto

Aula 7: Autômatos com Pilha

Definições Exemplos de gramáticas

Compiladores - Análise Léxica

Conceitos Básicos. Vocabulário Cadeias Linguagens Problema

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem

Expressões e Gramáticas Regulares e Autómatos Finitos

Folha 3 - Análise léxica

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

TEORIA DAS LINGUAGENS 3. GRAMÁTICAS INDEPENDENTES DE CONTEXTO

Alfabeto, Cadeias, Operações e Linguagens

Capítulo 1: Alfabetos, cadeias, linguagens

Compiladores Aula 4. Celso Olivete Júnior.

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Como construir um compilador utilizando ferramentas Java

Teoria da Computação Aula 02 Introdução

Matemática Discreta para Ciência da Computação

Modelagem e CLP Linguagens e Expressões Regulares

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Linguagens e Programação Automátos Finitos. Paulo Proença

TRANSFORMAÇÃO DE GRAMÁTICAS LIVRES DO CONTEXTO PARA EXPRESSÕES REGULARES ESTENDIDAS

IV Gramáticas Livres de Contexto

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Compiladores. Simão Melo de Sousa. Computer Science Department University of Beira Interior, Portugal. S. Melo de Sousa Compiladores

Teoria da Computação

CMP Algoritmos Algoritmos Parte I. Professor Vicente Paulo de Camargo

Capítulo II Gramáticas

ÁLGEBRA DE BOOLE B.1 - DIAGRAMA DE VENN


Lista de Exercícios CT-200 Primeiro Bimestre Carlos Henrique Quartucci Forster Estagiário: Wesley Telles. Revisão de Teoria de Conjuntos

Expressões regulares

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Algoritmos e Técnicas de Programação

Python e sua sintaxe LNCC UFRJ

Semântica Denotacional

Compiladores. Análise Léxica

Linguagens de Programação Funcional

Geradores e relações

Aula 1. e o conjunto dos inteiros é :

Informações. Programação Funcional. Por que um curso de programação funcional? O que é Programação Funcional? Objetivos da programação funcional

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Linguagens Formais - Preliminares

1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 E-books PCNA. Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 APRESENTANDO A LINGUAGEM C. Página 1

Problema A Codificação Símbolos Dado um inteiro n, n é N representação de inteiros 0,1,...,b - 1 numa base b Dado um grafo G, G é conexo?

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07

a * Expressões Regulares (ER) AF e ER Equivalências entre AFD, AFND, AF-, ER

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC

Construção de um compilador para a linguagem Panda

LINGUAGENS FORMAIS Definições. Desenvolveram-se na História em função da necessidade dos grupos humanos que as empregavam

Puca Huachi Vaz Penna

Capítulo II Gramáticas

Linguagens Formais e Problemas de Decisão

Gramática Livre de Contexto

Programação Funcional em Haskell

Instruções, dados e expressões

Programação Funcional 9 a Aula Programas interativos

Expressões Condicionais

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Geometria Analítica. Geometria Analítica 28/08/2012

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

Compiladores. Análise Léxica

Aula prática 14. Expressão Lambda

Linguagens de Domínio Específico

Expressões Condicionais

Álgebra Booleana. Introdução ao Computador 2010/01 Renan Manola

Linguagens de Programação Aula 14

Linguagens regulares e expressões regulares

Linguagem (formal) de alfabeto Σ

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Gramáticas Livres de Contexto

Sintaxe do Pascal Simplificado Estendido de 12 novas construções em Notação EBNF (BNF estendida)

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Como construir um compilador utilizando ferramentas Java

PCS 3115 (PCS2215) Conteúdo

Modelos de Computação

PCS 3115 (PCS2215) Sistemas Digitais I. Módulo 05 Álgebra Booleana. Prof. Dr. Edison Spina. Sobre o material do Prof. Dr. Marcos A. Simplicio Jr.

Exercicios. 7.2 Quais das seguintes afirmações são verdadeiras? Justifica. (d) abcd L((a(cd) b) )

Transcrição:

Processamento de Linguagens e Compiladores LMCC, Universidade do Minho Ano lectivo 2005/2006 João Saraiva Ficha TeóricoPrática N o 1 Este texto está escrito em literate Haskell. Isto é, pode ser interpretado como um documento L A TEX ou como um puro programa na linguagem Haskell. O documento pode ser obtido compilando directamente este ficheiro em L A TEX: latex ficha1.lhs, ou então utilizando um sistema de literate programming para Haskell mais poderoso, como por exemplo o sistema lhs2tex. O programa Haskell incluído neste ficheiro é compilado/interpretado directamento pelos compiladores/interpretadores de Haskell. Para isso o código Haskell deve estar delimitado pelo comando begin e end code. Responda às perguntas sobre Haskell neste próprio ficheiro para assim produzir o programa e a sua documentação. 1 Expressões Regulares 1.1 Escreva expressões regulares para definir as seguintes linguages regulares: 1. Frases constituídas por zero ou mais símbolos a seguidos por um ou mais símbolos b. 2. Frases, não vazias, constituídas por símbolos a ou b. 3. Linguagem cujas frases são os digitos. 4. Linguagem dos números inteiros. 5. Linguagem que define os identificadores de linguagens de programação. Considere que um identificador começa obrigatoriamente por uma letra minúscula, e é seguida por letras ou digitos. 6. Linguagem dos números reais. Considere que 3, +11.12,.14, 14 são frases da linguagem. Porém, +, 11., + + 12, 11.2.3 não são frases desta linguagem. 1

1.2 Prove que a frase abbc é uma frase da linguagem definida pela seguinte expressão regular: a + (ab + c + b ) 2 Expressões Regulares em Haskell 2.1 Defina o tipo de dados algébrico RegExp em Haskell para representar expressões regulares. Módulo de Express~oes Regulares em Haskell Processamento de Linguagens e Compiladores 2006/2007 module RegExp where data RegExp = Empty 2.2 Escreva as expressões regulares do exercício 1 usando os construtores do tipo RegExp. 2.3 Escreva um função showre que imprime uma expressão regular na sua notação tradicional. Por exemplo, se fizer o showre em ghci/hugs da primeira expressão regular escrita em Haskell no exercício anterior obtémse: RegExp> showre zeroasmorebs "((a)*(b(b)*))" 2

showre Empty = "" 3 Função de Aceitação para Expressões Regulares 3.1 Complete a definição da função matches (retirando ainda o comentário que a envolve). Na definição desta função consideramse apenas os constructores canónicos de expressões regulares. matches :: RegExp > String > Bool matches Empty inp = False matches Epsilon inp = inp==[] matches (Literal l) inp = matches (Or re1 re2) inp = matches (Then re1 re2) inp = matches (Star re) inp = matches Epsilon inp or [ matches re s1 && matches (Star re) s2 (s1,s2) < frontsplits inp ] splits :: [a] > [ ([a],[a]) ] splits s = [ splitat n s n < [ 0.. length s ] ] frontsplits :: [a] > [ ([a],[a]) ] frontsplits s = [ splitat n s n < [ 1.. length s ] ] 3.2 Escreva o código Haskell para definir a função isint que dada uma string α diz se α é um inteiro ou não. Isto é, tem tipo isint :: String > Bool. isint :: String > Bool 3

3.3 O tipo de dados RegExp apresentado já contém os constructores para modelar os operadores opcional e uma ou mais repetições usualmente usados em expressões regulares. Porém, para reutilizar a função matches é necessãrio primeiro converter uma expressão regular extendida para a sua forma canónica (isto é, definida pelos cinco constructores iniciais). Escreva uma função extretore para esse efeito. matches = 3.4 Uma expressão regular p define uma linguagem infinita se e só se ocorrer pelo menos um operador de repetição + ou em p. Defina a função finite que indica se a linguagem modelada pela expressão reular argumento é finita ou não. finite :: RegExp > Bool 3.5 Defina a função size que calcula o tamanho de uma expressão regular. O tamanho de uma expressão regular é determinado pelo número de ocorrências de símbolos do alfabeto e de símbolos ɛ na expressão. size :: 4

4 Algebra de Expressões Regulares 4.1 Sejam α, β e γ expressões regulares, então podemos afirmar que: 1. (α + β) + γ = α + (β + γ) 2. α + = + α = α 3. α + β = β + α 4. α + α = α 5. (αβ)γ = α(βγ) 6. αɛ = ɛα = α 7. α(β + γ) = αβ + αγ 8. (β + γ)α = βα + γα 9. α + = αα = α α 10. α = ɛ + α + 11. (α + ɛ) + = (α + ɛ) = α Prove as seguintes igualdades: 1. b + + (b + + ɛ)b = b + 2. a (b + cd)b = a b + + a cd + a cdb + 3. a + a + = a + Simplifique as seguintes expressões regulares: 1. a(a b + c)a + a + ba 2. l + l(l + d) 4.2 Prove que as expressões regulares p = (ab+ɛ) + ab+a(a +bc)c e q = abc + +a + c +(ab) não são equivalentes: Dê um exemplo de uma frase α da linguagem definida pela expressão regular q, mas que não é da linguagem definida por p, i.e., α L(q) e α / L(p). 4.3 A álgebra de expressões regulares permitenos simplificar as expressões, isto é, permite transformar uma expressão regular p numa p em que sizep < sizep. Defina em Haskell a função simplify que baseada na álgebra de expressões regulares simplifica uma expressão regular. 5

simplify :: 5 Padrões de Recursividade 5.1 Considere as função extretore, showre e sizere. Estas funções apresentam o mesmo padrão de recursividades: a recursividade segue a estrutura do tipo de dados RegExp. Recorde que na cadeira de Cálculo de Programas foram apresentados os catamorfismos para modelar estes padrões de recursividade. Escreva o código Haskell para: 1. Derive o catamorfismo para o tipo de dados indutivo RegExp 2. Reescrever as funções extretore, show e sizere como catamorfismos. 6