UTNianos

Versión completa: [CONSULTA] SSL - Finales sobre ungetc
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas gente, mientras estuve haciendo finales surgieron dudas de los que hablan sobre ungetc, dejo fragmentos de los enunciados (con link) y mi planteo + duda
tengo algunos otros ejercicios con más dudas jaja, pero dejo estos mientras tanto que quizás también pueda ayudar a otros
Gracias

Parcial 2018-12-17 Link

Problema
Analice la siguiente expresión:

a[i]=f(i)

Indique por lo menos tres tokens que no requieran ungetc para su detección

Resolución dice que son: [, ], (, )

Mi planteo + Duda
El scanner entiendo que haría la lectura de la siguiente manera..
1. a <- getchar (se lee una vez, idem con los otros 3,5,..)
2. [ <- ungetc porque [ no es identificador, por tanto 2 getchar (se lee dos veces)
3. i <- getchar
4. ] <- ungetc porque ] no es identificador, por tanto 2 getchar (se lee dos veces)
5. = <- getchar
6. f <- ungetc porque f no es operador, por tanto 2 getchar (se lee dos veces)
7. ( <- ungetc porque ( no es identificador, por tanto 2 getchar (se lee dos veces)
8. i <- getchar
9. ) <- ungetc porque ) no es identificador, por tanto 2 getchar (se lee dos veces)

No entiendo por que dice que los corchetes por ejemplo no necesitarían ungetc

Parcial 2020-02-12 Link

Problema
1. Indique cuántas invocaciones a ~ungetc~ son necesarias para *analizar léxicamente* el cuerpo de la función
2. Indique cuantas invocaciones a ~getchar~ son necesarias para detectar el *lexema* ~42~


int f(int x){
if(0)return 1;
return 42;
}


Mi planteo + Duda
1. if <- dos getchar, (dos lecturas)
2. ( <- ungetc porque ( no es identificador, por tanto 2 getchar
3. 0 <- getchar
4. ) <- ungetc porque ) no es identificador, por tanto 2 getchar
5. return <- 6 getchar (6 lecturas)
6. 1 <- ungetc porque 1 no es identificador, por tanto 2 getchar
7. ; <- ungetc porque ; no es constante real, por tanto 2 getchar
8. return <- 6 getchar
9. 4 <- ungetc porque 4 no es identificador, por tanto 2 getchar
10. 2 <- getchar
11. ; <- ungetc porque ; no es constante real, por tanto 2 getchar

La cantidad de ungetc coincide con la resolución, mi duda es si está bien analizado

Parcial 2020-03-03 Link

Enunciado
Dado el fragmento: 0xF+F0x+0L+L0
1. Indique cuantas invocaciones a getchar se necesitan para su análisis:
2. Indique cuantas invocaciones a ungetc se necesitan para su análisis:

Mi planteo + Duda
Cant. de llamadas a getchar: 19
Cant. de llamadas a ungetc: 6

1. 0xF <- 3 llamadas a getchar (3 lecturas, una por cada caracter)
2. + <- ungetc porque el + no es una constante entera, por tanto son 2 getchar (la primera lectura, y una nueva)
3. F0x <- ungetc porque F no es un operador, por tanto 2 getchar + 2 getchar (por los caracteres 0x)
4. + <- ungetc porque + no es un identificador, por tanto 2 getchar (la primera vez que lo leyó, más una nueva)
5. 0L <- ungetc porque 0 no es un operador, por tanto 2 getchar + 1 getchar (por la L)
6. + <- ungetc porque + no es una constante entera, por tanto 2 getchar
7. L0 <- ungetc porque L no es un operador, por tanto 2 getchar + 1getchar (por el 0)

Mi duda esta en que me da 1 llamada menos a getchar y ungetc, será por el EOF? ó que me olvidé?
Buenas! estoy estudiando para rendir en esta fecha. No se si ya rendiste pero contesto por lo que entiendo.

En el primero: vos le haces ungetc a [] y () porque justamente son centinelas de los identificadores previos, pero cuando lees el corchete por ejemplo, no necesitas hacer ungetc a la "i" porque no existen identificadores (por regla de BNF en C) que empiecen con [] () ni palabras reservadas que empiecen con [] (), ni nada que no sea únicamente el carácter de puntuación [, ], (, ). Por ende no necesitan un centinela porque conocemos ya la secuencia, entonces el scanner lee directamente el símbolo y sigue sin hacer el ungetc porque ya sabe que símbolo es.

en el segundo: me dio igual

en el tercero: También me dio igual que vos y estoy con la duda si el 7mo ungetc es lo ultimo de la secuencia, que al ser un identificador (L0) para saber cuando termina el nombre lee el siguiente espacio en blanco y lo devuelve con un ungetc. Lo que tambien pensé y no estoy seguro es que si lo que hay después de L0 fuera un fdt/eof, lo lee y se da cuenta que no es un carácter valido para nombre de identificador, entonces lo toma como centinela, no lo analiza aún y lo devuelve con un ungetc. Cuando retoma, retoma por lo ultimo devuelto por el ungetc y ahi se da cuenta que terminó y finaliza.
URLs de referencia