Compiladores.
Primeiro Semestre de 2010.
Prof. José de Oliveira Guimarães.
Segundo Trabalho.
Prazo de Entrega: 07 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.