UTNianos

Versión completa: PEDIDO - Final Sintaxis y Semantica de los Lenguajes 5/12/2016
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Buenas noches,

Les escribo para pedirles si alguno fue a rendir hoy el final tomado en el dia de la fecha de Sintaxis. Dieron los 15 mins para levantarse?

Saludos!
Dieron los 15 minutos y después retiraron las libretas.
Seguro en estos días aparece la resolución oficial, te dejo mas o menos lo que me acuerdo...

Había un anexo con una gramática para sentencias, y para los tres prácticos había que usarla.

- Hallar el conjunto Primero(sentencia).
- Derivar if (e) if (e) e; else e; Indicar si es sintacticamente correcto y si la gramática tiene ambigüedades.
- Escribir una sentencia de iteración con 7 tokens.

Afirmaciones

1. La verificación de tipos la realiza siempre el análisis semántico.
2. En ANSI C la expresión a+++++b tiene 5 tokens.
3. En ANSI C sea int a,b; la expresión a+++++b es semánticamente correcta.
4. En ANSI C el lexema "/*xx/" tiene al menos un error léxico.
5. En ANSI C char x[] = {'a','b','\0'}; y char*x = "ab"; son semánticamente equivalentes.
6. El analizador léxico toma tokens para generar lexemas.
7. Todo LF puede ser generado por una gramática.

Me saque un 7. Me quedaron algunas dudas en las afirmaciones, si no aparece la resolución lo vamos comentando.
Aca van las respuestas. Hice todas bien, pero me quedo sin responder la 5. Cualquier duda, la aclaramos.

1. V
2. V
3. F
4. F
5. -
6. F
7. V
Me quedé para ver la corrección y me dijeron que la 5 era falsa.
(06-12-2016 13:04)Omnipresent escribió: [ -> ]Me quedé para ver la corrección y me dijeron que la 5 era falsa.

¿Por qué Falsa?
Escribo las 2 expresiones, compila y me da la misma salida:

http://ideone.com/mGJWZP

http://ideone.com/xJJpqJ

si da la misma salida ¿no son equivalentes?
Bruno

Me explicaron rápidamente el porqué y no entendí mucho pero básicamente me dijeron que uno es un array y otro es un puntero y que aunque en la práctica se trabaja casi de la misma manera con ambos, son distintos semánticamente. Acá: http://c.conclase.net/curso/?cap=012b
Dice que hay 2 diferencias entre array y puntero:
*Que el identificador de un array se comporta como un puntero constante, es decir, no podemos hacer que apunte a otra dirección de memoria.
*Que el compilador asocia, de forma automática, una zona de memoria para los elementos del array, cosa que no hace para los elementos apuntados por un puntero corriente.

Supongo que será por eso. Para mi es un VoF de mierda ese punto :/
Justamente una de las afirmaciones que me quedo en duda fue la 5.
Estuve un buen rato pensandolá hasta que al final me la jugué por Verdadero ya que en la practica
es lo mismo laburar con una u otra.
Ahora veo que si al compañero le dijeron que era falsa me restó un punto.

Pensandolo bien es Falsa ya que para el análisis semántico char[] y char* son dos tipos de datos distintos,
y justamente esta etapa es donde se chequean los tipos. Alguien que la tenga mas clara podrá hacer su aporte..

La otra fue la 3 donde preguntan por a++++b, esa no la respondí. En un momento pensé que era Falsa por no estar
inicializadas las variables pero no me la quise jugar.
Si les sirve, uno de los profe me dijo que los vf ya son una tendencia, osea, van a tratar de tomar c y las cosas q vienen tomando; los prácticos son "volatiles" refiriéndose a que son azarosos
La 5 la explica el libro de C, lo que pasa es que uno es un vector y el otro es un puntero a "..". Si vos al vector lo queres cambiar podes, al puntero si vos le queres cambiar el contenido es un resultado indefinido. Por eso...no es lo mismo!

Los anexos eran las Bnf de C que pueden encontrarla en el pdf de bruno "sintaxis c"
Estaba la de iteracion y seleccion. La de iteracion tenia una opcion mas para for
La cosa con el conjunto primero, es que primero habia que pasar esa GIC a Gic LL(1) y dps hacerle el conjunto primero que era basicamente switch, for, if, do,while . Yo explique en el final que la GIC dada no era LL1 ( y el conjunto primero, como ya sabemos, son los noterminales que pueden ser el simbolo de preanalisis para saber por dodne expandirse) Por que tenias dos posibilidades para el IF y el FOR... entonces por donde empieza si son iguales? por eso es que habia que hacer eso! Entonces use las dos reglas (va solo la de factor comun) y lo cambie. La parte del IF era igual a la del libro pero la de for, la saque ahi!... como factor comun use "for ( " por que dps de eso ya no era comun.
Te podias confundir con la bnf por que era otra anotacion, pero algo que siempre es claro que los noterminales siempre estan por lo menos una vez del lado izquierdo... un terminal jamas puede estar del lado izquierdo.
Lo de ambigua lo pueden encontrar en el volumen dos, por que para una misma expresion/sentencia tenes dos formas de derivarlo. Primero lo derive con if (exp) sent y dps con if (exp) sent else sent y con ambas llegas al mismo resultado, reemplazando convenientemente.

Y el de los tokens mi respuesta fue " for ( ; ; ) e ; " (pongo las comillas solo aca) ahi se ven los 7 tokens. Puede coincidir con ansi c, pero traqnuilamente pueden inventar la gramatica =)
(06-12-2016 17:40)JPfx escribió: [ -> ]Justamente una de las afirmaciones que me quedo en duda fue la 5.
Estuve un buen rato pensandolá hasta que al final me la jugué por Verdadero ya que en la practica
es lo mismo laburar con una u otra.
Ahora veo que si al compañero le dijeron que era falsa me restó un punto.

Pensandolo bien es Falsa ya que para el análisis semántico char[] y char* son dos tipos de datos distintos,
y justamente esta etapa es donde se chequean los tipos. Alguien que la tenga mas clara podrá hacer su aporte..

La otra fue la 3 donde preguntan por a++++b, esa no la respondí. En un momento pensé que era Falsa por no estar
inicializadas las variables pero no me la quise jugar.

La verdad yo aprendí C hace bastante y no sabía que se podía inicializar el contenido de un puntero así:

char * x = "ab";

Para eso justamente usaba los arrays, char x[]= "ab";

Ambas funcionan, la diferencia como dijo Omnipresent es que el primero podes cambiar donde apunta x después, mientras que en el 2do es constante. Supongo que por eso es falso, aunque ambos reservan 3 lugares de memoria para guardar 'a', 'b' y '\0'. No creo que sea falso por usar "ab" o {'a','b','\0'}, eso es notación nada más pero significa lo mismo a la hora de inicializar.

Con respecto al 3, es falsa porque no se puede incrementar el incremento digamos. Sería como hacer:
a + 1 = a + 1, no cumple con que el lvalue sea una variable y no una expresión.
Podes hacer a+++b que vendría a ser a++ + b, que suma a + b y devuelve el resultado y luego incrementa a.

Sobre el final tengo una consulta para el que sepa, yo voy a darlo la semana que viene seguramente, de autómatas suelen tomar algo?
Yo curse con Barca y en el primer parcial tomo 2 de autómatas, y en el 2do 3. Osea todo lo que no era C, era autómatas. Ahora veo que casi ni le dan bola a eso en el final.
Hola damianvc31, soy Juan Pablo. Cursamos juntos.
Curiosamente en este final ni mencionaron autómatas, pero de los finales que vi siempre toman algo.

Excelente la justificación de la afirmación 3, es falsa sin dudas.

Dejo mis respuestas...

Practica
Usando la gramática para sentencias de ANSI C que describió CarooLina

1. Primero(sentencia) = {if, switch, do, while, for}
Era solo utilizando la parte de A del anexo que hacia referencia a sentencia-condición y sentencia-iteración.

2. Era valida y la gramática era ambigua, ya que había dos producción para if y for.

3. for ( ; ; ) e;
Sentencia de iteracion con 7 tokens.


Afirmaciones

1. V
2. V - Los 5 tokens son {a, ++, ++, +, b}
3. -
4. F - Es un literal cadena perfectamente valido.
5. V - Pise el palito es F como ya se aclaro...
6. F - Es al revés el scanner toma lexemas para generar tokens.
7. V - Según la jerarquía de Chomsky cada LF tiene su gramática que lo genera.
Que sea ambigua no implica que haya dos de if y for, por que citando el ejemplo del libro...

E => E + E
E => num

num + num + num tiene dos derivaciones, es ambigua y es asi de simple. La de if es ambigua por que lo probe para justificar pero la de for no me acuerdo bien la segunda para asegurarlo. Que se repita lo unico que te da indicio que no es GIC LL(1) y nada mas.

6) Igual yo puse F por que al scanner le entran caracteres y le salen tokens. No le entran lexemas
(07-12-2016 17:40)JPfx escribió: [ -> ]Hola damianvc31, soy Juan Pablo. Cursamos juntos.
Curiosamente en este final ni mencionaron autómatas, pero de los finales que vi siempre toman algo.

Excelente la justificación de la afirmación 3, es falsa sin dudas.

Dejo mis respuestas...

Practica
Usando la gramática para sentencias de ANSI C que describió CarooLina

1. Primero(sentencia) = {if, switch, do, while, for}
Era solo utilizando la parte de A del anexo que hacia referencia a sentencia-condición y sentencia-iteración.

2. Era valida y la gramática era ambigua, ya que había dos producción para if y for.

3. for ( ; ; ) e;
Sentencia de iteracion con 7 tokens.


Afirmaciones

1. V
2. V - Los 5 tokens son {a, ++, ++, +, b}
3. -
4. F - Es un literal cadena perfectamente valido.
5. V - Pise el palito es F como ya se aclaro...
6. F - Es al revés el scanner toma lexemas para generar tokens.
7. V - Según la jerarquía de Chomsky cada LF tiene su gramática que lo genera.

Ahhh que haces che? xD

Ojala tomen algo de automatas porque lo otro ni lo practicamos. Igual si toma como este vengo bien porque hay mucho C.
en la practica hay 2 opciones, como hicieron en los finales de mitad de año, toman parecido; o que tomen diferente y seguramente tomen automatas.
respecto a los VF segun un profe van a tomar C.
esperemos que sea como el final del 11/07 y 25/07 del 2016
Estoy preparando el final para el Lunes. Veo que es mucho de Ansi C. De donde recomiendan que deberia estudiar eso?
Páginas: 1 2
URLs de referencia