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, como “Número esperado” ou “Comando inexistente”;
- siga as recomendações do “Guia de Correção de Trabalhos” que está na página do curso;
- todos os trabalhos deverão ser feitos em Java.