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