Você está na página 1de 7

UFPI CCN DIE

Curso: Cincia da Computao


Disciplina: Construo de Compiladores

Perodo: 2010-1

Prof. Dr. Raimundo Moura

O projeto
Desenvolver um compilador de um subconjunto bsico da linguagem PORTUGOL.

Composio
O projeto est dividido em duas partes e as entregas devero seguir o calendrio
disponvel no site da disciplina.
Primeira parte: anlise sinttica (+ lxica) e semntica;
Segunda parte: gerao de cdigo.

Linguagem utilizada
A linguagem adotada para a implementao do compilador fica a critrio da equipe,
podendo ser Java, Rubi, Python, C# ou C/C++. Outras opes de linguagem devem ser
discutidas com o professor da disciplina.

Linguagem fonte
A linguagem fonte do projeto ser o PORTUGOL Simplificado, que apresenta diversas
limitaes e possui somente fins acadmicos.
PORTUGOL Simplificado ser especificada informalmente neste documento. O
primeiro desafio do projeto transformar esta especificao em uma especificao
formal, atravs de uma gramtica livre de contexto (GLC).

Linguagem alvo
O compilador dever traduzir programas escritos em PORTUGOL Simplificado para
linguagem de mquina, usando como linguagem intermediria: cdigo executvel da
mquina virtual Java (JVM);

Ferramentas
Para o desenvolvimento do projeto, ferramentas como o ANTLR, Flex/Bison e
Lex/Yacc podem ser utilizadas para a gerao automtica de scanners e parsers.
Para a gerao do cdigo de mquina, dever ser usado JASMIN tradutor de linguagem
intermediria para bytecode java.

PORTUGOL Simplificado
PORTUGOL Simplificado insensvel em relao a letras maisculas e minsculas nos
nomes das variveis, funes, procedimentos e palavras reservadas. (i.e. pode-se utilizar
variable ou VARIABLE ou VaRiAbLe para a varivel/funo/procedimento
variable).
A linguagem no deve suportar declaraes aninhadas de funes ou procedimentos,
mas pode conter vrias chamadas a funes/procedimentos aninhadas. A linguagem
possui funes built-in, utilizadas para realizar IO (ESCREVA e LEIA) de usurio
atravs do console, que sero a nica forma de se comunicar com o mundo exterior.
Nenhuma caracterstica de outra linguagem deve ser reconhecida pelo compilador.

Tipos e operadores
PORTUGOL Simplificado fortemente tipado e d suporte aos seguintes tipos: inteiros,
strings e booleanos. Os nicos operadores disponveis na linguagem so:
!: negao, inverte o valor booleano ao qual foi aplicada unrio;
E: AND lgico binrio;
OU: OR lgico binrio;
+: soma binrio;
-: subtrao binrio;
*: multiplicao binrio;
/: diviso inteira binrio;
==: comparao, checa se os operadores so iguais binrio;
<> ou !=: comparao, checa se os operadores so diferentes binrio;
>=: maior ou igual que binrio;
<=: menor ou igual que binrio;
>: maior que binrio;
<: menor que binrio;

Precedncia de operadores
I.
II.
III.

Quando dois operadores diferentes forem utilizados ao mesmo tempo, o


operador de maior precedncia ser avaliado primeiro;
Operadores de mesma precedncia sero avaliados da esquerda para a direita;
possvel forar a precedncia de uma operao, colocando-a entre
parnteses.

A tabela a seguir apresenta a hierarquia de precedncia dos operadores (decrescente de


cima para baixo), os tipos dos operandos aos quais podem ser aplicados e o tipo do
retorno:

Tabela 1. Precedncia de operadores.


Operador
!
*e/
+e== e <>, !=
>=, <=, > e <
E
OU

Aridade
1
2
2
2
2
2
2

Tipos aplicados
Booleano
Inteiro
Inteiro
booleano, inteiro e string
booleano, inteiro e string
Booleano
Booleano

Tipo de retorno
boleano
inteiro
inteiro
boleano
boleano
boleano
boleano

Identificadores
So os nomes utilizados para identificar variveis e funes no programa.
Identificadores podem ter qualquer tamanho maior que zero e devem obrigatoriamente
comear com uma letra. Aps isso, podem conter qualquer letra ou digito.
Dentro do mesmo escopo, variveis no podem ter o mesmo nome de outras variveis,
procedimentos ou funes. Identificadores nunca podem ter o mesmo nome de uma
palavra reservada da linguagem (SE, PARA, etc.).

Variveis
Variveis so posies de memria que guardaro dados do programa. Em
PORTUGOL Simplificado, toda varivel tem o tipo definido na sua declarao, que no
poder ser alterado.
Para declarar uma varivel, atribui-se um tipo a um identificador vlido. O valor padro
da varivel definida desta forma ser 0 (zero) para inteiros, FALSO para as variveis do
tipo booleano e string vazia para strings.
Sintaxe de declarao:
<tipo> <lista_de_identificadores> ;
Ex:
INTEIRO inteiro1;
STRING string1, string2;
BOOLEANO boolean1;
Como se pode observar, declaraes seqenciais so permitidas, em uma mesma linha,
porm apenas quando as variveis forem de um mesmo tipo.
Os valores devem ser atribudos depois da declarao das variveis. Para isso deve-se
usar a atribuio =. Strings devem estar entre aspas duplas, como pode ser visto nos
exemplos abaixo.

Ex:
STRING stringTeste;
...
stringTeste = Teste;

Escopo das variveis


Variveis podem ser:
1. Locais: conhecidas somente no bloco da funo/procedimento em que foram
declaradas. Devem ser declaradas no incio do bloco da funo/procedimento.
2. Globais: conhecidas por todo o programa. Devem ser declaradas no incio do
programa.
Erros de compilao devem ser gerados caso uma varivel seja declarada aps o incio
do bloco ou aps o incio do programa.

Funes e procedimentos
Funes tm um nome, uma lista de parmetros e um tipo de retorno. Nos casos em que
no se deve retornar nenhum valor, usa-se um procedimento e no uma funo.
Nenhuma funo/procedimento poder ter o mesmo nome que outra funo ou varivel
global, independente da sua assinatura.
Funes/procedimentos podem ser chamados recursivamente, criando um contexto
novo para suas variveis locais. Possuem uma lista com zero ou mais parmetros e todo
parmetro passado por valor.
Para definir o valor a ser retornado, utiliza-se uma varivel com o mesmo nome da
funo (definida implicitamente, que contm o resultado).
Sintaxe de declarao (funo):
FUNCAO <nome_funcao> ( <lista_parametros> ) : <tipo_retorno>;
<declarao_variaveis>
...
<nome_funcao> = <valor_retorno>;
FIM;

Sintaxe de declarao (procedimento):


PROCEDIMENTO <nome_procedimento> ( <lista_parametros> );
<declarao_variaveis>
...
FIM;

A lista de parmetro deve ser declarada de acordo com o a sintaxe:


<param1> : <tipo_param1>, <param2> : <tipo_param2>, ...
EX: FUNCAO Soma() : Inteiro; // Sintaxe da funo sem parmetros

Funes nativas
O compilador dever reconhecer previamente um conjunto de procedimentos nativos
para implementao de IO do usurio.

ESCREVA
Envia sada para o console. A cada chamada tambm enviada uma quebra de linha,
exceto entre os itens de escreva (lista de expresses). A lista de expresses deve ser
separada por vrgulas.
Sintaxe de chamada:
ESCREVA <lista_expressao> ;
Ex:
ESCREVA Hello, World!;
ESCREVA 1 + 1 = , 1+1;
Sada:
HelloWorld
1 + 1 = 2

LEIA
Requisita a entrada de nmeros inteiros a partir do teclado. O valor fornecido
armazenado na varivel passada na chamada do LEIA. A lista de variveis deve ser
especificada de forma similar lista de expresses do LEIA.
O comando de LEIA pra a execuo do programa at que o usurio digite um valor
para a varivel (o valor confirmado aps pressionar a tecla <Enter>).
Sintaxe de chamada:
LEIA <lista_variaveis> ;
Ex:
ESCREVA
LEIA a;
ESCREVA
LEIA b,
ESCREVA

Digite um nmero;
Digite dois nmeros;
c;
a = , a, ; b = , b, ; c = , c;

Sada:
Digite um nmero
?1
Digite dois nmeros
?2 3
a = 1; b = 2; c = 3

Comandos de controle
O compilador deve reconhecer os seguintes comandos de controle de execuo: SEENTAO-SENAO, PARA, ENQUANTO, REPITA.
O uso de colchetes nas descries de sintaxe indica que o termo opcional.

SE-ENTAO-SENAO
Sintaxe:
SE <teste_logico> ENTAO
...
SENAO
...
FIM;

PARA
Sintaxe:
PARA <contador> = <inicio> ATE <fim> [PASSO <incremento>]
...
[SAIR;]
...
FIM;
Em caso de omisso do PASSO o incremento igual a 1. O comando SAIR (opcional)
interrompe a iterao do lao e transfere o controle para o final da construo do PARA.

ENQUANTO e REPITA
Sintaxe (ENQUANTO):
ENQUANTO <teste_logico>

[SAIR;]

FIM;
A principal diferena entre o ENQUANTO e o REPITA que, neste ltimo, o teste
lgico realizado apenas ao final do bloco sendo assim o bloco executado ao menos
uma vez. No caso do ENQUANTO, a verificao realizada antes da execuo do
bloco.

Sintaxe (REPITA):
REPITA
...
[SAIR;]
...
ATE <teste_logico>;
O comando SAIR funciona do mesmo modo que o SAIR do ENQUANTO
transferindo o controle para o final da construo de loop.

Programa
Todo programa comea com a declarao PROGRAMA seguida do nome do programa.
Um programa composto por zero ou mais declaraes de variveis globais, zero ou
mais declaraes de funes/procedimentos e um bloco principal com incio logo depois
do bloco de funes e procedimentos seguido de um FIM.
Todo programa deve ser escrito em um arquivo de texto sem formatao com a extenso
.por.
Ex:
PROGRAMA exemplo;
INTEIRO numero;
FUNCAO fatorial (fat : INTEIRO) : INTEIRO;
SE fat > 1 ENTAO
fatorial = fat * fatorial(fat - 1);
SENAO
fatorial = 1;
FIM;
FIM;
PROCEDIMENTO resultado (valor : INTEIRO);
ESCREVA Resultado: , valor;
FIM;
LEIA numero;
resultado (fatorial (numero));
FIM.

Você também pode gostar