Linguagens Formais e Autómatos

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

Análise Sintática Introdução

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

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

Construção de Compiladores Aula 3 - Analisador Sintático

Conceitos básicos de Teoria da Computação

Linguagens Formais e Autômatos. Simplificação de Gramáticas Livre do Contexto (GLC)

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

Linguagens e Programação BISON. Paulo Proença

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

Como construir um compilador utilizando ferramentas Java

Construção de Compiladores Aula 16 - Análise Sintática

TEORIA DAS LINGUAGENS 3. GRAMÁTICAS INDEPENDENTES DE CONTEXTO

Concurso Público para provimento de cargo efetivo de Docentes. Edital 20/2015 CIÊNCIA DA COMPUTAÇÃO II Campus Rio Pomba

Teoria da Computação Gramáticas, Linguagens Algébricas e Autómatos de Pilha

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

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

Compiladores 02 Analise léxica

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

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Compiladores Aula 4. Celso Olivete Júnior.

Apostila 05 Assunto: Linguagens dos tipos 0 e 1

A. (Autómatos finitos determinísticos e não determinísticos AFD e AFND)

LINGUAGENS FORMAIS E AUTÔMATOS. Prova 2-10/06/ Prof. Marcus Ramos

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

Gramáticas Livres de Contexto Parte 1

Teoria da Computação. 2006/2007 Trabalho prático nº 1. Trabalho realizado por: Pedro Oliveira ( ) Rui Costa ( ) Turma: TP1

IV Gramáticas Livres de Contexto

Compiladores Ficha de exercícios

Linguagens Livres de Contexto

Curso de Engenharia de Computação - UTFPR Teoria da Computação - Prof. Celso Kaestner Lista de exercícios

Fundamentos da Programação

Fundamentos da Programação

Linguagens Formais e Autômatos 02/2016. LFA Aula 01 24/10/2016. Celso Olivete Júnior.

Exercícios de apoio às aulas teóricas de Processamento de Linguagens. ESTiG - IPB. Maria João Tinoco Varanda Pereira

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

Alfabeto, Cadeias, Operações e Linguagens

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

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

Familiarização com a ferramenta JavaCC

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

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Folha 2 Autómatos e respectivas linguagens

A. (Autómatos finitos determinísticos e não determinísticos AFD e AFND)

Análise Sintática - Final

Processamento de Linguagens I LESI + LMCC (3Âo ano)

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013

Prova 1 de INF1626 Linguagens Formais e Autômatos

Fundamentos da Teoria da Computação

Segunda Lista de Exercícios 2004/2...

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Compiladores. Análise Léxica

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes

Aula 8: Gramáticas Livres de Contexto

Análise Sintática. Fabiano Baldo

Gramáticas e Linguagens independentes de contexto

COMPILADORES. Revisão Linguagens formais Parte 01. Geovane Griesang

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

Fundamentos de Programação

INE5317 Linguagens Formais e Compiladores. AULA 4: Gramáticas

Teoria de Linguagens 1 o semestre de 2018 Professor: Newton José Vieira Primeira Lista de Exercícios Data de entrega: 17/4/2018 Valor: 10 pontos

BCC244. Alfabeto, String, Linguagem, Gramática. Registro aqui o agradecimento à Profa. Lucília por ceder slides que fazem parte deste materal.

Legibilidade do código fonte

Fundamentos de Programação

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

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

Linguagens Formais e Autômatos (LFA)

Ferramenta de apoio a identificação de eventos utilizando Linguagem Natural. Aluno: Ricardo Tomelin Orientador: Everaldo Artur Grahl

FUNDAMENTOS DA PROGRAMAÇÃO 1º Teste, 19 de abril de 2013, 1h30m

Fundamentos da Programação

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Teoria de Linguagens 2 o semestre de 2015 Professor: Newton José Vieira Primeira Lista de Exercícios Entrega: até 16:40h de 15/9.

Linguagens Regulares. Prof. Daniel Oliveira

LINGUAGENS FORMAIS E AUTÔMATOS

Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Curso de Ciências de Computação

Gramáticas Livres de Contexto

Gramática Livre de Contexto

Transcrição:

Parte teórica - Duração: 5 min Nome Número Atenção: Responda às perguntas na folha do enunciado ndique o seu número e nome A prova é sem consulta Cada resposta errada terá uma cotação negativa de 2/3 do seu valor Parte teórica 8 valores Todas as perguntas tem a mesma cotação. As linguagens do tipo 3 na hierarquia de Chomsky: só podem ser reconhecidas por expressões regulares... q podem ser reconhecidas por expressões regulares... ý nunca podem ser reconhecidas por expressões regulares... q são linguagens com apenas 3 símbolos... q 2. Uma gramática independente do contexto que possua autocontenção é: uma linguagem regular... q uma linguagem independente do contexto... ý uma linguagem complexa... q uma linguagem irregular... q 3. Um compilador: compila uma linguagem gerando os tokens... q junta um programa fonte às respectivas bibliotecas... q traduz um programa escrito em código fonte em código objecto... ý nenhuma das anteriores... q 4. Um autómato finito diz-se determinístico se: nenhum estado tem transições para o estado inicial... q só tem um estado final... q em cada estado um símbolo do alfabeto permite uma única transição... ý num estado cada símbolo do alfabeto permite pelo menos uma transição... q 5. A afirmação "produções alternativas do mesmo não terminal começam por terminais distintos" é: condição suficiente para uma gramática ser LL()... q condição necessária para uma gramática ser LL()... ý condição necessária e suficiente para uma gramática ser LL()... q nenhuma das anteriores... q pág.

6. Numa gramática LL(2), o número 2 significa: do tipo 2... q utilização de 2 símbolos em avanço... ý leitura de 2 símbolos da frase de cada vez... q nenhuma das anteriores... q 7. Uma gramática diz-se recursiva à esquerda se o mesmo terminal aparece em duas produções alternativas... q existe uma variável A tal que existe uma derivação A + αa... q duas produções alternativas começam pelo mesmo terminal... q + existe uma variável A tal que existe uma derivação A Aα... ý 8. Utilizando apenas um inteiro para identificar o tipo dos identificadores podemos ter: um número potencialmente ilimitado de tipos... q apenas um número limitado de tipos... ý tipos definidos pelo utilizador... q apenas 8 tipos diferentes... q 9. A inserção de acções semânticas numa gramática independente do contexto permite: satisfazer os requisitos de linguagens dependentes do contexto... ý a execução do código gerado... q a realização de um compilador de duas passagens... q nenhuma das anteriores... q 0. Na geração de código para uma ocorrência aplicada de uma variável, numa linguagem declarativa (por exemplo o C), temos que: efectuar, se necessário, uma conversão de inteiro para real... ý efectuar, comparação de tipos em termos de compatibilidade... q gerar uma etiqueta correspondente à variável em causa... q inserir a variável na tabela de símbolos... q FM pág. 2

Parte prática - Duração: 0h30m Atenção: ndique em cada folha o seu número e nome A prova é com consulta e tem a duração de 0h30m Grupo Cotação a) 2.0 b) 2.0 Para cada uma das alíneas seguintes represente a linguagem dada usando uma expressão regular e um autómato finito determinístico: a) Para o alfabeto Σ = 0,, L A = u Σ : u é um número par Expressão regular: 0 0 ou menos correcto 0 0 0 0 0 0 2 3 2 Autómato: ou b) Para o alfabeto Σ =,,, L, C, L A = u Σ : u é um núemro romano < 00 Expressão regular: 0,2 L C? L 0,3? 0,2? 0,3 3 2 2 6 C L 9 0 8 2 3 4 L 6 5 4 7 5 0 Autómato: 2 pág. 3

Grupo Cotação a) 2.0 b) 2.0 c).0 Considere o seguinte conjunto: a) Represente-o sob forma gramatical. L = a! b! c! : 2m = n, n 0 Como m e n têm de ser inteiros, temos para m=0, n=0 para m=, n=2 para m=2, n=4 etc.. S' S ε S aasba aabba AB BA bb bbb ba ba aa aa b) A gramática que obteve é LL()? Justifique. A gramática indicada não é do tipo 3 porque possui autocontenção. Também não é do tipo 2 porque a condição imposta só pode ser satisfeita com dependência de contexto. Por estes motivos a gramática é de tipo. Uma gramática do tipo não pode ser LL() c) Apresente uma sequência de derivações a realizar, para obter a expressão aabba S' S 2 aabba 3 aabba Se fosse pedida a frase aaaabbbbaa, seria: S' S 2 aasba 3 aaaabbaba 4 aaaabbbaa 5 aaaabbbbaa 6 aaaabbbbaa 7 aaaabbbbaa pág. 4

Grupo a): 2.5 b):.5 Suponha uma gramática com as seguintes produções: Sà aab bba Aà aa C B à bb C C à (C) ε a) Escreva um parser em descida recursiva que corresponda à gramática. Este parser utiliza as variáveis globais token e nerros, e a função yylex() que devolve o próximo token. enum{a,b,a_par,f_par,fm int token,nerros=0 void s() void a() void b() void c() void erro(char *s) { nerros++ printf("erro %d: %s\n",nerros,s) void s() { /* S->aAB bba */ if (token==a) { a() b() if (token==b) { b() a() erro( não é a nem b ) void a() { /* A->aA C */ if (token == A) { a() c() void b() { /* B->bB C */ if (token == B) { b() c() void c() { /* C-> (C) vazio */ if (token == A_PAR) { c() if (token == F_PAR) erro("falta ')'") /* vazio, não dá erro */ void main() { /* pega o º token */ s() /* produção inicial */ if (nerros==0 && token==fm) printf("expressão válida \n") printf("expressão inválida \n") pág. 5

b) Diga se a frase aa()bb pertence à gramática, justificando através da apresentação de uma árvore de derivação. S a A B a A b B C b B ( C ) C ε ε A frase pertence à gramática, pois todos os símbolos da frase foram consumidos e nas folhas da árvore só existem terminais. Grupo Cotação 7.0 Suponha um simulador de uma máquina de venda automática que dispõe de um conjunto de produtos e aceita moedas em euros ( 0.0, 0.02, 0.05, 0.0, 0.20, 0.50,.00, 2.00). O objectivo é seleccionar um produto, introduzir o respectivo valor, receber o troco (se existir) e receber o produto. Considere os seguintes produtos: café ( 0.25), chá ( 0.25), chocolate ( 0.40), copo ( 0.05) e leite ( 0.30). O formato de entrada de dados deve obedecer à seguinte regra: <produto>, <moeda >,... <moeda n >. O formato de saída deve obedecer à seguinte regra: <produto>, <moeda >,... <moeda n > dinheiro insuficiente. Exemplo: Entrada - café, 0.0, 0.0, 0.05, 0.20 Saída café, 0.0, 0.0 Defina a gramática de modo a que a máquina funcione ininterruptamente e implemente-a utilizando Flex e Bison. Gramática: S PS ε P B, MR R, MR ε B café chá chocolate copo leite M 0.0 0.02 0.05 0.0 0.20 0.50.00 2.00 pág. 6

Flex: Para execução no LNU, símbolo foi substituído por e %{ #include"simulador.tab.h" extern int n_erros % %% cafe {return CAFE cha {return CHA chocolate {return CHOCOLATE leite {return LETE copo {return COPO e0?\.0 {return M CENTMO e0?\.02 {return M_2_CENTMOS e0?\.05 {return M_5_CENTMOS e0?\.0? {return M_0_CENTMOS e0?\.20? {return M_20_CENTMOS e0?\.50? {return M_50_CENTMOS e(\.0{0,2)? {return M EURO e2(\.0{0,2)? {return M_2_EUROS \n \, {return(yytext[0]) [ \t] <<EOF>> {return 0. {printf("erro lexico '%s'\n",yytext)n_erros++ %% int yywrap() { return() Bison: Para execução no LNU, símbolo foi substituído por e %{ #define YYSTYPE double int n_erros=0 char msg[024] char *troco(double, double) % %token CAFE CHA CHOCOLATE LETE COPO %token M CENTMO M_2_CENTMOS M_5_CENTMOS M_0_CENTMOS M_20_CENTMOS M_50_CENTMOS %token M EURO M_2_EUROS %% maquina: maquina pedido /* vazio */ pedido: bebida ',' moeda resto '\n' {printf("%s\n",troco($,$3+$4)) error '\n' {yyerrok resto: ',' moeda resto {$$=$2+$3 /* vazio */ {$$=0.0 bebida: CAFE {printf("cafe")$$=.25 CHA {printf("cha")$$=.25 CHOCOLATE {printf("chocolate")$$=.40 LETE {printf("leite")$$=.30 COPO {printf("copo")$$=.05 moeda: M CENTMO {$$=.0 M_2_CENTMOS {$$=.02 M_5_CENTMOS {$$=.05 M_0_CENTMOS {$$=.0 M_20_CENTMOS {$$=.20 M_50_CENTMOS {$$=.50 M EURO {$$=.0 pág. 7

M_2_EUROS {$$=2.0 %% char *troco(double preco, double dinheiro) { double troco troco=dinheiro-preco msg[0]=0 printf("(troco:%f)",troco,troco) if (troco<0) strcat(msg,",dinheiro insuficiente") if (troco==0) strcat(msg,",não há troco") while(troco>0.0) if (troco>=2.0) { strcat(msg,",e2.00") troco-=2.0 if (troco>=.0) { strcat(msg,",e.00") troco-=.0 if (troco>=.5) { strcat(msg,",e0.50") troco-=.5 if (troco>=.2) { strcat(msg,",e0.20") troco-=.2 if (troco>=.) { strcat(msg,",e0.0") troco-=. if (troco>=.05) { strcat(msg,",e0.05") troco-=.05 if (troco>=.02) { strcat(msg,",e0.02") troco-=.02 { strcat(msg,",e0.0") troco-=.0 return(msg) int main() { printf("máquina de venda de produtos\n") yyparse() int yyerror(char *s) { printf("erro sintactico: %s\n",s) n_erros++ FM pág. 8