Exemplos de Erros Semânticos
Abaixo estão alguns exemplos de erros que passam pelo léxico e pelo sintático sem problema, mas são pegos pelo analisador semântico.
Incompatibilidade de tipos na atribuição
um código em C++:
int x = 0;
int y = 1;
String z = x + y;
Esse código passaria tanto pelo léxico quanto pelo sintático, pois os tokens estão certos e a gramática está correta, porém, quando se vai ver a semântica, vai ser verificado que esse código está errado.
Não da para colocar em uma String a soma de dois inteiros (não dessa forma pelo menos). O analisador semântico verifica que o tipo do lado direito (int) é incompatível com o tipo declarado no lado esquerdo (String) e lança um erro.
Variável não declarada
int main() {
return x + 1;
}
O token x é um identificador válido pro léxico e a expressão return x + 1 é gramaticalmente correta pro sintático. Mas o semântico vai consultar a tabela de símbolos, não vai encontrar nenhuma declaração de x e vai lançar o erro.
Redeclaração no mesmo escopo
int main() {
int x = 1;
int x = 2;
}
Declarar x duas vezes no mesmo bloco é um erro semântico. O analisador vê que x já existe na tabela de símbolos com o mesmo nível de escopo e rejeita a segunda declaração.
Uso fora do escopo
int main() {
int x = 10;
}
int outra() {
return x + 1;
}
x foi declarado dentro de main() e só existe enquanto main() está em execução. Quando outra() tenta usar x, ele não está mais na tabela de símbolos — o escopo de main() já foi encerrado.
Retorno incompatível com o tipo da função
int soma(int a, int b) {
return 3.14;
}
A função declara retornar int, mas o valor de retorno é float. O analisador semântico verifica se o tipo da expressão no return é compatível com o tipo declarado na assinatura da função.
Variável não inicializada antes do uso
int x;
int y = x + 1;
x foi declarada mas nunca recebeu um valor. Usar uma variável não inicializada é um comportamento indefinido em C++, então o analisador semântico lança um aviso (ou erro, dependendo da implementação).
Bibliografia:
- https://pgrandinetti-github-io.translate.goog/compilers/page/what-is-semantic-analysis-in-compilers/?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt&_x_tr_pto=tc
- Aho, A. V.; Lam, M. S.; Sethi, R.; Ullman, J. D. Compiladores: Princípios, Técnicas e Ferramentas (Livro do Dragão). 2ª ed. Pearson, 2008.