Esta lista de exercícios visa apoiar os alunos nos estudos para a

Propaganda
Esta lista de exercícios visa apoiar os alunos nos estudos para a NPI,
mas não deve ser utilizada como única fonte de estudos, os alunos
também devem consultar os livros, aulas e exercícios feitos no
decorrer do curso.
1) Descreva com suas palavras a diferença entre palavras-chave e palavras-reservadas de
uma linguagem. Descreva também qual a melhor forma de representá-las: com um só
token ou com tokens diferentes.
2) Qual a diferença de BNF e EBNF? Exemplifique.
3) Para que serve a ferramenta JFlex?
4) O compilador pode ser dividido em duas grandes fases: Análise (análise léxica, sintática
e semântica) e Síntese (Gerador de código intermediário, otimizador de código e
gerador de código). Fale de cada uma das fases, incluindo as suas entradas, saídas e o
que faz cada uma delas (dica: Utilize gráficos para facilitar).
5) Qual a diferença entre um interpretador e um compilador. Lembre de apontar as
vantagens e desvantagens de cada um (dica: Utilize gráficos para facilitar). Cite
exemplos de linguagens compiladas e interpretadas
6) Quais as diferenças, vantagens e desvantagens das linguagens de alto nível e de baixo
nível? (Use exemplos de código para ajudar a explicação)
7) Quais as vantagens e desvantagens de construir o compilador em passos (front-end e
back-end)?
8) Qual a entrada e a saída da análise léxica? Exemplifique.
9) Qual a entrada e a saída da análise sintática? Exemplifique.
10) Como expressões regulares podem ser utilizadas na análise léxica?
11) Dada a especificação de tokens abaixo, mostre ao menos 5 exemplos de frases
reconhecidas por essa especificação.
ABRE_PAR
→(
FECHA_PAR
→)
ATRIB
→=
ADD
→+
MULT
→*
DEF
→ def
ID
→ [_a-z][_a-z0-9]*
NUM_INT
→ [0-9][0-9]*
PT_VG
→;
WHITESPACE → [ \t\n\r]+
12) Dado o autômato abaixo, diga quais são as expressões aceitas pelo mesmo:
13) Defina expressões para expressar:
 Número IP
 Números naturais (e inteiros)
 Números de telefone (com DDD opcional)
 Horas
 E-mails
 URLs
 CPF
14) Criar um NFA para a(b*|c*)
15) Dadas as regras abaixo, determinar a saída para as entradas a seguir:
a
{ return TOKEN_X; }
abb { return TOKEN_Y; }
a*b+ { return TOKEN_Z; }
a)
b)
c)
d)
a
abb
bb
abba
16) Dada a gramática abaixo, realizar a derivação a esquerda e a direita, mostrar as
árvores de derivação geradas, para as entradas a seguir:
expressao = termo {"+" termo}*
termo = "x" | "i"
a)
b)
c)
d)
e)
i
x
i+x
i+x+i
i+i+i+x+x
17) Mostrar se as gramáticas a seguir são ambíguas ou não
18) Qual as diferenças, vantagens e desvantagens de análise sintática bottom-up e topdown? Onde são utilizadas cada uma delas? Exemplifique graficamente cada uma
delas.
19) Realizar a análise bottom-up da seguinte gramática para a cadeia “a + a * a”:
20) A seguinte definição de comando apresenta ambigüidade (por exemplo, em “if (x) if (x)
outro else outro” não temos como saber a que IF o else seta ligado). Como eliminar
essa ambigüidade?
21) Construa uma gramática livre de contexto utilizando EBNF para uma linguagem de
expressões aritméticas de inteiros e identificadores com quatro operadores binários +,
-, *, /. Mostre pelo menos dois exemplos para provar que sua gramática está correta.
22) Faça uma gramática com operadores binários + e * e operador unário prefixado ^ tal
que:

+ seja associativo à direita
 * seja associativo à esquerda
 ^ tenha maior precedência do que +
 + tenha maior precedência do que *
Não é necessário justificar.
23) Dada a gramática abaixo, provar que –(id+id) pertence a gramática
expr → expr op expr
expr → ( expr )
expr → - expr
expr → id
op → +
op → op → *
op → /
op → ^
24) Dada a gramática abaixo, prove que ela é ambígua (Dica: utilize id + id * id)
E → E op E | ( E ) | - E | id
op → + | - | * | /
25) Supondo a gramática G = (Vn , Vt , P, Sentença)
Vn = {SENTENÇA, SN, SV, ARTIGO, VERBO, SUBSTANTIVO, COMPLEMENTO}
Vt = {aluno, o, estudou, compiladores}
Produções :
SENTENÇA SN SV
SN ARTIGO SUBSTANTIVO
SV VERBO COMPLEMENTO
COMPLEMENTO ARTIGO SUBSTANTIVO | SUBSTANTIVO
ARTIGO o
SUBSTANTIVO aluno | compiladores
VERBO estudou
Derivar : “ o aluno estudou compiladores”
26) Seja a gramática abaixo :
<S> é o símbolo inicial
<S> ::= <B>
<B> ::= <C> | <C> + <D>
<C> ::= <D> | <C> * <D> | *<D>
<D> ::= x | (<S>) | - <D>
Gere 10 sentenças para esta gramática.
27) Dada a gramática abaixo, mostrar mais de uma derivação de (a+b)*a, ((a*b)+(a*a)) e
para a+b*a, e suas árvores de derivação:
G = ({E}, {a, b, +, *, (, ) }, P, E)
P : E E * E | E + E | (E) | a | b
28) Dada a gramática abaixo, faça as derivações à esquerda e à direita para obter a
seguinte sentença ((a+b)+b)
E E * T | T
T T + F | F
F a | b | (E)
29) Dada G = ({S}, {a, b}, P, S)
P : SaS | aSb | a
Gere as árvores de derivação para a, aaab, aabb, abb
30) Mostrar os autômatos para as seguintes linguagens
1) w = anbm , n 1 , m 1}
2) (a b)m m 1
31) Para a árvore de derivação a seguir responda:
Qual a sentença representada na árvore ?
32) Construir Autômato Finito que reconheça as sentenças da linguagem L = {a bn c, n ³ 0}
33) Construa o autômato finito equivalente à expressão regular abaixo:
A(a+bc)*b(*a+b)*
34) Dado o exemplo de código abaixo, identifique os seus tokens e como eles seriam
representados no JFlex.
se contador > 10 { exemplo de comentário }
entao escreva (contador)
senao escreva (x);
35) Dada a gramática abaixo, verificar se a cadeia a+b*a pertence a mesma
G= ({E,T,F},{a,b,+,*,(,)},P,E)
P: E E + T | T
T T * F | F
F a | b | (E)
36) Dada a gramática abaixo, Assinale com V as sentenças que podem ser aceitas por essa
gramática e com F as demais
37) Considere o autômato finito seguinte:
(a) O autômato é determinista ou não determinista?
(b) Qual é o seu estado de início? Quais são os estados de aceitação (finais)?
(c) Este autômato aceita a seqüência 110100? Qual a seqüência de estados visitados no
reconhecimento desta String?
(d) Qual é a String menor que o autômato aceita?
(e) Pode indicar a String maior que o autômato aceita?
(f) Por palavras, qual é a linguagem que o autômato aceita?
38) Considere a gramática seguinte: NUMLIT = [0-9]+
IDENT = [a-zA-Z][a-zA-Z0-9]*
BOOLLIT = “true” | “false”
Seq → Comando { “;” Seq }
Comando → “if” Expr “then” Comando [“else” Comando]
| IDENT “:=” Expr
| “{“ Seq “}”
Expr → NUMLINT | BOOLLIT | IDENT
(a) Desenhe a árvore sintáctica concreta para a sequência de código:
y := 0;
if x then y := 1
else {y := 0}
39) Dada a gramática:
NUM = [0-9]+
ID = [A-Za-Z][0-9A-Za-z]*
Expr → Expr “+” Term | Expr “–” Term | Term
Term → Term “*” Factor | Term “/” Factor | Factor
Factor → Primary “^” Factor | Primary
Primary → “-” Primary | Element
Element → “(“ Expr “)” | NUM | ID
Quais as árvores sintácticas para:
(a) 5-2*3
(b) y^3
Download