DEP. INFORMÁTICA - UNIVERSIDADE DA BEIRA INTERIOR Eng. Informática Linguagens Formais e Compilação Exame - 2ª chamada 2º Semestre 2h 30min 01/Julho/2010 IMPORTANTE: Apresente todos os cálculos efectuados na resolução das questões. Pergunta A.1 A.2 B.1 B.2 B.3 B.4 C.1 C.2 C.3 C.4 D.1 D.2 D.3 Total Cotação 1,50 0,50 0,75 0,50 0,50 2,00 1,25 1,00 0,75 1,00 2,00 1,25 1,00 14,00 A. LINGUAGENS FORMAIS E AUTÓMATOS FINITOS DETERMINÍSTICOS (AFD) Considere os conjuntos letra = { a, …, z, A, …, Z }, digito = { 0, …, 9 }, traço = '-', virgula = ',' e branco = ' ', e o alfabeto S = letra digito traço virgula branco. 1. Desenhe um AFD (com o mínimo de estados) sobre S que reconheça os 3 tipos de padrões seguintes: - título do livro (sequências de palavras separadas por 1 branco). Ex: Introducao aos Compiladores - mês e ano (data) de edição no formato MM-AA, com mes {1,…,12} e ano {2000,…, 2010}. Ex: 10-05 (Outubro-2005) - preço do livro no formato Ea,b (a – euros, b – cêntimos). Ex: E12,5 (12 euros e 50 cêntimos) 2. Verifique se o AFD construído antes aceita as seguintes sequências de caracteres: - 07-00 - E10.75 Justifique, simulando para cada um dos casos usando sequências de transições de estados do AFD. B. ANÁLISE LÉXICA Seja o AFD sobre o alfabeto S = letra digito, com letra = { a, …, z, A, …, Z } e digito = { 0, …, 9 }. 1. O AFD incompleto apresentado reconhece 3 tipos de padrões. Identifique-os, justificando. Dê um exemplo de cada um dos 3 padrões. 2. Construa a tabela completa das d-transições associada ao AFD apresentado. 3. Verifique se a palavra A23ab2 é reconhecida pelo AFD. Justifique, apresentando todos os passos da simulação (usando a tabela construída em 2 e não o AFD). 4. Implemente um programa em LEX que, dado um texto com caracteres: – determine o número de palavras iniciadas e terminadas por vogais; – substitua as palavras que contém a sub-palavra ao pela palavra SIM, mas apenas quando ao não forma uma palavra isolada; – determine o número de ocorrências da palavra SE apenas quando se encontra inserida no início de uma outra maior; – determine o número de palavras com pelo menos 1 A e no máximo com 3 A's; – determine o número de palavras com exactamente 2 a's não seguidos (aab só conta 1 vez); – determine o número de palavras que correspondem a números positivos maiores do que 9. Nota: palavra define-se como sequência de letras C. ANÁLISE SINTÁTICA DESCENDENTE Dada a gramática G = ( { S, A, B }, { a, b, c, d, e, f }, P, S ), com o seguinte conjunto de produções P: p1) S → S a p2) S → S b p3) S → AB p4) A → c A p5) A → d p6) A → e p7) B → e B p8) B → f p9) B → e 1. Calcule os First’s e os Follow’s de todos os símbolos não-terminais de G. Apresente os cálculos. 2. Determine os Lookahead's de todas as produções e verifique se G é do tipo LL(1). 3. Construa a tabela sintáctica predicativa (Tabela Oráculo), justificando cada elemento da tabela. 4. Verifique, simulando o algoritmo do analisador sintático predicativo não recursivo (ParserLL), se a frase c d f e b a a pertence à linguagem gerada por G. Para tal, use a tabela seguinte: S Topo(Z) S ... S$ ... a dfebaa$ ... a c ... acção ? ... D. ANÁLISE SINTÁTICA ASCENDENTE – PARSER LR Considere a gramática G = ( { S, A, B }, { a, b, c, d }, P, S ), com o seguinte conjunto de produções P: p1) Z → S $ p2) S → A B p3) A → B d A p4) A → a p5) B → c B p6) B → b em que: First(S) = { a, b, c } First(A) = { a, b, c } First(B) = { b, c } Follow(S) = { $ } Follow(A) = { b, c } Follow(B) = { $, d } 1. Construa o Autómato Finito Determinístico LR(1) para a gramática G e verifique se é LR(1). 2. Construa a Tabela Oráculo LR(1) da gramática G, associada ao AFD LR(1) construído antes. 3. Verifique se a frase b d c b d a b pertence à linguagem gerada por G. Justifique, podendo usar a tabela seguinte para simular o comportamento do autómato LR(1): acção M[1,b] = ? ... s ? ... Pilha estados Z 1 ? ... Topo(Z) 1 ? ... a b ? ... a dcbdab$ ? ...