Prova de: Compiladores Docente: Reginaldo A. Gotardo Série: 7º Semestre Curricular Prova 1º Bimestre - 1º Semestre 2007 Nome do aluno:
Duração: 90 min Turma: CCP N7 Período: Noturno Data: 11/04/2008 Nota
Nº de matrícula: Instruções para realização da prova: 1 - Leia atentamente os enunciados da prova 2 - As questões podem ser respondidas a lápis ou a tinta 3 - O valor total t otal da prova é de 7 pontos 3 - Cada questão vale um ponto, pon to, desta forma, é necessário resolver apenas 7 das 8 questões 4 - Caso o aluno resolva as 8 questões, aquela com menor nota será descartada
Questões: Exercício 1 - Liste as fases e componentes de um compilador e descreva brevemente suas funcionalidades e atividades.
Fases: Análise: Léxica – identificação de lexemas ou tokens. Sintática – Verificação da estrutura gramatical. Semântica – Verificação do significado do código (necessária, pois usamos uma gramática Livre de Contexto ao invés de uma sensível ao contexto) Síntese: Geração de Código Intermediário – Geração de código num formato de expressões. Geração de Código – Geração de código Objeto Otimização – Eliminação de Redundâncias, melhorias em expressões, ... Módulos Auxiliares: Tabela de Símbolos – Auxílio na construção do código com identificadores. Tabela de Palavras Reservadas – Usada no Léxico. Controlador de Erros – Auxílio ao Usuário e Recuperação.
Exercício 2 - Sendo, G1=({S,B,C} , {a,b,c} , P , S) P={ 1. S -> aSBC 2. S -> aBC 3. CB -> BC 4. aB -> ab 5. bB -> bb 6. bC -> bc 7. cC -> cc } Qual é a linguagem gerada por G1, ou seja, L(G1)? Mostre, a partir dos números indicados em P, quais as regras de produção utilizadas para chegar à sua resposta.
Exercício 3 - Construir autômatos para se reconhecer: reconhecer: a) a) Números inteiros com e sem sinal: 5, -1, 100
b) Números reais: 3.11, 0.1
c) Literais que se iniciam e terminam por aspas simples e podem contem aspas simples em seu interior, denotados por duas aspas seguidas.
d) Comentários que se iniciam pelo símbolo s ímbolo { e terminam com o símbolo }
Exercício 4 - Faça as modificações necessárias na gramática abaixo para que ela se torne LL(1). A->Ac | Aad | bc | bac | lambda
O primeiro passo é eliminar a recursão à esquerda usando a regra de substituição substituição Logo para: A-> Ac | bc Temos 1) A -> bcA’ A’ ->cA’ | Para a regra A->Aad | bac Temos 2) A -> bacA’ A’ ->adA’ | Usamos A’ novamente, pois nas regras r egras originais temos o mesmo A. Por fim, temos então A-> bcA’ | bacA’ A’->adA’| cA’ | O segundo passo agora é a fatoração, pois, para a gramática ser usada na análise preditiva, toda regra precisa ter conjunto primeiro disjunto em relação às opções de escolha. Logo, devemos fatorar a primeira regra, com A e eliminas as duas possibilidades de “b”, assim: A-> bX X -> cA’ | acA’ As regras ficam assim: A-> bX X -> cA’ | acA’ A’->adA’| cA’ |
Exercício 5 – Considere a Gramática G2 Abaixo: G2 = {{S,A,B}, {a,b,c,d}, S, P} P: S → A A → a | aB B → bB | cB | d ... e a sentença abcd, qual é a análise segundo o método de Análise Sintática Descendente com Retrocesso? Obs.: Para cada nova derivação desenhe uma nova árvore, de modo que fique clara a progressão de derivações.
Exercício 6 – Considere a Gramática G3 Abaixo: G3 = {{S,A,B}, {0,1,2}, S, P} P: S → 0A | 1B A → 1B | 2 B → 0A | 2 ... e a sentença 01012, qual é a análise segundo o método de Análise Sintática Descendente Preditiva Não-Recursiva? Não-Recursiva? Obs.: Crie e apresente a criação da Tabela Sintática, apresente a evolução da pilha, da leitura da cadeia e da aplicação das regras. Solução:
Tabela Sintática 0 S->0A
S A B
1 S->1B A->1B
B->0A
2
$
A->2 B->2
Análise: Passo 1 2 3 4 5 6 7 8 9 10 11
Pilha $S $A0 $A $B1 $B $A0 $A $B1 $B $2 $
Cadeia 01012$ 01012$ 1012$ 1012$ 012$ 012$ 12$ 12$ 2$ 2$ $
Regra S->0A ---------------- A->1B ---------------- B->0A ---------------- A->1B ---------------- B->2 ---------------- Cadeia Aceita!
Exercício 7 - Calcule os conjuntos FIRST e FOLLOW para os itens a seguir: a) G4 = ({S,B,C}, {a,b,c,d,e}, S, P) P: S -> a S e | B B -> b B e | C C -> c C e | d
Solução: First(S) = {a} U First(B) = {a, b, c, d} First(B) = {b} U First(C) = {b, c, d} First(C) = {c, d} Follow(S) = {e} U $ = {e, $} Follow(B) = {e} U Follow(S) = {e, $} Follow(C) = {e} U Follow(B) = {e, $} Obs.: por definição, Follow para símbolo inicial da gramática contém $. b) G5 = ({S,A,B,C,D}, {a,b,c,d}, S, P) P: S->ABCD A->ε A->aA B->ε B->Bb C->c C->AB D->d
First(S) = First(A) U First(B) U First(C) U First(D) - ε = {a, b, c, d} // vazio não, pois First de D não contém ε First(A) = {a, ε} First(B) = {b, ε } First(C) = {c} U First(A) U First(B) = {a, b, c, ε} First(D) = {d} Follow(S) = {$} Follow(A) = First(B) U Follow(B) U Follow(C) = {a, b, c, d} //First B contém ε então en tão calcula Follow B. No cálculo deste deve-se d eve-se calcular Follow C. Follow(B) = {b} U Follow(B) U First(C) U Follow(C)= {a, b, c, d} // como First(C) contém ε então inclui-se Follow(C) Follow(C) = First(D) = {d} Follow(D) = Follow(S) = {$}
Exercícios 8 - Simule a saída da análise léxica para o programa abaixo. Para cada saída, imprima a cadeia reconhecida e o tipo de token detectado. O tipo pode ser representado através de números (indique uma tabela separada com os números) ou através enumeradores. enumeradores. program ProvaDeCompiladores ProvaDeCompiladores var a, b: integer; var c: real begin read(a,b); c:=5; while a
program ProvaDeCompiladores var a , b : integer ; var c : real begin read ( a , b ) ; c := 5 ; while a
Palavra Reservada Identificador Palavra Reservada Identificador Símbolo Identificador Símbolo Palavra Reservada Símbolo Palavra Reservada Identificador Símbolo Palavra Reservada Palavra Reservada Palavra Reservada Símbolo Identificador Símbolo Identificador Símbolo Símbolo Identificador Símbolo Número Símbolo Palavra Reservada Identificador
< b do a := a + 1 ; c := c * a $ write ( c @ ) end .
Símbolo Identificador Palavra Reservada Identificador Símbolo Identificador Símbolo Número Símbolo Identificador Símbolo Identificador Símbolo Identificador Símbolo Palavra Reservada Símbolo Identificador Erro
Símbolo Palavra Reservada Símbolo Boa Prova!