Clonar ou atualizar
git clone https://github.com/sergioaafreitas/COMP1.git # ou, se já existe: git pull
FGA0003 - Compiladores 1 | Semana 9 | Aula prática
O material da prática está no repositório público da disciplina.
git clone https://github.com/sergioaafreitas/COMP1.git # ou, se já existe: git pull
cd "COMP1/semana 09"
flex --version bison --version gcc --version make --version
A prática separa especificação léxica, gramática, AST, testes e automação de build.
Execute no diretório semana 09:
echo "2+3*4" | ./optimize Saída esperada: 14
echo "2+3+x*4" | ./optimize Saída esperada: (5 + (x * 4))
echo "(1+2)*(3+4)" | ./optimize Saída esperada: 21
A entrada passa pelo scanner, pelo parser, vira AST e é simplificada por optimize().
O nó diferencia três categorias: número, variável e operador.
A função visita os filhos antes de tentar simplificar o nó atual.
A gramática reconhece 3*4 como term.
optimize() reduz 3*4 para 12.
A raiz passa a ser 2+12.
2+12 é reduzido para 14.
Este caso mostra folding em dois ramos e depois na raiz.
2 + 3 + x * 4
(5 + (x * 4))
O protótipo funciona, mas também serve para discutir qualidade de implementação.
Mover optimize() de parser.y para ast.c.
Não transformar 10/0 em 0; preservar erro ou manter o nó.
Liberar a string recebida do Flex após criar o nó.
Adicionar entradas que cubram constantes, variáveis e erros.
tests/test4.in tests/test5.in tests/test6.in tests/test7.in
x+2*3 10/(2+3) (8-3)*(2+2) 10/0
Antes de executar, escreva a saída esperada no README.
make clean make test
Ao final, o protótipo deve compilar, testar e demonstrar folding de constantes de forma documentada.