(17-12-2011 02:10)Ident escribió: (17-12-2010 23:16)gonnza escribió: entonces sintacticamente correcto y semanticamente correcto es lo mismo ? No entiendo ! XDDD
porque tengo 2 definiciones (que lo pueda derivar, y que lo pueda derivar y cumpla co las restricciones) y 3 conceptos (derivable, sintactam correcto, y semanticam correcto)
Hay alguno que es igual al otro ? que me esta faltando !?!!?
Tengo la misma duda! ¿Alguien tiene algún caso práctico donde se puede explicitar la diferencia?
Segun lo que entendi yo:
PARA EL COMIPLADOR:
-Sintacticamente correcto = derivable de la BNF (si la podes derivar, entonces es sintacticamente correcto para el compilador)
-Semanticamente correcto = debe ser sintacticamente correcto y ademas cumplir con las restricciones sensibles al contexto (las que no pueden ser representadas por una GIC). Por ejemplo: verificacion de tipos (hay operadores que trabajan solo sobre algunos tipos de operandos) o verificar si una variable fue definida antes de usarla.
Ejemplo del libro:
void XX (void) {
int a;
double a;
if (a > a)
return 12;
}
Esa funcion es derivable de la bnf, entonces PARA EL COMPILADOR es sintacticamente correcta. Pero tenes un error semantico en la doble definicion de la variable a, y otro en el return 12 (porque al ser void, no devuelve nada la funcion).
Otro ejemplo podria ser
int XX (void) {
int a;
if (a > b)
return 12;
}
Donde b no fue definida anteriormente, entonces tambien habra error semantico
PARA EL USUARIO:
- Es sintacticamente correcto para el USUARIO, si es semanticamente correcto para el COMPILADOR (osea, tiene que ser derivable y cumplir con las restricciones sensibles al contexto).
Por lo tanto, puede ser derivable y no ser sintacticamente correcto para el usuario (como por ejemplo la funcion que puse antes, que es derivable pero al tener errores semanticos para el compilador, entonces tiene error sintactico para el usuario).
Este tomalo con pinzas, porque no estoy 100% seguro pero lo que me parece es:
- Es semanticamente correcto para el USUARIO si la funcion realiza lo que el usuario quiere hacer. Calculo que para que sea semanticamente correcto para el usuario, tambien debe ser sintacticamente correcto para el usuario, porque sino no compilaria y no realiza lo que el usuario quiere).
Un ejemplo de esto lo lei en un thread de aca (no recuerdo bien donde, pero los creditos son de el):
Si vos queres saber si el valor de verdad de una variable b, esta entre a y c, MATEMATICAMENTE harias a < b < c o sino (c > b > a)
Vamos a usar numeros en vez de variables para que se vea mejor: 5 > 4 > 3
¿Pero que pasa cuando pones eso en un programa?
Vamos a hacerlo por partes:
· 5 > 4 es VERDADERO, entonces eso va a devolver 1
· Luego queda 1 > 3, que es FALSO, entonces devuelve 0.
En conclusion, 5 > 4 > 3 devuelve 0 (osea, que es FALSO), cuando en realidad es completamente verdadero.
Por lo tanto, si vos tenes escrito algo asi, es SEMANTICAMENTE INCORRECTO PARA EL USUARIO porque no realiza lo que el usuario queria que haga.
Para hacer eso semanticamente correcto, habia que haber puesto: 5>4 && 4>3
Todo esto lo hice con numeros para que se entienda mejor, pero tenes que pensarlo con variables y es lo mismo.
Bueno, me extendi mas de la cuenta pero espero haber sido claro y haberme hecho entender. Cualquier cosa chifla