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 : SaS | 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