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.