Micro C Compiler - MCC
Loading...
Searching...
No Matches
intercode.c File Reference

implementação do gerador de código intermediário. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "intercode.h"

Functions

static IROperandcriar_operando (OperandType type)
 aloca e cria um operando genérico.
 
static IROperandcriar_operando_temporario ()
 cria um novo operando para uma variável temporária.
 
static IROperandcriar_operando_label_novo ()
 cria um novo operando para um rótulo gerado automaticamente (L0, L1...).
 
static IROperandcriar_operando_label_nome (const char *nome)
 cria um novo operando para um rótulo com nome específico (main, soma...).
 
static void emitir (IROpcode op, IROperand *res, IROperand *arg1, IROperand *arg2)
 cria e anexa uma nova instrução à lista de ir.
 
static void gerar_ir_no (ASTNode *no, PilhaTabelasSimbolos *pilha)
 função recursiva principal que percorre a ast e gera a ir para instruções.
 
static IROperandgerar_ir_expr (ASTNode *no, PilhaTabelasSimbolos *pilha)
 função recursiva que percorre a ast e gera a ir para nós de expressão.
 
static IROperandgerar_ir_call (ASTNode *no, PilhaTabelasSimbolos *pilha)
 função auxiliar para gerar código para chamadas de função.
 
static TokenType get_expr_static_type (ASTNode *expr_node, PilhaTabelasSimbolos *pilha)
 Retorna o tipo estático de um nó de expressão.
 
static IROperandcopiar_operando (IROperand *op)
 cria uma cópia de um operando.
 
IR_Instructiongerar_codigo_intermediario (ASTNode *raiz, PilhaTabelasSimbolos *pilha)
 função pública que inicia a geração de código intermediário.
 

Variables

static int temp_counter = 0
 Contador global para gerar identificadores temporários únicos (t0, t1...).
 
static int label_counter = 0
 Contador global para gerar rótulos de desvio únicos (L0, L1...).
 
static IR_Instructionir_list_head = NULL
 Ponteiro para o início da lista encadeada de instruções da IR.
 
static IR_Instructionir_list_tail = NULL
 Ponteiro para o final da lista encadeada da IR (para emissão rápida).
 

Detailed Description

implementação do gerador de código intermediário.

este módulo percorre a árvore sintática abstrata (ast) e a traduz para uma representação intermediária linear (ir) em formato de código de três endereços.

Function Documentation

◆ copiar_operando()

static IROperand * copiar_operando ( IROperand op)
static

cria uma cópia de um operando.

◆ criar_operando()

static IROperand * criar_operando ( OperandType  type)
static

aloca e cria um operando genérico.

◆ criar_operando_label_nome()

static IROperand * criar_operando_label_nome ( const char *  nome)
static

cria um novo operando para um rótulo com nome específico (main, soma...).

◆ criar_operando_label_novo()

static IROperand * criar_operando_label_novo ( )
static

cria um novo operando para um rótulo gerado automaticamente (L0, L1...).

◆ criar_operando_temporario()

static IROperand * criar_operando_temporario ( )
static

cria um novo operando para uma variável temporária.

◆ emitir()

static void emitir ( IROpcode  op,
IROperand res,
IROperand arg1,
IROperand arg2 
)
static

cria e anexa uma nova instrução à lista de ir.

*

Parameters
opO opcode da instrução.
resO operando de resultado.
arg1O primeiro argumento.
arg2O segundo argumento.

◆ gerar_codigo_intermediario()

IR_Instruction * gerar_codigo_intermediario ( ASTNode raiz,
PilhaTabelasSimbolos pilha 
)

função pública que inicia a geração de código intermediário.

função principal que gera a lista de instruções da ir a partir da ast.

◆ gerar_ir_call()

static IROperand * gerar_ir_call ( ASTNode no,
PilhaTabelasSimbolos pilha 
)
static

função auxiliar para gerar código para chamadas de função.

*

Parameters
noO nó ASTNode que representa a chamada (NODE_CALL).
pilhaA pilha de tabelas de símbolos.
Returns
O IROperand temporário que armazena o resultado da chamada.

◆ gerar_ir_expr()

static IROperand * gerar_ir_expr ( ASTNode no,
PilhaTabelasSimbolos pilha 
)
static

função recursiva que percorre a ast e gera a ir para nós de expressão.

*

Responsável por nós que calculam um valor (ex: NODE_BINARY_OP, NODE_CALL).

Parameters
noO nó da AST de expressão.
pilhaA pilha de tabelas de símbolos.
Returns
O IROperand (geralmente temporário ou constante) que contém o resultado.

◆ gerar_ir_no()

static void gerar_ir_no ( ASTNode no,
PilhaTabelasSimbolos pilha 
)
static

função recursiva principal que percorre a ast e gera a ir para instruções.

*

Responsável por nós que representam ações e fluxo de controle (ex: NODE_IF, NODE_ASSIGN, NODE_RETURN).

Parameters
noO nó da AST de instrução.
pilhaA pilha de tabelas de símbolos.

◆ get_expr_static_type()

static TokenType get_expr_static_type ( ASTNode expr_node,
PilhaTabelasSimbolos pilha 
)
static

Retorna o tipo estático de um nó de expressão.

Esta é uma versão simplificada do analisador semântico (get_expression_type).

Parameters
expr_nodeO nó da AST a ser avaliado.
pilhaA pilha de tabelas de símbolos para consulta.
Returns
O TokenType (INT, CHAR, STRINGCONST) do resultado.

Variable Documentation

◆ ir_list_head

static IR_Instruction * ir_list_head = NULL
static

Ponteiro para o início da lista encadeada de instruções da IR.

◆ ir_list_tail

static IR_Instruction * ir_list_tail = NULL
static

Ponteiro para o final da lista encadeada da IR (para emissão rápida).

◆ label_counter

static int label_counter = 0
static

Contador global para gerar rótulos de desvio únicos (L0, L1...).

◆ temp_counter

static int temp_counter = 0
static

Contador global para gerar identificadores temporários únicos (t0, t1...).