Construção de Compiladores – RER.
Segundo Semestre de 2001.
Prof. José de Oliveira Guimarães.

Primeiro Trabalho.

Faça um compilador para a gramática dada a seguir utilizando o método recursivo descendente.  Nesta gramática, qualquer coisa entre [ e ] é opcional.

Program ::= ProcList
ProcList ::= ProcDec | ProcDec ProcList
ProcDec ::= "function" IDENT '(' ')' ":" Type
       [ "var" VarList ]
       CompositeCommand
VarList ::= IDENT ":" Type ";" | IDENT ":" Type ";" VarList 
Type ::= "integer" | "boolean"
Command ::=  "return" Expr ";"
      |  Assignment ";"
      | "write" "("  Expr ")" ";"
      | "read" "(" IDENT ")"  ";"
      | IfStat
      | CompositeCommand

CommandList ::=   |  Command CommandList
CompositeCommand ::=  "begin" CommandList "end"
Assignment ::= IDENT ":=" Expr
IfStat ::= "if" Expr  "then" Command [ "else"  Command ]

PrimaryExpr ::= Number | IDENT | "true" | "false" |

    IDENT '(' ')'
Expr ::= AddExpr Relation AddExpr
Relation ::= '>' | '>=' | '<' | '<=' | '==' | '<>'
AddExpr ::= MultExpr  AddOp MultExpr
AddOp ::= '+' | '-'
MultExpr ::= PrimaryExpr MultOp PrimaryExpr
MultOp ::= '*' | '/'

* a execução do programa é a chamada da função " first", que obrigatoriamente deve ser definida no programa;
* identificadores devem ser compostos por qualquer quantidade de letras e números, começando por letra;
* números podem ter qualquer número de dígitos, mas devem estar entre 0 e 32767;
* 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;
* a leitura da entrada deve ser feita de um arquivo.

Observações sobre o trabalho:

o trabalho pode ser feito em grupos de até dois elementos;

faça a análise léxica, sintática e geração de código para o dia 8 de Março. Esta é a parte I do trabalho;

a análise semântica é a parte II. A data de entrega é o dia 1 de Abril (é sério);

note que grande parte do trabalho pode ser obtida dos compiladores exemplo disponíveis na página da disciplina. Assim, este não é um trabalho grande;