Disciplinas envolvidas: Algoritmos e Programacao I, Algoritmos e Programacao II, Teoria da Com-
putac ao Autor: Jose de Oliveira Guimar aes Descricao Suponha que seja necessario vericar, na linguagem C, se os caracteres digitados na entrada padr ao sao uma sequencia de zero ou mais letras v. Isto poderia ser feito pelo seguinte programa em C: #include <stdio.h> int main(void) { char ch; while ( (ch = getchar()) != \r && ch != \n ) if ( ch != v ) break; if ( ch != \r && ch != \n ) puts("n~ ao aceito"); else puts("aceito"); return 0; } Este programa imprime aceitoe nao aceitose a entrada e ou n ao e uma sequencia de vs. A entrada deve terminar com um \r ou \n, o que pode ser conseguido teclando-se ENTER. N ao e difcil reconhecer padroes um pouco mais complexos. Por exemplo, se a entrada e o car ater a ou b. Ou uma sequencia de caracteres a ou b, em qualquer ordem: #include <stdio.h> int main(void) { char ch; while ( (ch = getchar()) != \r && ch != \n ) if ( ch != a && ch != b ) break; if ( ch != \r && ch != \n ) puts("n~ ao aceito"); else puts("aceito"); return 0; } Este tipo de padr ao de repeti cao de caracteres e especicado usando-se uma linguagem regular ou 1 expressao regular, estudada em Teoria da Computac ao. Contudo, podemos fazer programas que reconhecem tais linguagem mesmo sem a deni cao formal destas. Um outro exemplo e o reconhecimento de sequencias tais que a primeira letra e i seguida de v seguida de pares , e v seguido de ;. Isto e especicado como a express ao regular iv(,v)*; (que ser a estudada futuramente. Os parenteses n ao fazem parte da expressao, apenas delimitam , e v. O asterisco signica repetic ao zero ou mais vezes. Neste caso, repetic ao zero ou mais vezes de ,v). Esta express ao regular pode ser reconhecida pelo seguinte programa em C: #include <stdio.h> int main(void) { int ch; int aceito = 1; if ( getchar() != i ) aceito = 0; else { if ( getchar() != v ) aceito = 0; else { // reconhece (,v)*, sequ^encias de , seguido de v ch = getchar(); while ( ch == , && aceito ) { if ( getchar() != v ) aceito = 0; else ch = getchar(); } if ( ch != ; ) aceito = 0; else ch = getchar(); if ( ch != \r && ch != \n ) aceito = 0; } } if ( aceito ) puts("aceito"); else puts("n~ ao aceito"); return 0; } Esta expressao regular e uma abstrac ao para declarac ao de uma ou mais variaveis inteiras em C: int j, k, ... z; 2 Na expressao iv(,v)*; o carater i representa int e v representa o nome da vari avel. Exerccios 1. Faca um programa em C que reconheca sequencias de dgitos em C (nao se preocupe se a sequencia nao e um int ou long valido. 2. Faca um programa em C que reconheca identicadores validos em C, que podem conter letras, n umeros e _ (sublinhado), comecando por letra ou sublinhado. 3. Faca um programa em C que reconheca uma expressao regular que deve comecar por i seguido de (, uma letra qualquer, ), s e opcionalemente seguido de e e s. Esta expressao regular e uma abstracao para o comando if de C, que tem uma parte else opcional. Duas sequencias v alidas sao i(a)s e i(z)ses. 4. Faca um programa em C que reconheca uma expressao regular que abstrai o comando composto entre { e }. Use s para as instrucoes entre as chaves. Exemplos de sequencias validas sao {}, {sss} e {s}. 5. Faca um programa em C que reconheca as sequencias comecadas por i seguido por dgitos ou comecadas por a seguido de letras min usculas ou comecadas por A seguido de letras mai usculas. 6. A linguagem XML e utilizada para armazenar dados de forma estruturada. Como exemplo, os dados de uma agenda poderiam ser armazenados por um arquivo texto com o seguinte conte udo: <agenda> <contato> <nome> Arquimedes </nome> <tel> 3231-9784 </tel> <tel> 9821-3425 </tel> </contato> <contato> <nome> Isaac Newton </nome> <tel> 3234-3433 </tel> <tel> 7623-2384 </tel> <tel> 3633-2444 </tel> </contato> <contato> <nome> Carl Gauss </nome> <tel> 6328-7832 </tel> </contato> </agenda> Usando a para agenda, c para contato, n para nome, t para telefone, este exemplo seria representado pela sequencia acnttcntttcnt. A forma geral de uma sequencia e a(cnt*)*. Faca um programa em C que reconheca as sequencias validas. 3