Ficha id: pl2015-f2

Processamento de Linguagens (LEI - 3ºano)

Este ficha prática contem exercícios para serem resolvidos nas aulas teórico-práticas com vista a sedimentar os conhecimentos relativos a:

  • Motivação para o uso de Expresses Regulares (ERs) como forma de especificar padrões a pesquisar em textos - recurso a utilitários de Linux que seguem essa abordagem;
  • Uso de Expressões Regulares para definir (gerar) Linguagens Regulares;
  • Uso de Expressões Regulares para desenvolver programas eficientes, baseados em algoritmos standard guiados por Autómatos Finitos Deterministas, para reconhecer Linguagens Regulares;
  • Uso de Autómatos Deterministas Reactivos, para processar Linguagens Regulares, isto é, para desencadear ações específicas ao reconhecer frases que derivam de padrões (definidos com base em ERs) - princípio da Programação baseada em regras Condição-Reação, Sistemas de Produção;
  • Geração automática de programas a partir de especificações formais;
  • Uso da ferramenta flex, disponível em ambiente Linux, para processamento de linguagens regulares, nomeadamente para criação de Filtros de Texto em geral.

Para introduzir a ferramenta de geração de programas FLex baseada em especificações com Expressões Regulares, e para ilustrar a importância do uso de autómatos deterministas reactivos como suporte à construção de programas eficientes, propõem-se alguns exercícios, para resolver dentro ou fora da aula, que visam a criação de programas autónomos para filtrar textos (FT).

Exercícios:

  1. Processador de Questionários
  2. Expansor de Abreviaturas
  3. Somador de Números
  4. Documento anotado em XML
  5. Normalizador de Emails
  6. Palavras, números e número de linha
  7. Números mistos
  8. Tokenizer
  9. A Cabine Telefónica
  10. O programador da iluminação
  11. O Jogo dos Dardos

Exercício Nº 1: Processador de Questionários

Suponha que ao fim de cada entrevista um Repórter produz um texto com as perguntas e respostas, distinguindo umas das outras porque as perguntas começam com 'EU:', no início da linha, e as respostas começam com 'ELE:', também no início da linha.

Nesse contexto, pretende-se desenvolver um FT para processar os questionários que:

  1. simplesmente retire do texto original as tais marcas 'EU:' e 'ELE:', devolvendo todo o resto da entrevista sem qualquer alteração. Melhore o filtro, de modo a tratar as marcas, quer estejam escritas em maiúsculas, quer em minúsculas;
  2. substituia a marca 'EU' pela palavra 'Entrevistador' e a marca 'ELE' por 'Entrevistado';
  3. substituia a marca 'EU' pelo nome do entrevistador e a marca 'ELE' pelo nome do entrevistado, supondo que no início encontrará as respectivas definições (ordem irrelevante) na forma 'EU=nome.' ou 'ELE=nome.'

Exercício Nº 2: Expansor de Abreviaturas

Quando se retiram apontamentos, ou de uma forma geral, se tem de escrever muito depressa, é hábito usar abreviaturas que correspondam a uma ou mais palavras vulgares e longas.

Suponha que criou esse costume e resolveu inserir nos seus textos as ditas abreviaturas (2 ou mais letras) precedidas pelo carácter '\'. Por exemplo: '\qq' (qualquer), ou '\mb' (muito bom), ou ainda '\sse' (se e só se).\

Desenvolva então as seguintes alíneas:

  1. um FT que lhe devolva o texto original mas com todas as abreviaturas (que definiu à partida) devidamente expandidas;
  2. melhore o seu filtro de modo a contemplar ainda o tratamento do carácter '/' no fim de uma palavra, representando o sufixo 'mente', e o carácter '~' no início de uma palavra, representando o prefixo 'in'. Uma palavra pode conter ambos os caracteres, um no início e outro no fim (pense na abreviatura da palavra 'infelizmente');
  3. outra melhoria que poderia introduzir no seu filtro era contemplar a possibilidade de definir abreviaturas dentro do próprio texto, na forma '\def:abrev=termo-expandido;'. Pense como o fazer e nas implicações que tal requisito teria no seu filtro original (alínea proposta para pensar fora da aula).

Exercício Nº 3: Somador de Números

Construa um Filtro de Texto que adicione todos os números dum texto e que, no final, imprima a sua soma (no ficheiro de saída não deve aparecer nenhum caracter do texto de entrada).

Evolua o seu processador no sentido de:

  1. Escrever a soma sempre que encontre o carácter '=';
  2. Só comece a somar quando detectar o carácter '+' e deixe de somar quando este carácter voltar a aparecer.

Exercício Nº 4: Documento anotado em XML

Como sabe um Documento XML é um texto vulgar semeado de anotações, ou marcas, que são identificadores especiais (designados por elementos XML) intercalados entre os caracteres '<' e '>'. Num documento XML bem formado, a cada marca de abertura corresponderá uma marca de fecho, que tem o mesmo identificador, mas que começa por '</' terminando na mesma em '>'.

Desenvolva um filtro de texto (FT) que receba um documento XML e:

  1. devolva o texto original, após ter retirado todas as marcas;
  2. conte o número de marcas de abertura e o número de marcas de fecho, indicando erro sempre que se verifique um desequilíbrio entre ambas (aqui apenas se pede que detecte o erro por contagem e não atendendo ao identificador do elemento em causa em cada marca);
  3. verifique a concordância entre as marcas de abertura e as marcas de fecho}, isto é, garanta que as marcas se fecham por ordem inversa da que abrem, mas agora tomando em atenção o identificador do elemento em causa em cada marca. No fim produza uma listagem, ordenada alfabeticamente, de todos os elementos distintos encontrados.

Exercício Nº 5: Normalizador de Emails

Os Emails escritos à moda PRH caracterizam-se por terem todas as palavras começadas por letras minúsculas, à exceção dos nomes próprios e siglas.

Desenvolva, então:

  1. um FT que normalize o texto, capitalizando (escrevendo a letra inicial em maiúsculas) todas as palavras no início de cada frase. Além da primeira palavra do texto, uma frase começa depois de um '.', '?' ou '!', seguido de zero ou mais espaços, eventualmente um ou mais fim-de-linha;
  2. complete a especificação anterior de modo a que o seu normalizador de emails prh conte também todos os nomes próprios (palavras começadas por maiúsculas) e siglas (palavras formadas só por maiúsculas, uma ou mais) encontradas no texto original.

Exercício Nº 6: Palavras, números e número de linha

Construa um programa em Lex que apresente todas as palavras e números do texto fonte, indicando o número da linha onde se encontram (numa segunda versão indique também em que coluna da linha é iniciada a palavra ou o número).

Exercício Nº 7: Números mistos

Um número misto é constituído por uma parte inteira e uma fração própria (numerador é inferior ao denominador). Exemplos: 5 3/4, 1 2/3, 100 27/35.

Especifique um processador em lex que responda às seguintes alíneas:

  1. Sempre que apanhar um número constituído por parte inteira e parte decimal converte-o num número misto. Exemplos dos números a converter: +356.32, -47.989, 3.731;
  2. Sempre que apanhar uma fração, verifica se esta é imprópria e, em caso afirmativo, converte-a para um número misto. Exemplos de frações impróprias: 10/3, -15/2, +35/25;
  3. Sempre que apanhar um número misto em que a fração é imprópria assinala o erro e apesenta a forma correta do número em causa;
  4. Em todas as situações a fração do número misto a ser apresentado deverá estar sempre na sua forma mais reduzida.

Exercício Nº 8: Tokenizer

Normalmente, um programa/processador que converte uma sequência de carateres numa sequência de símbolos/tokens é designado por tokenizer.

Neste exercício deverás especificar um programa em C que usará um processador gerado pelo flex para reconhecer os vários símbolos da linguagem e indicar na saída a respetiva sequência de símbolos.

Os símbolos a reconhecer pertencem à linguagem duma calculadora aritmética simples e são:

Operadores
'+', '-', '/', '*';
Operandos
Números inteiros sem sinal;
Outros
Para agrupamento: '(', ')'.

O teu programa deverá aceitar frases do tipo:

23+(4*76)

e gerar:

INT OP AP INT OP INT FP

O objetivo deste exercício é aprenderes a integrar o código gerado pelo flex numa aplicação em C.

Exercício Nº 9: A Cabine Telefónica

Pretende-se que utilize a ferramenta flex para implementar uma máquina de es- tados que modele a interacção dum utilizador com um telefone numa cabine pública.

O telefone reage aos seguintes comandos:

LEVANTAR
levantar o auscultador; marca o início duma interacção;
POUSAR
pousar o auscultador; fim da interacção; deverá ser indicado o montante a ser devolvido;
MOEDA <lista de valores>
inserção de moedas (só deverá aceitar moedas válidas, para valores inválidos deverá ser gerada uma mensagem de erro): lista de valores = num, num, ..., num;
T=numero
disca o número ( o número deve ter 9 dígitos excepto se for iniciado por "00"); as diferentes chamadas deverão ser tratadas da seguinte maneira:
  • para números iniciados por "601" ou "641" a chamada é "barrada";
  • para chamadas internacionais (iniciadas por "00") o utilizador tem que ter um saldo igual ou superior a 1,5 euros, caso contrário deverá ser avisado que o saldo é insuficiente e a máquina volta ao estado anterior; a chamada se for realizada tem um custo de 1,5 euros;
  • para chamadas nacionais (iniciadas por "2") o saldo mínimo e custo de chamada é de 25 cêntimos;
  • para chamadas verdes (iniciadas por "800") o custo é 0;
  • para chamadas azuis (iniciadas por "808") o custo é de 10 cêntimos.
ABORTAR
interromper a interacção; a máquina devolve as moedas.

Como extra pode ainda detalhar como é que é devolvido o troco: quantas moedas e de que espécie compõem o troco.

A seguir apresenta-se uma possível interacção exemplo.

LEVANTAR 
maq: "Introduza moedas." 
MOEDA 10c, 30c, 50c, 2e. 
maq: "30c - moeda inválida; saldo = 2e60c" 
T=601181818 
maq: "Os números vermelhos estão proibidos!" 
T=253604470 
maq: "saldo = 2e35c" 
POUSAR 
maq: "troco=2e35c; Volte sempre!" 
    ou 
maq: "troco = 1x2e, 1x20c, 1x10c, 1x5c; Volte sempre!"

Exercício Nº 10: O programador da iluminação

Um programador para controlo dum sistema de iluminação de jardim, depois de ligado à corrente, pode ser de novo desligado, ou então aceita dois comandos: manual ou automatico.

Em modo manual pode ser colocado em on (as luzes ficam a partir daí e até novo comando ligadas), ou em off (as luzes são desligadas e assim permanecem).

Em modo automático requer, ainda, mais duas indicações, a hora (0 a 24) a que deve ser ligado e o número de horas que deve permanecer ligado; fica, então, em stand-by até que receba um sinal para acender as luzes, mantendo as luzes acesas até ter recebido um número de impulsos de relógio igual ao número de horas para que foi programado.

Considerando que o sistema a modelar pode ser encarado como uma máquina de Transição de Estados, desenhe o autómato determinista reativo que modela o sistema e utilize a sua imaginação para o implementar em C com a ajuda do Lex.

Exercício Nº 11: O Jogo dos Dardos

Uma das variantes do conhecido jogo das setas (em que se lançam pequenas flechas contra um alvo circular dividido em sectores iguais marcados com pontos de 1 a 20) é designada por jogo dos 36: um jogador ganha quando, ao fim de lançar várias setas, conseguir acumular exactamente 36 pontos; perderá logo que a soma ultrapasse esse valor. Contudo só contam os pontos quando uma seta atingir um dos seguintes sectores: 19, 17, 20, 16, 10, 6, 12; cada vez que uma seta caia noutro sector, com pontos diferentes destes, a jogada não conta, é ignorada.

Pretende-se, então, desenvolver um programa eficiente que vá recebendo os pontos obtidos por um jogador e determine se este deve continuar a jogar, ou se deve parar por já ter ganho, ou por ter perdido. Considerando que o sistema a modelar pode ser encarado como uma Máquina de Transição de Estados, desenhe o autómato determinista reactivo que modela o sistema e implemente-o com a ferramenta flex do Unix.