Folha 3 Análise léxica 1. Escrever um programa em FLEX que permite contar o número de ocorrências de uma cadeia de caracteres contida num ficheiro de texto. 2. Escrever um programa em FLEX que permite substituir uma cadeia de caracteres por outra contidas num ficheiro de texto. 3. Escrever um programa em FLEX que dado um ficheiro de texto, mostre: o número de algarismos; o número de vogais do alfabeto; o número de consoantes do alfabeto; o número de linha de texto; o número de espaços ou tabulações (\t); o número de caracteres não identificados nos pontos anteriores. 4. Escrever um programa em FLEX para identificar números naturais contidos num texto. Exemplo: Entrada: 123 abc 12.45 s 245 xyz xyz 2 abc 45 cc Saída: 123 12 45 245 2 45 5. Escrever um programa em FLEX que permite contabilizar os números inteiros com 1 algarismo, com 2 algarismos e com 3 ou mais algarismos, contidos num ficheiro de texto. 6. Escrever um programa em FLEX que permite identificar números inteiros (com ou sem sinal) contidos num ficheiro de texto. 7. Escrever um programa em FLEX que permite identificar números com parte decimal (com ou sem sinal) contidos num ficheiro de texto. 8. Escreva um programa FLEX que copie um ficheiro, substituindo cada sequência não nula de espaços em branco por um único espaço. 9. Escreva um programa FLEX que copie um ficheiro, substituindo cada sequência não nula de digítos (número) pela palavra NÚMERO. 10. Escreva um programa FLEX que copie um programa em C, substituindo todas as instâncias de FLOAT por REAL.
2 11. Escrever um programa em FLEX que construa dois vectores com os números inteiros e com os números reais contidos num ficheiro de texto. No final, deve mostrar estes vectores. 12. Implementar um programa em FLEX que elimine de um programa em C todos os comentários e caracteres de espaço. 13. Escreva expressões regulares para as seguintes linguagens e implemente autómatos finitos em C e em Lex para as mesmas: a) palavras com V = { a, b, c } em que o primeiro a precede o primeiro b. b) palavras com V = {a, b, c} com n umero par de a s. c) números binários múltiplos de 4. d) números binários maiores que 101001. e) palavras em V = { a, b, c } que não contêm a substring baa. 14. Para as seguintes expressões regulares, implemente em C e em Lex um autómato finito determinístico que as reconheça: if then else [az][az09]* [09]+ ( [az]* \n ) ( \n \t ) 15. Considere os seguintes tokens e as respetivas expressões regulares t1 aa* t2 c(a+b)* t3 ab*c t4 caa* t5 b*aa*(c+b) t6 aab*a t7 (a+c)*abb(c+b)* t8 a*bc* t9 (a+(bc)*d) + t10 (a+(bc)*b) + a) Construa um autómato finito determinista para reconhecer cada token. b) Codifique em C e em FLEX o reconhecedor de cada token. 16. Considere a seguinte especificação para nomes de objetos numa linguagem: [ <class>: ] [ // <address>/ ] <path> A notação deve ser interpretada da seguinte forma: os parênteses retos [ ] delimitam partes opcionais de um nome; os caracteres < > delimitam os seguintes padrões: (i) <class> é um identificador; (ii) <address> é uma lista de identificadores separados por. ; (iii)<path> é uma lista de identificadores separados por /. um identificador é uma sequência de uma ou mais letras e dígitos, iniciada por uma letra. a) Construa um programa em FLEX para reconhecer cada um daqueles padrões. b) Construa um AFD e programeo em C para reconhecer cada um daqueles padrões. c) Construa um programa em FLEX para reconhecer todos os nomes de objetos da linguagem. d) Construa um AFD e programeo em C para reconhecer todos os nomes de objetos da linguagem. Folha prática 3 Análise léxica
3 17. Considere a seguinte especificação dos tokens de L, definidos de acordo com as seguintes regras: os números podem ser escritos na base 2 (i.e., com o alfabeto {0, 1}), na base 8 (i.e., com o alfabeto {0,, 7}) e na base 10 (i.e., com o alfabeto {0,, 9}); os identificadores são escritos como sequências de dígitos decimais e de caracteres (letras, _, $, %) que começam por uma letra e não terminam com os caracteres _, $ e %; os comentários são sequências de caracteres (letras, _, $, %) entre /* e */; os números reais (e.g., 5, 4E5, 3.8, 29.6E15, 7E3), são representados por ponto flutuante, com um ponto decimal antecedido e precedido por uma sequência de um ou mais dígitos, e o expoente com o máximo de 2 dígitos, sendo o primeiro dígito diferente de 0. Não se consideram os 0 s não significativos à esquerda e à direita do ponto decimal. a) Construa um programa em FLEX para reconhecer os tokens de L. b) Construa um AFD e programeo em C para reconhecer os tokens de L. 18. Considere uma linguagem de programação, de nome Graphics, que permite desenhar polígonos a partir de instruções. Um ponto é representado por ( number, number ), onde number denota um número inteiro maior ou igual a 0. Uma instrução é uma sequencia de pontos separados por ; que começa por POLY e termina com END. Um programa é uma sequência de instruções. Um exemplo de um programa para desenhar o polígono é dado pela instrução POLY (10,40) ; (50,90) ; (40,45) ; (50,0) END. a) Identifique os tokens da linguagem Graphics. b) Construa um programa em FLEX para reconhecer os tokens da linguagem. c) Construa um AFD e programeo em C para reconhecer os tokens da linguagem. 19. Faça um analisador léxico que extrai de um documento de texto todos os endereços de email contidos. Assuma que os caracteres não permitidos num endereço de email são \t, \n, {, }, espaço, ponto e vírgula, vírgula e aspas. Lembrese também que não pode haver dois @ nem dois pontos seguidos. Este analisador deve apenas produzir a lista de endereços, separados de vírgula e espaço. Ou seja, prontos para serem copiados diretamente para um cliente de email. Por exemplo, o texto: O endereço do João Fonseca é jfonseca@gmail.com e o do Carlos Meireles é meiras@hotmail.com. Para os outros, estão na lista abaixo: mariliaf@student.deeei.uq.tp; mfon{s}@kkks.us gilaroi@yaaahooo.com; gil eanes@grlah.jh daria o seguinte resultado: jfonseca@gmail.com, meiras@hotmail.com, mariliaf@student.deeei.uq.tp, gilaroi@yaaahooo.com, eanes@grlah.jh Folha prática 3 Análise léxica
4 20. Considere a seguinte especificação de um tipo de documentos XML <!ELEMENT id (expr)> A notação deve ser interpretada da seguinte forma: id é uma sequência de uma ou mais letras (maiúsculas ou minúsculas), dígitos e os caracteres _, e :, não podendo começar por um dígito ou :. expr é uma sequencia sobre o alfabeto {#PCDATA,,, *,?} que: começa por #PCDATA, tem, ou entre dois #PCDATA s, podendo ainda cada #PCDATA ser seguido por * ou por?. a) Construa um programa em FLEX para reconhecer este tipo de documentos. b) Construa um AFD e programeo em C para reconhecer este tipo de documentos. 21. Considere a seguinte tabela de tradução de padrões de expressões regulares para tokens Expressão regular Token Valor de atributo ws if then else id num < <= = <> > >= if then else id num apontador para entrada da tabela apontador para entrada da tabela LT LE EQ NE GT GE a) Construa um programa em FLEX para reconhecer os tokens da tabela anterior. b) Construa um AFD e programeo em C para reconhecer os tokens da tabela anterior. 22. Implementar um préprocessador de C, que expanda macros definidas por #define, ficheiros incluídos com #include e elimine os comentários. 23. Implementar um analisador léxico para um subconjunto da linguagem C, com os construtores usuais: for while break if then else... e a pontuação usual:, : ; ( ) { } [ ] < > <= >= ==!=... Teste o analisador obtido com programas em C. Folha prática 3 Análise léxica
5 24. Dado um ficheiro.srt (de legendas de filmes), fazer um analisador léxico para adiantar/atrasar essas legendas de acordo com um valor de x segundos e programálo em C e FLEX. Exemplo do formato de um ficheiro.srt: 1 00:00:45,000 > 00:00:50,400 Hello 2 00:00:50,300 > 00:00:53,200 Goodbye Neste exemplo serão geradas duas legendas. A primeira, será apresentada no filme aos 45 segundos durante cerca de 5,400 segundos. A segunda, será apresentada no filme aos 50,300 segundos durante cerca de 2,900 segundos. 25. Faça um analisador léxico que transforme, no texto de input, todas as minúsculas em maiúsculas (e mantenha tudo o resto igual) e programeo em C e FLEX. 26. Faça um analisador léxico que transforme, no texto de input, todas as palavras iniciadas com uma letra maiúscula (e mantenha tudo o resto igual) e programeo em C e FLEX. 27. Implemente em FLEX e C um analisador léxico para reconhecer números inteiros e reais escritos em qualquer representação (científica, sinal, etc). Exemplos: 1 ; 1.0 ; 1 ; 1.0 ; 1.99 ; 0.99 ; 1.0E05 ; 0.99E05... 28. Implemente em FLEX e C um analisador léxico para reconhecer números de telefone, indicado para cada um deles a rede a que pertence, segundo a seguinte tabela: Rede Indicativo VODAFONE 91 NOWO 92 NOS 93 MEO 96 FIXA (Lisboa) 21 FIXA (Porto) 22 FIXA (Ilhas) 29 FIXA (outros) 2[38] Teste usando o ficheiro NumerosTelefone.txt que se encontra na página da disciplina. Folha prática 3 Análise léxica