Construção de Compiladores

Primeiro Semestre de 2003

Prof. José de Oliveira Guimarães

 

Terceiro Trabalho.

Prazo de Entrega: 27 de Junho

 

Trabalho em grupos de no máximo duas pessoas.

 

            O objetivo deste trabalho é fazer a parte b) do primeiro trabalho em CUP e JLex. O texto abaixo apenas reproduz o texto do primeiro trabalho modificando os nomes dos comandos: o comando ‘a’ passa a ser “add”, por exemplo.

 

Lembre-se de não cometer mais alguns erros básicos que muitos cometeram no primeiro trabalho.

 

O trabalho consiste em fazer um pequeno compilador para uma linguagem cuja gramática é dada abaixo.

 

Program ::=  Command { Command }

Command ::= SimpleCommand | Repeat

SimpleCommand ::= “add” Character | “backward” Number | “forward” Number | “delete”

Character ::= qualquer caráter
Number ::= qualquer dígito

Repeat ::= “repeat” 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 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

add C

insert(s, pos, ‘C’);

backward n

pos = pos – n;

forward  n

pos = pos + n;

delete

delete(s, pos);

repeat 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.