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

Segundo Trabalho.
Prazo de Entrega: 26 de Julho

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 ::= “{“  VarConstDec StatementList “}”

CompositeStatement ::= “{“ StatementList “}”

VarConstDec ::= { VarDec | ConstDec }

VarDec ::= Type IDENT “;”

Type ::= “int

ConstDec ::= “const” IDENT “=” LiteralInt “;”

StatementList ::=   | Statement StatementList

Statement ::= AssignmentStatement “;” | IfStatement | ForStatement | ReadStatement “;” | WriteStatement “;” | CompositeStatement

AssignmentStatement ::= IDENT “=” Expr

Expr::=  '(' oper Expr  Expr ')' | LiteralInt | IDENT

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

IfStatement ::= “if” Expr Statement [ “else” Statement ]

ForStatement ::= “for” IDENT “=” Expr “to” Expr “do” Statement

ReadStatement ::= “read” “(“ IDENT “)”

WriteStatement ::= “write” “(“ Expr “)”

Um programa poderia ser
{  

   const Max = 10;

   int i; 

   int j;

   int n;

   i = 5;

   read(n);

   for j = 1 to n do

      write(n);

   if (> i n) n = i;

   else

      n = (+ n 1);

   write(n);

}

 

Algumas observações:

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

2.      qualquer item entre [ e ] é opcional;

3.      LiteralInt representa constantes inteiras positivas;

4.      todas as variáveis e constantes são inteiras;

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 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;

8.      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 uma atribuição ou expressão foi declarada;

- se o identificador do lado esquerdo de uma atribuição não é uma constante;

- se o identificador do for é uma variável (não uma constante);

- se o identificador do read é uma variável.

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