Construção de Compiladores.
Primeiro Semestre de 2003.
Prof. José de Oliveira Guimarães.

Segundo Trabalho.
Prazo de Entrega: 23 de Maio.

Entregue este trabalho com a folha de correção disponível na página da disciplina.

Nesta página, veja as observações sobre correção de trabalho.

Faça um compilador para a seguinte gramática:

 

Program ::= VarDecls Command CommandList

VarDecls ::= { VarDecl }

VarDecl ::= “var” ID “:” Type VarDec2

VarDec2 ::= “[]” “=”  “{“ IntConstList “}”  

   | “=” IntConst

Type ::= “integer”

IntConstList ::= IntConst { “,” IntConst }

CommandList ::= { Command }

Command ::= ForeachCmd | “print” Expr | “read”  ID

  | IfCmd | CompositeCmd | AssignmentCmd

ForeachCmd ::= “foreach” ID “in” ID “do” Command

IfCmd ::= “if” Expr “then” Command [ “else” Command ]

CompositeCmd ::= “{“ CommandList “}”

AssignmentCmd ::= ID “=” Expr

Expr::=  '(' oper Expr  Expr ')' | IntConst | ID

Oper ::= '+' | '-' | '*' | '/' | '>' | '>=' | '<' | '<='
| '==' | '!='

 

A linguagem admite comentários que começam com # e se estendem até o fim da linha. Um programa poderia ser

 

# comentario

var v : integer[] = { 2, 3, 5, 7, 11, 13, 17, 19 }

var i : integer = 0

var x : integer = 0

   # imprime todos os elementos do vetor v

foreach x in v do

    print x               

read x

if (> x 0)

then {

   print 0

   print 2

}

else

   print 1


Algumas observações:

1.      { e } representam repetição de zero ou mais vezes;

2.      qualquer item entre [ e ] é opcional;

3.      IntConst representa constantes inteiras positivas;

4.      a linguagem suporta apenas inteiros e vetores de inteiros;

5.      identificadores devem ser compostos por qualquer quantidade de letras e números, começando por letra;

6.      números podem ter qualquer número de dígitos, mas devem estar entre 0 e 32767;

7.      o comando “foreach” do exemplo acima percorre o vetor associando cada elemento à variável x. Assim, todos os elementos do vetor v são impressos na saída padrão;

8.      o compilador deve construir a ASA e gerar código a partir dela, em C. A geração de código deve ser feita para um arquivo;

9.      a leitura da entrada deve ser feita de um arquivo;
 

Naturalmente, o compilador deve fazer a análise semântica. Deve ser conferido:

- se uma variável está sendo redeclarada;

- se uma variável utilizada em algum lugar foi declarada. Estes lugares incluem ForeachCmd, read, AssignmentCmd e Expr;

- se, em uma atribuição, os tipos esquerdo e direito são integer. Atribuições de vetores são ilegais;

- se o tipo da expressão do if é integer (e não integer[]);

- se o primeiro ID de foreach é uma variável inteira e o segundo é um vetor;

- se o ID da produção Expr é uma variável inteira;

- se a variável do read é do tipo integer.

O trabalho pode ser em grupo de até duas pessoas.