Distinguir erros
Separar problemas sintáticos de problemas semânticos.
Tipos, escopos, contextos e AST anotada
A análise semântica usa a AST e a tabela de símbolos para validar regras que a gramática não consegue expressar sozinha.
Separar problemas sintáticos de problemas semânticos.
Associar usos de identificadores às declarações visíveis.
Determinar tipos de expressões a partir da AST.
Checar regras como break, chamadas e retornos.
O parser confirmou que a estrutura está correta. O programa também faz sentido?
A gramática aceita a estrutura do comando.
As regras da linguagem rejeitam o significado produzido.
Qual programa é sintaticamente válido, mas contém erro semântico?
Regras explícitas evitam respostas ambíguas.
Não há redeclaração no mesmo escopo.
Nomes são buscados do escopo mais interno para o global.
int promove para float; float não converte implicitamente para int.
if e while exigem bool; break exige laço ativo.
A análise semântica pode ser vista como um inspetor que percorre a AST fazendo perguntas sobre nomes, tipos, contextos e resultados.
Exemplo analisado ao longo da aula: função soma, escopos locais, chamada com tipo incorreto, identificador não declarado e break fora de laço.
Separar responsabilidades facilita implementação e testes.
A implementação pode reunir etapas, mas pensar em passagens ajuda a organizar o compilador.
Criar ambiente para bloco, função ou programa.
Registrar variáveis, funções e parâmetros.
Proibir nomes repetidos no mesmo escopo.
Remover ambiente ao sair do bloco.
Em escopo léxico, a busca começa no escopo mais interno ativo e sobe até o escopo global.
Declarar o mesmo nome duas vezes no mesmo escopo: erro.
Declarar nome igual em escopo interno: permitido na MiniComp.
Sempre se vincula à declaração visível mais próxima.
No bloco interno, a qual declaração o uso de x está associado?
A resolução de nomes transforma um texto igual em referências semânticas diferentes.
Depois de saber quem é cada nome, podemos descobrir o tipo de cada expressão.
Operadores +, -, *, / exigem operandos numéricos.
int pode promover para float.
float não atribui implicitamente para int.
if e while exigem expressão bool.
O tipo de uma expressão é calculado a partir dos tipos dos filhos.
Pelas regras da MiniComp, qual é o tipo de 2 + 3.5 * 4?
Nome, tipo de retorno e lista de parâmetros.
A chamada deve fornecer o número correto de argumentos.
Cada argumento deve ser compatível com o parâmetro.
A expressão da chamada recebe o tipo de retorno.
Algumas regras dependem do lugar em que o nó aparece.
Só é válido dentro de laço.
Deve ser compatível com a função atual.
Só é válido dentro de laço.
if e while exigem tipo bool.
Qual construção exige informação sobre o contexto de controle?
O produto da análise semântica não é apenas aceitar ou rejeitar.
Tipo resultante de expressões.
Entrada da tabela associada ao uso.
Conversão inserida ou exigida.
Erros e advertências localizados.
Identificador desconhecido não declarado.
O nó recebe TIPO_ERRO.
Operações superiores propagam o erro.
Evita mensagens secundárias enganosas.
Analise: int resultado = soma(10); Escreva uma mensagem de erro útil, com causa e localização hipotética.
No projeto, o parser constrói; o analisador semântico valida e anota.
NoAST *no e ContextoSemantico *contexto.
TipoDado inferido, anotações no nó e diagnósticos acumulados.
Criar enum para int, float, bool e TIPO_ERRO.
Adicionar tipo inferido e símbolo resolvido.
Implementar pilha ou lista de ambientes.
Guardar diagnósticos com linha e contexto.
Inserção, busca e escopo atual.
Campos para tipo e símbolo.
Regras de operadores e atribuições.
Casos positivos e negativos.
Mensagem, linha e causa.
Commit e README atualizados.
A análise semântica transforma uma AST estrutural em uma representação validada, anotada e pronta para as próximas fases do compilador.