Construção
de Compiladores
Primeiro
Semestre de 2003
Prof.
José de Oliveira Guimarães
Primeiro
Trabalho.
Prazo de Entrega:
17 de Abril para ambas as turmas
Trabalho
em no máximo duas pessoas.
O trabalho
consiste em fazer um pequeno compilador para uma linguagem cuja gramática é
dada abaixo.
Program
::= Command { Command
}
Command
::= SimpleCommand | Repeat
SimpleCommand ::= 'a'
Character | 'b' Number | 'f' Number | 'd'
Character ::=
qualquer caráter
Number ::= qualquer dígito
Repeat ::= ‘r’
Number SimpleCommand
Um programa é uma seqüência de um ou mais comandos.
Cada comando modifica a entrada do programa, que é uma string inicialmente
vazia. Há um cursor que “aponta” para o caráter[1]
corrente da string. O comando ‘a’ adiciona um caráter na posição corrente do
cursor. O comando ‘b’ retrocede o cursor de um número de posições dado pelo seu
argumento. Isto é,
b 3
retrocede o cursor 3 posições. ‘f’avança o
cursor. O comando ‘d’ deleta o caráter corrente. O comando ‘r’ repete um
comando um certo número de vezes. Assim, “r 5 a !”
insere cinco “!” na string. Naturalmente, muitos erros de execução podem
acontecer durante a execução de um programa, mas não se preocupe com eles.
Um
exemplo de programa seria
a U a
S a C
a a a r b 4
a F f 4
r 3 a *
que produziria, depois de executado, “UFSCar***”
Faça os seguintes programas usando a gramática
dada acima:
a) O analisador sintático mais a geração de
código em C. Coloque a geração no próprio analisador sintático;
b) O analisador sintático mais a construção da
ASA. Coloque a geração de código em métodos da ASA
Em ambos os casos,
gere código para a saída padrão.
Deve
ser gerado código em C para o programa. O código a ser gerado para cada um dos
comandos é dado pela tabela abaixo.
Comando |
Código em C |
a C |
insert(s, pos, ‘C’); |
b n |
pos = pos – n; |
f n |
pos = pos + n; |
d |
delete(s, pos); |
r n cmd |
{ int i;
for (i = 0; i < n; i++)
código para cmd; } |
Deve ser sempre gerado o seguinte código:
#include <trab1.h>
#define MaxCh
511
void main() {
char
s[MaxCh + 1] = “”;
int
pos = 0;
/*
coloque o código que você gera aqui */
}
Assuma que
as funções utilizadas na geração de código já foram declaradas em “trab1.h”.
Obs: