Escolar Documentos
Profissional Documentos
Cultura Documentos
Carlos E - Compiladores Ex 1 e 2
Carlos E - Compiladores Ex 1 e 2
Exercício 1.1.4: Um compilador que traduz uma linguagem de alto nível para outra
linguagem de alto nível é chamada de tradutor fonte a fonte. Quais são as
vantagens de usar C como uma linguagem de destino para um compilador? R.: A
linguagem C é usada ainda por muitos profissionais e por estudantes que estão
começando na programação pelo fato de sua portabilidade, eficiência, recursos e
muitas coisas da área da computação tem o C como código base. Essas são as
prováveis vantagens.
Exercício 1.1.5: Descreva algumas das tarefas que um montador precisa executar.
R.: O montador faz: tradução de símbolos, endereços e variáveis, faça a detecção
de erros e faz tarefas para organizar e gerar o código executável.
Exercício 1.3.1: Indique qual R.:
dos seguintes termos: a) a) imperativo -> (1) C, (2) C++
imperativo b) declarativa -> (3) Cobol
b) declarativa aplicam-se a qual dos
c) Von Neumann seguintes idiomas: (1) C
d) orientado a objetos (2) C++
e) funcional (3) Cobol
f) terceira geração (4) Fortran
g) quarta geração (5) Java
h) script (6) Lisp
(7) ML
(8) Perl
(9) Python
(10) VB.
c) Von Neumann -> (1) C, (2) C++, (5) Java
d) orientado a objetos -> (2) C++, (5) Java
e) funcional -> (6) Lisp
f) terceira geração -> (1) C, (2) C++, (5) Java
g) quarta geração -> (5) Java
h) script -> (9) Python
R.:
b= (x+1)
c= (x+1)
a) Mostre como a string aa+a* pode ser gerada por essa gramática.
R.:
S -> SS | aS+ | aaS+S+ | aa+aS+S+ | aa+a* | aa+a*
S
/|\
a S
/|\
S +
/|\
aS
|\
S *
/|\
a S
|\
S
|
a
Exercício 2.2.3: Quais das gramáticas do Exercício 2.2.2 são ambíguas? R.:
B, E
Exercício 2.2.4: Construa gramáticas livres de contexto não ambíguas para cada
uma das seguintes linguagens. Em cada caso, mostre que sua gramática está
correta.
Exercício 2.2.5:
a) Mostre que todas as cadeias binárias geradas pela seguinte gramática têm
valores divisíveis por 3. Dica. Use indução no número de nós em uma árvore de
análise.
Exercício 2.2.6: Construa uma gramática livre de contexto para numerais romanos.
S -> CM | M -> C | D | L | IV
-> C | D | L | IV
-> M | D | L | IV
-> M | CM | L | IV
-> M | C | C | IV
-> M | C | M | IV
-> M | C | M | IV
-> M | C | M | IV
Árvore Sintática:
E
/\
9 E
/\
- T
/\
T F
/\
5 *
|
2
Tradução Prefixada: - 9 * 5 2
Exercício 2.3.2: Construa um esquema de tradução dirigida pela sintaxe que traduza
expressões aritméticas da notação pós-fixada para a notação infixa. Dê árvores
sintáticas anotadas para as entradas 95-2* e 952*-.
Árvore Pós-fixa:
95 2 * -
Tradução Infixa: (9 - 5) * 2
Árvore Pós-fixa:
952*-*+
Exercício 2.3.3: Construa um esquema de tradução dirigida pela sintaxe que traduza
inteiros em algarismos romanos.
S
|
INT
/|\
D D D D
| | | |
2 0 2 1
Exercício 2.3.4: Construa um esquema de tradução dirigida pela sintaxe que traduza
algarismos romanos em números inteiros.
S
|
ROMANO
|
"X"
Exercício 2.3.5: Construa um esquema de tradução dirigida pela sintaxe que traduz
expressões aritméticas pós-fixadas em expressões aritméticas infixas equivalentes.
23 5 + 7*
S
|
EXPRESSAO
| | |
OPERANDO OPERADOR OPERANDO
| | |
NUMERO + OPERANDO
| | |
23 OPERANDO
| | |
NUMERO *
| |
5 7
a) S
|
a a)
S
/|\
+SS
||
a-
/\
aS
b) S
|
()
/ \
S S
| |
() ε /
\ε ε
c) S
/\
0 S
/\
0 S
/\
0 S
/\
0 1
|
1
if (peek == '/') {
peek = (char) System.in.read();
if (peek == '/') {
// É um comentário do tipo //, então leia até o final da linha
while (peek != '\n' && peek != -1) {
peek = (char) System.in.read();
}
// Continue a leitura após o comentário
return scan();
} else {
// Não era um comentário, apenas o caractere '/'
return new Token('/');
}
}
if (peek == '/') {
peek = (char) System.in.read();
if (peek == '/') {
// É um comentário do tipo //, então leia até o final da linha
while (peek != '\n' && peek != -1) {
peek = (char) System.in.read();
}
// Continue a leitura após o comentário
return scan();
} else if (peek == '*') {
// É um comentário do tipo /* */, então leia até encontrar */
peek = (char) System.in.read();
while (true) {
if (peek == '*') {
peek = (char) System.in.read();
if (peek == '/') {
// Fim do comentário /* */
peek = ' ';
return scan();
}
} else {
peek = (char) System.in.read();
}
if (peek == -1) {
// Fim do arquivo, comentário não fechado
return new Token(Tag.INVALID, "Comentário não fechado");
}
}
} else {
// Não era um comentário, apenas o caractere '/'
return new Token('/');
}
}
while (Character.isDigit(peek)) {
numLexeme.append(peek);
peek = (char) System.in.read();
}
if (peek == '.') {
numLexeme.append(peek);
peek = (char) System.in.read();