Você está na página 1de 4

Pontifcia Universidade Catlica de Minas Gerais

ICEI - Departamento de Cincia da Computao


Disciplina: Compiladores
Prof. Alexei Machado

Lista de Exerccios No. 1

1. Dada a gramtica abaixo, d as derivaes mais a esquerda e rvores de derivao dos strings aabbba e
abbbaa.

S ASB |
A aAb |
B bBa | ba

2. Dada a gramtica abaixo, d as derivaes mais a esquerda e rvores de derivao dos strings aacacaacb
e aacb.

S aA | c
A acA | b | S

3. Dada a gramtica abaixo, escreva seu grafo mais a esquerda para verificar se os strings aabcc e abbacc
pertencem linguagem.

S aS | A
A bA | B
B cB | c

4. Para cada gramtica abaixo, gere outra gramtica equivalente sem recurso direta esquerda e fatorada:

a) S abA | acS
A Ac | b

b) S C | A
A AaB | Aac | B | a
B Bb | Cb
C cC | c

c) S AS | A
A id := E
E E+num | E + id | id | num

5. Para cada a gramtica abaixo, implemente um parser descendente predizvel para a linguagem, se
possvel:

a) S aAb | b
A aA | B
B bB |

b) S SaSb | SbSa |

c) S IF
I 1I | 0I |
F .D |
D 1D | 0D | E
E 1 | 0
Pontifcia Universidade Catlica de Minas Gerais
ICEI - Departamento de Cincia da Computao
Disciplina: Compiladores
Prof. Alexei Machado

d) S bcA | bcd | Ba | d
A Ab | Ac | d
B bc

6. Considere o comando de concatenao de arquivos CONCAT, cuja sintaxe :

CONCAT arq1 + arq2 + . . . + arqn > arqd

onde arq1 ... arqn e arqd so representados pela expresso regular (id: )( \(id\)*)id(.id ),
sendo id um token da linguagem com padro de formao l(ld)*. A lista de arquivos de origem precisa
conter pelo menos um arquivo.

a) Indique qual o alfabeto da linguagem e o padro de formao dos lexemas


b) Escreva o analisador lxico para o problema.
c) Escreva uma gramtica livre de contexto adequada ao parsing descendente predizvel para o
comando.
d) Implemente o parser correspondente.
e) Escreva uma gramtica com expresses regulares adequada ao parsing descendente predizvel para o
comando.
f) Implemente o parser correspondente.

7. Considere um subconjunto da linguagem C++ que trata da declarao de classes. A declarao de uma
classe tem a seguinte forma:

class nome base { membros };

onde class uma palavra reservada, nome o identificador da classe, base uma lista opcional de classes
para definio de herana e membros uma seqncia de zero ou mais declaraes de atributos e mtodos da
classe. Existindo herana, base tem a seguinte estrutura:

: acesso classe_1, acesso classe_2, ... , acesso classe_n

onde acesso pode assumir os valores private, protected ou public, que so palavras reservadas da
linguagem, e classe_1... classe_n so identificadores de classes. As formas de acesso tambm so opcionais
(o default private).

Membros de classe podem ser declaraes de atributos, cuja sintaxe idntica utilizada para declarao de
variveis (considere apenas os tipos int e float sem inicializao), ou declaraes de mtodos da forma:

retorno nome( lista_parmetros );

onde retorno pode assumir as palavras reservadas void, int ou float, nome um identificador e
lista_parmetros uma seqncia de zero ou mais parmetros separados por vrgulas, cujo tipo deve ser
indicado mas seu identificador opcional. Considere apenas os tipos int e float. Dois mtodos tm sintaxe
especial: o construtor da classe no possui retorno e o destrutor no possui nem retorno nem parmetros, alm
de ter o smbolo ~ antes do identificador, o qual deve ser igual ao nome da classe.
As declaraes de membros podem ser precedidas de indicao de acesso:

acesso:

onde acesso assume os valores private, protected ou public. Identificadores podem ser formados de letras,
dgitos e sublinhado, devendo comear com letra ou sublinhado. O sublinhado sozinho no ser considerado
vlido. Comentrios so delimitados por /* */ ou comeam com // e terminam com a quebra de linha.
Pontifcia Universidade Catlica de Minas Gerais
ICEI - Departamento de Cincia da Computao
Disciplina: Compiladores
Prof. Alexei Machado

Exemplo:

Class X : A, public B
{
int a;
float b,c;
float area(float lado, int);
public:
~X(); // destrutor
X(float, int); /* construtor */
};

a) Defina o alfabeto para o subconjunto da linguagem e fornea o padro de formao dos lexemas.
b) Escreva um AFD que represente o analisador lxico para a linguagem.
c) Escreva uma gramtica LL(1) para a linguagem.
d) Implemente o parser correspondente

8. O UNIX um dos sistemas operacionais mais utilizados no mundo. Uma de suas interfaces, o C shell,
constitui uma poderosa linguagem de programao. A linguagem na qual se baseia esta questo foi
inspirada no C shell. Declaraes e comandos podem aparecer em qualquer parte do programa, cada um
terminado por uma quebra de linha. Se um comando precisar ser continuado em outra linha, deve-se
utilizar a barra invertida para indicar que o comando no acabou. Comentrios so iniciados por # e
terminam com a quebra de linha. Identificadores so constitudos por letras, dgitos e sublinhado, no
podem comear com dgitos e devem ter pelo menos uma letra ou um dgito. Nmeros reais usam o ponto
decimal, podem comear com o ponto mas precisam ter parte fracionria. A seguir descrita a sintaxe
para declaraes de inteiros e reais, comandos de atribuio e estruturas de teste:

Declaraes: So da forma set id=num onde id um identificador de varivel e num uma constante
inteira ou real.
Atribuies: So da forma @id=exp onde exp uma expresso.
Expresses: So formadas com operadores +, -, * e / , respeitando-se a precedncia, nmeros e
contedos de identificadores. Para se ter acesso ao contedo de um identificador, deve-se anexar o
smbolo $ antes dele. Parnteses so permitidos.
Testes: So da forma if (exp R exp) comando onde R um relacional (<, >, ==) e comando um
comando nico da linguagem. Se o teste possuir a parte do seno, dever vir na prxima linha com a
sintaxe else comandos endif onde comandos uma seqncia de um ou mais comandos, cada um em
uma linha. Se a parte do ento contiver mais de um comando, dever seguir a seguinte sintaxe:
if (exp R exp) then . Os comandos vm a partir da prxima linha e a seqncia termina com a palavra
reservada endif ou o else se houver a parte do seno.

Exemplo:

########################### Este e' um script


set i=0 # declara e inicializa
@i = $i+3*2 # soma 6 ao conteudo de i
set \
j=5.0 # declara j em duas linhas
if ($i>0) @i=2 # teste se entao unico
if ($i==2) @j=1.0
else @j=2.0
endif # teste se entao senao unico
if ($j>1.0) then
set k=0
Pontifcia Universidade Catlica de Minas Gerais
ICEI - Departamento de Cincia da Computao
Disciplina: Compiladores
Prof. Alexei Machado

@i=2*(1+$j)
else @i=1
endif # entao multiplo
if ($j>0) if ($i>1) then # ifs aninhados
@i=1
@j=1
endif

a) Defina o alfabeto para o subconjunto da linguagem e fornea o padro de formao dos lexemas.
Maisculas e minsculas so diferenciadas.
b) Escreva um AFD que represente o analisador lxico para a linguagem.
c) Escreva uma gramtica LL(1) para a linguagem.
d) Implemente o parser completo, baseado na gramtica do item anterior.