copio el PAS del ejercicio:
Void L (void)
{
R();
while (1){
switch (ProximoToken()) {
case ID: case LE: case ES: R (); break;
default: return;
}
}
}
Despues de MUCHISIMO pensarlo, y equivocarme una vez, y obviamente leer la respuesta XD encontre el porque la respuesta que dan:
La respuesta correcta es
Cita:<L>::= <R> |<R><L>
Porque ? Es complicado explicar por foro, pero te tiro un par de Tips para que tengas en cuenta cuando resuelvas estos ejercicios:
1° el nombre de la funcion te dice cual es el no terminal que implementas. Si se llama
Cita:Void L () {
ya sabes que el no terminal cuyo pas se esta implementando es <L>::=
Despues, a la derecha SOLO iran los TOKENS si en el PAS hay algun MATCH(TOKEN);
En la funcion del ejercicio se nombra el ID, LE, y ES, en un switch "ProximoTOken", lo que implica que son tokens pero.. fijate cuando analiza al entrar esos casos que NUNCA hace un MATCH ---> no tenes que poner Esos tokens en el PAS que implementas.
OTRA COSA: te piden las producciones que implementa ESE PAS, pero pensa que ese PAS esta dentro de un contexto: es llamado dentro de otro PAS, y a su vez, llama a otro PAS, por lo que tenes que "imaginar" con lo que ves, como es el contexto, para ubicarte mejor. Entonces, como se llega a
Cita:<L>::= <R> |<R><L>
Ok, sabemos que <L>::= es por el nombre del PAS.
una de las producciones es <R> porque es lo primero que hace al iniciar el PAS: llamar a otro PAS, el del no terminal R.
y despues viene la parte recursiva. Porque <R><L> ?
El <L> a la derecha es porque es recursiva a derecha, como piden.
el <R> es porque en el switch cuando se da el caso en que el proximo token sea ID, LE o ES llama a este PAS,
Alumno escribió:y entonces, porque no aparecen los tokens ID, LE, o ES ?
porque estan en una produccion mas alla de tu PAS.
Cuando vos convocas a "ProximoToken", agarra las producciones y se fija el primer token.
Una de ellas es <R>, y la otra, segun lo arme yo, es <R> <L>
Alumno escribió:Y pero entonces, donde estan los tokens ?
Cuando llamas a la funcion, y las producciones empiezan con Noterminales, busca en las producciones de ESTOS Noterminales el primer TOken.
En definitiva, lo que hace cuando la funcion ProximoToken es traer el COnjuntoPrimero, como se ve mas adelante en el libro.
Entonces, cuando trae un token, se fija si es alguno de los casos, y si es, (ID, LE o ES), ejecuta el R(), y si no, sale..
En definitiva, es como te dije del contexto: hay una produccion, que no la escribis ni la vez, pero "esta" que es
Cita:<R>::= ID|LE|ES
y son tokens (y no NoTerminales, como pusiste) porque salen de la funcion ProximoToken..
Espero que te haya servido.. me pareecio mas comodo aca que responderte tu mp de facebook, ademas asi lo podian leer todos y decirme si acerte o refutarme.
Saludos !
- Off-topic:
- Fue una visita de cortesia