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

implementação do analisador semântico. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "semantic.h"

Functions

static void analisar_no (ASTNode *no, PilhaTabelasSimbolos *pilha, Simbolo *escopo_funcao_atual, bool is_param_decl)
 função recursiva que percorre a árvore para análise semântica.
 
static TokenType get_expression_type (ASTNode *expr_node, PilhaTabelasSimbolos *pilha, int *string_len)
 determina o tipo de uma expressão e, se for uma string, seu tamanho.
 
static int get_symbol_size (Simbolo *s)
 calcula o tamanho em bytes de um símbolo para alocação na pilha.
 
static void calcular_offsets (TabelaSimbolos *tabela)
 percorre uma tabela de um escopo e calcula os offsets de memória.
 
static void erro_semantico (const char *msg, int linha)
 função auxiliar para reportar erros semânticos e encerrar a compilação.
 
void analisar_semanticamente (ASTNode *raiz, PilhaTabelasSimbolos *pilha)
 função principal que dispara a análise semântica.
 

Detailed Description

implementação do analisador semântico.

este módulo percorre a árvore sintática abstrata (ast) para realizar checagens de tipo, de declaração e de escopo. ele utiliza a tabela de símbolos e calcula os deslocamentos de memória para o back-end.

Function Documentation

◆ analisar_no()

static void analisar_no ( ASTNode no,
PilhaTabelasSimbolos pilha,
Simbolo escopo_funcao_atual,
bool  is_param_decl 
)
static

função recursiva que percorre a árvore para análise semântica.

*

Implementa a lógica do tree walker para checagem de tipos, declaração e gerenciamento de escopo. As ações são divididas em pré-ordem (empilhar escopo) e pós-ordem (calcular offsets e desempilhar).

Parameters
noO nó atual da AST.
pilhaA pilha de tabelas de símbolos.
escopo_funcao_atualPonteiro para o símbolo da função que contém o nó atual.
is_param_declFlag booleana que indica se o nó atual é uma declaração de parâmetro.

◆ analisar_semanticamente()

void analisar_semanticamente ( ASTNode raiz,
PilhaTabelasSimbolos pilha 
)

função principal que dispara a análise semântica.

função principal que inicia a análise semântica da ast.

◆ calcular_offsets()

static void calcular_offsets ( TabelaSimbolos tabela)
static

percorre uma tabela de um escopo e calcula os offsets de memória.

esta função é chamada ao final da análise de um escopo de função (pós-ordem). ela faz duas passagens: 1. Calcula offsets POSITIVOS para parâmetros (ex: [rbp+16]).

  1. Calcula offsets NEGATIVOS para variáveis locais (ex: [rbp-4]).
    Parameters
    tabelaa tabela de símbolos do escopo da função.

◆ erro_semantico()

static void erro_semantico ( const char *  msg,
int  linha 
)
static

função auxiliar para reportar erros semânticos e encerrar a compilação.

*

Parameters
msgA mensagem de erro a ser exibida.
linhaO número da linha onde o erro ocorreu.

◆ get_expression_type()

static TokenType get_expression_type ( ASTNode expr_node,
PilhaTabelasSimbolos pilha,
int *  string_len 
)
static

determina o tipo de uma expressão e, se for uma string, seu tamanho.

realiza a checagem de tipos e a validacao de usos de variaveis e funcoes.

Parameters
expr_nodeo nó raiz da expressão a ser analisada.
pilhaa pilha da tabela de símbolos para consulta de tipos.
string_lenponteiro para um inteiro que receberá o tamanho da string (se aplicável).
Returns
o TokenType correspondente ao tipo da expressão.

◆ get_symbol_size()

static int get_symbol_size ( Simbolo s)
static

calcula o tamanho em bytes de um símbolo para alocação na pilha.

Parameters
so símbolo a ser medido.
Returns
o tamanho em bytes do símbolo.