Ejemplos de Análisis Semántico
Ejemplos de Análisis Semántico
Programa Válido
program {
bool a = true;
integer y = 12;
integer suma(integer a, integer b) {
return a + b;
}
integer restaHasta0(integer x) {
while (x > 0) {
x = x - 1;
}
return x;
}
void main() {
integer x = suma(5, 10);
if (!a) then {
y = restaHasta0(y);
} else {
y = suma(x, y);
}
}
}
Todos los checks pasan: tipos correctos, returns presentes, main existe.
Errores Comunes
Tipos Incompatibles
boolean b = true;
integer x = b + 1; // ❌ BOOLEAN + INTEGER
Variable No Declarada
integer x = y + 1; // ❌ 'y' no existe
getSymbol() no encuentra ‘y’ en ningún nivel.
Expresiones Incompletas
integer x = 5 + ; // ❌ Falta de un término
integer y = + 10;
bool a = true && ;
bool b = && false;
Fuera de Scope
void main() {
if (true) {
integer temp = 100;
}
integer x = temp; // ❌ temp destruido al salir del if
}
Falta Return
integer suma(integer a, integer b) {
integer r = a + b; // ❌ No hay return
}
Parámetros Incorrectos
integer suma(integer a, integer b) { return a + b; }
integer x = suma(5); // ❌ Faltan argumentos
integer y = suma(5, 10, 3); // ❌ Sobran argumentos
integer z = suma(true, 10); // ❌ Tipo incorrecto
integer w = resta(7, 2); // ❌ Método inexistente
Redeclaración
integer x = 5;
integer x = 10; // ❌ Ya declarado en este scope
Shadowing en scopes diferentes sí está permitido.
Return en Void
void imprimir(integer x) {
return x; // ❌ void no retorna valor
}
Tipo de Return Incorrecto
boolean esPar(integer n) {
return n % 2; // ❌ Retorna INTEGER, no BOOLEAN
}
Sentecias de Control
if
bool esPar(integer x) {
if (x % 2) then { // ❌ expresion NO BOOLEANA
return true;
}
return false;
}
while
integer sumaHasta10(integer x) {
while (x + 10) { // ❌ expresion NO BOOLEANA
x = x + 1;
}
return x;
}
Falta Main
integer suma(integer a, integer b) {
return a + b;
}
// ❌ No hay main
Main Incorrecto
integer main() { // ❌ main debe ser void
return 0;
}
void main(bool a, integer x) { // ❌ main con parámetros
// ...
}
Multiples Declaraciones
void main() {
// ...
}
void main() { // ❌ debe existir un solo método main
// ...
}