Construção de Compiladores

Primeiro Semestre de 2004

Prof. José de Oliveira Guimarães

 

Primeiro Trabalho.

Prazo de Entrega:   8 de Abril para ambas as turmas

 

Trabalho em grupos de 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 ::= MoveCommand | PrintCommand | AddCommand

          | SubCommand | GotoCommand | IfCommand

MoveCommand ::= ‘m’  Id  Number

Id ::= ‘k’ | ‘j’

PrintCommand ::= ‘p’ (Id | Number)

AddCommand ::= ‘a’   Id   Number

SubCommand ::= ‘s’   Id   Number

GotoCommand ::= ‘g’  Number

IfCommand ::= IfOperator  Id Number Command

IfOperator ::= “if<”  |  “if=”  |  “if!”

Number ::= qualquer dígito

 

Esta linguagem é uma pequena linguagem de programação que contém os itens descritos a seguir.

  • Duas variáveis, k e j ;
  •  Um comando de atribuição (MoveCommand), com a seguinte sintaxe:
    m k 0
    zero é atribuído à variável k.
  • Um comando para imprimir uma variável (PrintCommand), com a seguinte sintaxe:
    p k
    A
    variável k é impressa. O equivalente em C é
    printf(“%d\n”, k);
  •  Um comando AddCommand para adicionar um número a uma variável:
    a k 1
    1 é adicionado à
    variável k. O equivalente em C é
    k = k + 1;
  • Um comando SubCommand para subtrair um número de uma variável:
    s j 5
    5 é subtraído de j. O equivalente
    em C é
    j = j – 5;
  • Um comando goto (GotoCommand) que desvia o fluxo de execução para certa instrução:
    g 5
    O
    fluxo de execução passa para a instrução número 5. O equivalente em C seria
    goto L5;
    onde L5 seria um label colocado antes da quinta instrução. A numeração de instruções começa com 1.
  • Um commando If (IfCommand) que faz uma comparação e executa um comando se a comparação for verdadeira:
    if<  j  5  g 2
    Se j < 5, executa “g 2”,
    que é um goto para o comando 2. O equivalente em C é
    if ( j < 5 )
    goto L2;
    if!   j 3  m j 2
    Se j != 3, atribui o
    número 2 à variável j. O equivalente em C é
    if ( j != 3 ) j = 2;
    if=  k  1  s  k   1
    Se k == 1, k é subtraído de 1. O equivalente
    em C é
    if ( k == 1 ) k = k - 1;

            Um exemplo de programa nesta linguagem é :

 

m k 0

p k

a k 1

if< k 9 g 2

 

Este programa imprime os números de 0 a 8 na saída padrão. O equivalente em C é:

 

#include <stdio.h>

void main() {

   int k, j;

   L1:  k = 0;

   L2:  printf(“%d\n”, k);

   L3: k = k + 1;

   L4: if ( k < 9 ) goto L2;

}

           

Faça os seguintes programas em Java 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.

 

Observações:

  • entregue o código em papel. Indique no início de cada um dos dois programas a qual letra ele pertence;
  • entregue a folha de capa disponível na página de trabalhos. Entregue apenas uma folha de capa para todos os itens a) e b). É imprescindível a entrega da folha de capa, sem a qual nenhum trabalho será aceito;
  • as mensagem de erro devem indicar exatamente o erro, comoNúmero esperado” ouComando inexistente”;
  • siga as recomendações do “Guia de Correção de Trabalhosque está na página do curso;
  • todos os trabalhos deverão ser feitos em Java.