Geração de Código
Visão Geral
A etapa de geração de código transforma a AST construída durante a análise sintática/semântica em um programa equivalente na linguagem Calango.
No projeto Mini C Compiler to Calango, o gerador (gerador.c) percorre a AST e emite texto Calango no formato esperado pelo interpretador. A geração só ocorre quando a análise semântica não registra erros impeditivos.
Mapeamento Mini C para Calango
A linguagem Calango possui estruturas semelhantes às de C, mas com palavras-chave e algumas restrições próprias. Por isso, parte da geração é tradução direta e parte exige adaptação.
Tabela 01: Mapeamento das estruturas do Mini C para o Calango.
| Mini C | Calango | Observação |
|---|---|---|
int, float, char, bool |
inteiro, real, caracter, logico |
Mapeamento de tipos primitivos. |
true, false |
verdadeiro, falso |
Mapeamento de literais booleanos. |
if (c) { ... } |
se(c)entao ... fimSe |
Condicional simples. |
if (c) { ... } else { ... } |
se(c)entao ... senao ... fimSe |
Condicional composta. |
while (c) { ... } |
enquanto(c)faca ... fimEnquanto |
Laço de repetição. |
for (init; cond; passo) { ... } |
init; enquanto(cond)faca ... passo; fimEnquanto |
O for é reescrito como enquanto. |
do { ... } while (c); |
faca ... enquanto(c); |
Preserva a execução mínima do bloco. |
printf("texto") |
escreva("texto") ou escreval("texto") |
escreval é usado quando há ` |
| ` ao final. | ||
printf("%d", x) |
escreva(x) |
Os especificadores de formato não são emitidos. |
scanf("%d", x) |
leia(x) |
O formato é descartado e a variável é usada como alvo de leitura. |
&&, \|\|, !, % |
e, ou, nao, mod |
Mapeamento de operadores. |
Autor(es): João Pedro, Pedro Silva.
Funções do Gerador
Tabela 02: Funções principais do gerador de código.
| Função | Responsabilidade |
|---|---|
gerar(raiz, saida) |
Ponto de entrada da geração sem otimização explícita. Percorre a AST e escreve a saída. |
gerarASTOtimizada(raiz, saida) |
Aplica otimizarAST antes de chamar a geração final. |
gen_tipo(n, out) |
Converte nós de tipo da AST para palavras-chave do Calango. |
gen_expr(n, out) |
Emite expressões aritméticas, relacionais e lógicas de forma recursiva. |
gen_no(n, out, nivel) |
Emite declarações, comandos, blocos e estruturas de controle. |
gen_lista(n, out, nivel) |
Percorre listas encadeadas de nós usando o campo prox. |
gen_printf(n, out, nivel) |
Traduz comandos printf para escreva ou escreval. |
Decisões de Tradução
Tabela 03: Decisões tomadas na geração de código.
| Decisão | Justificativa |
|---|---|
| Declaração e inicialização separadas | O Calango não utiliza declaração com inicialização no mesmo formato de C. Assim, int x = 5; é emitido como inteiro x; seguido de x = 5;. |
Conversão de for para enquanto |
O for do Mini C aceita inicialização, condição e passo em formato C. A forma mais segura de representar isso no Calango é usando enquanto. |
| Parênteses em expressões | O gerador preserva a precedência definida pela AST envolvendo operações binárias com parênteses. |
| Geração bloqueada em erro semântico | Se a análise semântica encontra erro, o gerador não emite código final. |
| Otimização antes da geração | A chamada gerarASTOtimizada reduz a AST antes da saída em Calango. |
Exemplo de Saída
Entrada Mini C:
Saída Calango esperada:
Histórico de Versões
| Versão | Descrição | Data | Responsável |
|---|---|---|---|
0.1 |
Criação da página e documentação da etapa de geração de código. | 06/06/2026 | Luiz Faria, João Pedro |
0.2 |
Atualização conforme a geração otimizada da AST e a tradução final para Calango. | 19/06/2026 | João Pedro, Pedro Silva |