Resolução dos exercícios de LEX das aulas práticas de Processamento de linguagens LEX/YACC. Maria João Tinoco Varanda Pereira

Documentos relacionados
O que faz/o que é Como usar Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas Exemplos The Lex & YACC page:

Utiliza Expressões Regulares (ER) Estendidas para definir a especificação da análise léxica desejada

1 d=

Lex Adaptação da obra original de Tom Niemann

DEP. INFORMÁTICA - UNIVERSIDADE DA BEIRA INTERIOR

Algoritmos e Programação

Introdução. Flex e uma ferramenta para gerar scanners programas que reconhecem padrões lexicais em texto

Introdução a Computação

Resolução dos exercícios de YACC das aulas práticas de Processamento de linguagens LEX/YACC. Maria João Tinoco Varanda Pereira

Introdução à Computação MAC0110

Aulas preparatórias Introdução a Programação em Linguagem C

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

INTRODUÇÃO À PROGRAMAÇÃO

Disciplina de Algoritmos e Programação

Estrutura do programa

3. Linguagem de Programação C

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Estruturas de Dados Aula 6: Cadeias de Caracteres

Princípios de Desenvolvimento de Algoritmos MAC122

Linguagem C. André Tavares da Silva.

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

1ª Lista de Exercícios

Teoria da Computação e Algoritmos. Introdução à Linguagem Pascal. ALGORITMO <Nome do algoritmo>; <definições>; INÍCIO <Comandos>; FIM.

Introdução a Programação de Jogos

Algoritmos RESUMO - LINGUAGEM C

Entrada de Dados na Linguagem C. Professor Adolfo Neto DAINF UTFPR Agosto de 2008

INF 1620 P1-04/10/03 Questão 1 Nome:

Q1 Q2 Q3 Nota. Departamento de Informática - PUC-Rio INF 1005 Programação I P4 28/06/2011. Aluno: Matrícula: Turma: _

Legibilidade do código fonte

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

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

Analise o código abaixo:

Linguagens de Programação

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

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Introdução à Computação

Algoritmia e Programação

Computação I (MAB120) DCC/UFRJ

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Programação Básica. Estrutura de um algoritmo

Olimpíadas de Informática

Linguagem C: Introdução

INF 1620 P1-13/09/02 Questão 1 Nome:

Aula 03: Introdução a C

Matrizes. Marina Andretta. 17 de abril de 2017 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 17 de abril de / 30

Compiladores 04 Analise léxica Jflex. Prof José Rui

Aula 8 Oficina de Programação Vetores. Profa. Elaine Faria UFU

Tabela ASCII de caracteres de controle

Introdução a C. Para saber quais os procedimento ou funções que existem em cada biblioteca, acesse

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Aula 9 Oficina de Programação Strings. Profa. Elaine Faria UFU

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

Compiladores - Análise Léxica

Identificadores Nome de variáveis, constantes, métodos, etc...

Introdução à Programação em C Input / Output

Apontadores/ponteiros

Olimpíadas de Informática Aulas preparatórias Introdução a Programação em C.

Programação: Vetores

Ambiente de desenvolvimento

Programação de Computadores IV

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

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

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

Vetores e Strings. 4. Funções Básicas para manipulação de Strings. A função gets() lê uma string do teclado. Sua forma geral é:

Programação de Computadores II

CCO 016 / COM 110 Fundamentos de Programação

1. Como compilar programas usando o DevC++?

Introdução à Programação C

CURSO BÁSICO DE PROGRAMAÇÃO AULA 15. Revisão Vetores e Matrizes Trabalho

MC-102 Aula 11 Strings

Faculdade de Computação

IV.2 Aspectos Léxicos Convencionais

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

Aula 3: Tipos e variáveis

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Folha 3 - Análise léxica

Linguagem C estruturas de repetição

MC102 Algoritmos e Programação de Computadores

Vetores. Marina Andretta. 11 de abril de 2016 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 11 de abril de / 20

3. Linguagem de Programação C

CMP Algoritmos Algoritmos Parte I. Professor Vicente Paulo de Camargo

Curso de C para Engenharias

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

ESTRUTURAS COMPOSTAS

Variáveis e Operadores em C

DEP. INFORMÁTICA - UNIVERSIDADE DA BEIRA INTERIOR

Questão Aula Tipo - Flex+Bison

Aula 05: Condicionais (if / else)

Introdução à Computação

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

ESTRUTURAS COMPOSTAS VETOR

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 3 de setembro de 2010

SITUAÇÃO VETORES. Imagine o seguinte problema:

Programação Estruturada

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Guia de bolso - Prof. César Melo

Introdução à Programação C

Transcrição:

Resolução dos exercícios de LEX das aulas práticas de Processamento de linguagens LEX/YACC Maria João Tinoco Varanda Pereira Março 2003

2

Capítulo 1 Exercícios de LEX 1.1 Resoluções 1. Usando o Lex, construa um filtro de texto que substitua todas as ocorrências de s/ e qq por sem e qualquer respectivamente. s\/ printf("sem"); qq printf("qualquer"); #include <string.h> 2. Construa um programa Lex que calcule o número de palavras do texto fonte. int cont=0; [a-za-z]+ cont++; main() { yylex(); printf("numero de palavras:%d\n",cont);} 3. Escreva um programa em Lex que reconheça um texto escrito em minúsculas e que detecta a palavra reservada integer. integer printf("entrou na primeira"); [a-z]+ printf("entrou na segunda"); 3

CAPÍTULO 1. EXERCÍCIOS DE LEX 4. Escreva um programa Lex que detecte num texto fonte: as palavras begin e end (indicando que são palavras reservadas), os identificadores, os operadores(+,-,* e /) e números inteiros. begin end printf("palavra chave\n"); [a-za-z][a-za-z0-9]* printf("identificador\n"); [\t]+ printf("separadores\n"); [-+*/] printf("operador\n"); [0-9]* printf("numero\n");. \n ; 5. Escreva um programa Lex que detecte num texto fonte as palavras reservadas begin e end e identificadores, utilizando expressões regulares pré-definidas. O reconhecedor deve aceitar minúsculas e maiúsculas. DIGITO [0-9] LETRA [a-za-z] B [bb] E [ee] G [gg] I [ii] N [nn] D [dd] {E}{N}{D} {B}{E}{G}{I}{N} {LETRA}({LETRA} {DIGITO})* printf("palavra chave"); printf("palavra chave"); printf("identificadores"); 6. Construa um programa em Lex que permita contar todas as ocorrências das palavras aluno e aluna, todas as ocorrências de aluno e todas as ocorrências de aluna (aplicação do reject). int total,feminino,masculino; alun(a o) {total++; REJECT;} aluna feminino++; aluno masculino++; main() {yylex(); printf("total:%d, Fem=%d, Mas=%d\n",total,feminino,masculino);} 7. Construa um programa Lex que conte o número de ocorrências da palavra she e he num determinado texto de entrada. 4

1.1. RESOLUÇÕES int s,h; she {s++; REJECT;} he {h++;} main() {yylex(); printf("senhoras:%d",s); printf("senhores:%d",h);} 8. Construa um programa em Lex que some todos os números de um texto e imprima a sua soma quando detectar o caracter + ou =. int soma=0; [0-9]+ {soma=atoi(yytext)+soma;} \+ = printf("soma:%d",soma); 9. Considerando que uma palavra é definida da seguinte forma: palavra=digito* letra (letra + digito + - )* construa um programa Lex que ignorando comentários (todas palavras entre /* e */ ) apresenta o comprimento de todas as palavras. digito [0-9] letra [a-za-z] {digito}*{letra}({letra} {digito} "-")* "\*"[^"*/"]*"*/" ; [ \n\t] ; printf("palavra:%s com comprimento:%d\n", yytext,yyleng); 10. Construa um programa Lex que apresente todas as palavras e números do texto fonte, indicando a linha onde se encontram. %option lex-compat [a-za-z][a-za-z0-9]* {printf("string= %s de comprimento %d\n",yytext,yyleng);} [0-9]+ printf("valor = %d\n",atoi(yytext)); \n {printf("linha numero:%d\n",yylineno);} 5

CAPÍTULO 1. EXERCÍCIOS DE LEX #include <string.h> 11. Construa um programa Lex que receba um texto de entrada e imprima todas as linhas que começam pelo caracter a. ^a.* ECHO; 12. Construa um programa Lex que em todas as linhas começadas por a substi-tua a palavra ola por * e em todas as linhas começadas por b, substitua todas as palavras tsf por +. %START AA BB ^a {ECHO;BEGIN AA;} ^b {ECHO;BEGIN BB;} <AA>ola printf("*"); <BB>tsf printf("+"); <AA>\n BEGIN 0; <BB>\n BEGIN 0; 13. Considere uma linguagem só aceita palavras começadas pela letra a e com comprimento inferior ou igual a cinco caracteres. Pretende-se construir um programa que detecte todos os erros existentes num texto escrito nesta linguagem. int linha=1; [ ]a[^ \t\n]* ^a[^ \t\n]* if(yyleng>5) printf("erro na linha %d:palavra muito comprida\n",linha); [ ][^a][^ \t\n]* ^[^a][^ \t\n]* printf("erro na linha %d: palavra n~ao começa por a\n",linha); \n linha++; 14. Construa um programa em Lex que retire os comentários de um programa em C. %x comentario int num_linha=1; 6

1.1. RESOLUÇÕES /* BEGIN(comentario); <comentario>[^*\n]* ; <comentario> * +[^*/\n]* ; <comentario>\n ++num_linha; <comentario> * + / BEGIN(INITIAL); yywrap() {return 1;} 15. Considere um texto com o seguinte formato: Nome:Maria Idade:15 Nome:Julia Idade:18 Construa um programa que imprima os nomes das pessoas com idade superior a 16 anos. char *nome; char *num; int i,numero; Nome:.* {nome = (char *)malloc(yyleng-5); Idade:.* #include <string.h> main(){yylex();} yywrap(){return(1);} for(i=0;i<(yyleng-5);i++) nome[i] = yytext[i+5];} {num = (char *)malloc(yyleng-6); for(i=0;i<(yyleng-6);i++) num[i] = yytext[i+6]; numero = atoi(num); if(numero>16) printf("%s",nome);} 7