Construção e Optimização de Compiladores

Trabalho prático

2005/2006


Fase 1 -- Representação Intermédia

Construa um programa (numa linguagem de programação à sua escolha) que receba como input um ficheiro de texto com código de representação intermédia e crie as estruturas de dados necessárias a um posterior processamento e geração de código MIPS.

O ficheiro de texto deverá ter a seguinte estrutura:

codigo := funcao*
funcao := nome "(" type* ")" level returnvalue variaveis statements "end"
type := "INT" " "
level := int
returnvalue := type
variaveis := "VAR" type* ";"
statements := statement*
statement := move | expression | jump | cjump | seq | label
move := "MOVE" "(" exp "," exp ")" ";"
expression := "EXP" "(" exp ")" ";"
jump := "JUMP" "(" exp ")" ";"
cjump := "CJUMP" "(" relop "," exp "," exp "," nome "," nome ")" ";"
seq := "SEQ" "(" statement "," statement ")" ";"
label := "LABEL" "(" nome ")" ";"
relop := "<" | "<=" | "=" | "!=" | ">" | ">="
exp := const | name | temp | binop | mem | call | eseq | var | arg | ret
const := "CONST" "(" int ")"
name := "NAME" "(" string ")"
temp := "TEMP" "(" string ")"
binop := "BINOP" "(" op "," exp "," exp ")"
op := "'+" | "-" | "*" | "/"
mem := "MEM" "(" exp ")"
call := "CALL" "(" exps ")"
exps := exp
exps := exp "," exps
eseq := "ESEQ" "(" statement "," exp ")"
var := "VAR" "(" level "," int ")"
arg := "ARG" "(" level "," int ")"
ret := "RET"

nome := [A-Za-z]+
int := [0-9]+