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;