# Introdução à Teoria dos Compiladores/Análise Semântica

Chama-se análise semântica a terceira fase da compilação, onde se verificam os erros de semântica no código fonte e se faz a coleta das informações necessárias para a próxima fase da compilação, a geração de código objeto. O objetivo da análise semântica é trabalhar no nível de inter-relacionamento entre partes distintas do programa.

## Objetivo da Análise Semântica

A análise sintática verifica e aponta as expressões que quebram qualquer regra determinada pela gramática. Mas o nível de complexidade aumenta quando tratamos de linguagens dependentes de contexto. A análise semântica busca apontar (não resolver) este tipo de erros (dependentes de contexto).
O objetivo da análise semântica é, assim, criar, a partir de um texto-fonte, uma interpretação expressa em alguma notação adequada - geralmente uma linguagem intermediária do compilador. Isto é feito com base nas informações das tabelas e nas saídas dos outros analisadores. Denomina-se semântica de uma sentença o significado por ela assumido dentro do contexto em que se encontra. Semântica de uma linguagem é a interpretação que se pode atribuir ao conjunto de todas as suas sentenças.
A análise semântica utiliza-se da verificação de tipos para verificar se um determinado operando recebe outro operando de mesmo tipo. Um exemplo comum nas linguagens de programação é a análise semântica retornar um erro quando uma variável do tipo numérica (real ou inteira) receber um valor tipo texto (string).
Um compilador usa uma tabela de símbolos (TS) para guardar informações sobre os nomes declarados em um programa. A TS é pesquisada cada vez que um nome é encontrado no programa fonte. Alterações são feitas na TS sempre que um novo nome ou nova informação sobre um nome já existente é obtida. A gerência da TS de um compilador deve ser implementada de forma a permitir inserções e consultas da forma mais eficiente possível, além de permitir o crescimento dinâmico da mesma.Cada entrada na ts é a declaração de um nome. Cada entrada na ts pode ser implementada como um registro ( record ou struct) contendo campos (nome, tipo, classe, tamanho, escopo, etc.) que a qualificam.
Exemplos típicos de erros semânticos são:
* Uma variável não declarada
* Uma multiplicação entre tipos de dados diferentes
* Atribuição de um literal para outro tipo, como um inteiro em uma string ou vice-versa.

## Checagem de Tipo

O processo de verificação dos tipos ocorre em tempo de compilação (checagem estática) ou em tempo de execução (checagem dinâmica). As linguagens de programação conforme a especificação da linguagem podem ser referidas como de tipagem forte e tipagem fraca, influenciando o processo de checagem de tipo.

### Tipagem estática

É quando acontece durante a compilação, pode ser por meio de alocação, desalocação de variaveis locais ou descoberta de tipos em expressões numericas.

### Tipagem dinâmica

É quando acontece durante a execução, pode ser por meio de alocação na heap com malloc (em C), verificação de cast de classe (em java), ou verificação de limites de arrays (em java).

### Combinação de tipagem estática e dinâmica

Esta informação está em branco. Por favor, alguém poderia descrever como é a combinação de tipagem estática e dinâmica para poder ajudar outros estudantes universitários?