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:



[1] caráter é o singular de caracteres.