Está en la página 1de 9

CI3725 - Traductores e Interpretadores Abril-Julio 2006 Prof.

Ernesto Hern andez-Novich

Laboratorio Semana XI
Parser Predictivo no Recursivo Es una m aquina de estados que consta de: Una pila que contiene s mbolos de la gram atica, m as un s mbolo especial ($) para indicar el fondo de la pila. Un apuntador al siguiente elemento de la entrada. Al comenzar la ejecuci on de la m aquina apunta al primer caracter de la entrada. Un mecanismo de emisi on para presentar por salida los n umeros asociados a las producciones de la gram atica que han sido utilizadas. Al terminar la ejecuci on del parser, la salida tendr a las producciones necesarias para conseguir una derivaci on m as izquierda de la cadena suministrada en la entrada, a partir del s mbolo inicial de la gram atica. Una tabla de parsing predictivo que controla el funcionamiento de la m aquina de estados. La tabla de reglas (N ) indica la producci on que deben utilizarse en cada caso. C omo funciona? La ejecuci on de una m aquina de parsing predictivo no recursivo es como sigue: 1. Al comenzar el procesamiento de una cadena la pila contiene el s mbolo inicial de la gram atica y se apunta al primer caracter de la entrada. 2. Se observa el s mbolo X en el tope de la pila y el s mbolo terminal a que est a en la entrada: a ) Si X = $ a = $, quiere decir que la pila ha sido vaciada y que se ha consumido toda la entrada, por tanto la m aquina se detiene anunciando el exito del reconocimiento. b ) Si X = a X = $, quiere decir que el s mbolo al tope de la pila coincide con el siguiente de la entrada, por tanto se consume la entrada y se retira el tope de la pila. c ) Si X N , la m aquina consulta reglas[X, a]: 1) Si la tabla contiene una producci on X Y1 Y2 . . . Yk , se emite por la salida la producci on, se retira X del tope de la pila y se empilan Yk . . . Y2 Y1 de modo que Y1 quede en el tope de la pila. 2) Si la tabla no contiene una producci on, se termina la ejecuci on indicando el error. Construcci on de la Tabla de Parsing Predictivo No Recursivo El algoritmo de construcci on consiste en para toda producci on A de la gram atica: 1. a a F IRST () reglas[A, a] = A 2. Si F IRST () entonces b F OLLOW (A) reglas[A, b] = A 3. Si F IRST () $ F OLLOW (A) reglas[A, $] = A Aquellas posiciones de la tabla que queden vac as despu es de considerar todas las producciones, ser an completadas con error.

Ejemplo 1 Construyamos la tabla de parsing predictivo no recursivo para la gram atica E E E T T T F F Observemos que F IRST (E ) = F IRST (T ) = F IRST (F ) = {(, id} TE +T E FT F T (E ) id

F IRST (E ) = {+, } F IRST (T ) = {, } F OLLOW (E ) = F OLLOW (E ) = {), $} F OLLOW (T ) = F OLLOW (T ) = {+, ), $} F OLLOW (F ) = {+, , ), $} Ahora aplicamos el algoritmo de construcci on. Observamos las producciones: Para E T E , como F IRST (T E ) = F IRST (T ) tenemos reglas[E, (] E T E y reglas[E, id] E TE . Para E +T E , como F IRST (+T E ) = {+} tenemos reglas[E , +] +T E . Para E , usamos F OLLOW (E ) y tenemos reglas[E , )] E y reglas[E , $] E . Para T F T , como F IRST (F T ) = F IRST (F ) tenemos reglas[T, (] T F T y reglas[T, id] T FT . Para T F T , como F IRST (F T ) = {} tenemos reglas[T , ] T F T . Para T , usamos F OLLOW (T ) y tenemos reglas[T , +] T , reglas[T , )] T y reglas[T , $] T . Para F (E ), como F IRST ((E )) = {(} tenemos reglas[F, (] F (E ). Para F id, como F IRST (id) = {id} tenemos reglas[F, id] F id. Y la tabla nos queda como sigue (los espacios vac os llevan error) id E TE T FT T F id T F T F (E ) + E +T E T FT T T ( E TE ) E $ E

E E T T F

Cuadro 1: Tabla de Parsing Predictivo No-Recursivo para el Ejemplo 1

Ilustraremos el funcionamiento del parser predictivo no recursivo utilizando la tabla para hacer el an alisis de la cadena id + id id$ que pertenece al lenguaje. En la tabla, la pila crece hacia la derecha (n otese el uso de $ para indicar el fondo de la pila). Pila $E $E T $E T F $E T id $E T $E $E T + $E T $E T F $E T id $E T $E T F $E T F $E T id $E T $E $ Entrada id + id id$ id + id id$ id + id id$ id + id id$ +id id$ +id id$ +id id$ id id$ id id$ id id$ id$ id$ id$ id$ $ $ $ Salida E TE T FT F id T E +T E T FT F id T F T F id T E Detalles Estado inicial. Aplicar reglas[E, id] Aplicar reglas[T, id] Aplicar reglas[F, id] Consumir id y desempilar. Aplicar reglas[T , +] Aplicar reglas[E , +] Consumir + y desempilar. Aplicar reglas[T, id] Aplicar reglas[F, id] Consumir id y desempilar. Aplicar reglas[T , ] Consumir y desempilar. Aplicar reglas[F, id] Consumir id y desempilar. Aplicar reglas[T , $] Aplicar reglas[E , $] Entrada aceptada.

Cuadro 2: Ejecuci on del Parser Predictivo No-Recursivo N otese que lo emitido por la salida representa las producciones que deben utilizarse para obtener una derivaci on m as izquierda en la gram atica para la cadena suministrada en la entrada. Concretamente:

TE FT E idT E idE id+T E id+F T E id + idT E id + idF T E id + id idT E id + id idE id + id id

Ejemplo 2 Consideremos la gram atica S S S S E 3 iE tSS a eS b

Observemos F IRST (S ) F IRST (S ) = {i , a } = {e}

F IRST (E ) = {b} F OLLOW (S ) = F OLLOW (S ) = {e, $} F OLLOW (E ) y construyamos la tabla de parsing predictivo no recursivo a Sa b e S eS | Eb i S iE tSS t $ S = {t}

S S E

Cuadro 3: Tabla de Pasing Predictivo No Recursivo para el Ejemplo 2 La entrada para reglas[S , e] contiene tanto a S eS como a S . La gram atica es ambigua y esto se maniesta al existir m as de una producci on susceptible de ser seleccionada cuando se recibe un e en la entrada. Podemos resolver la ambiguedad decidiendo por S eS puesto que si escogemos la otra producci on jam as se consumir an los e de la entrada. Una gram atica cuya tabla de parsing predictivo no tiene ninguna entrada con deniciones m ultiples se denomina LL(1). Ninguna gram atica ambigua puede ser LL(1) y tampoco puede serlo una gram atica recursiva por izquierda. De hecho, puede mostrarse que si se tienen dos producciones A y A , entonces: Si deriva una cadena que comienza con un terminal a entonces no deriva ninguna cadena que comience con a y viceversa. Alguna de las dos producciones nunca deriva en . Si entonces no deriva ninguna cadena que comience con terminales en F OLLOW (A). Ejemplo 3 Construyamos una tabla de parsing predictivo no recursivo para la gram atica S S (L) a L,S S

L L

Primero debemos eliminar la recursi on izquierda en la tercera producci on, para convertir la gram atica en S S (L) a SR ,S

L R R En seguida calculamos

F IRST (S ) = F IRST (L) F IRST (R) F OLLOW (S ) F OLLOW (L) = F OLLOW (R) 4

= {(, a} = {,, } = {$, ), ,} = {)}

lo cual nos permite calcular la tabla ( S (L) L SR ) a Sa L SR , $

S L R

R ,S

Cuadro 4: Tabla de Pasing Predictivo No Recursivo para el Ejemplo 3 Comprobaremos su funcionamiento procesando la cadena (a, (a, a)) que pertenece al lenguaje Pila $S $)L( $)L $)RS $)Ra $)R $)S, $)S $))L( $))L $))RS $))Ra $))R $))S, $))S $))a $)) $) $ Entrada (a, (a, a))$ (a, (a, a))$ a, (a, a))$ a, (a, a))$ a, (a, a))$ , (a, a))$ , (a, a))$ (a, a))$ (a, a))$ a, a))$ a, a))$ a, a))$ , a))$ , a))$ a))$ a))$ ))$ )$ $ Salida S (L) L SR Sa R ,S S (L) L SR Sa R ,S Sa Detalles Estado inicial. Aplicar reglas[S, (] Consumir ( y desempilar. Aplicar reglas[L, a] Aplicar reglas[S, a] Consumir a y desempilar. Aplicar reglas[R, ,] Consumir , y desempilar. Aplicar reglas[S, (] Consumir ( y desempilar. Aplicar reglas[L, a] Aplicar reglas[S, a] Consumir a y desempilar. Aplicar reglas[R, ,] Consumir , y desempilar. Aplicar reglas[S, a] Consumir a y desempilar. Consumir ) y desempilar. Consumir ) y desempilar. Entrada aceptada.

Cuadro 5: Ejecuci on del Parser Predictivo No-Recursivo para el Ejemplo 3 N otese que lo emitido por la salida representa las producciones que deben utilizarse para obtener una derivaci on m as izquierda en la gram atica para la cadena suministrada en la entrada. Concretamente: S Ejemplo 4 Construyamos una tabla de parsing predictivo no recursivo para la gram atica de expresiones regulares sobre {a, b} R 5 R+R (L) (SR) (aR) (a,S ) (a, (L)) (a, (SR)) (a, (aR)) (a, (a,S )) (a, (a, a))

R R R R R

RR R (R) a b

preservando la precedencia y asociatividad habitual de los operadores. Comenzamos por eliminar la ambig uedad pero preservando las precedencias, de la misma manera que hicimos en el mismo ejercicio (Semana VI), quedando S S C C E E T T T S +C C CE E T T (S ) a b

Ahora, a un cuando no hay ambig uedad, tenemos recursion por izquierda en los s mbolos no terminales S y C , adem as de tener lados derechos con el mismo prejo para el no terminal E . Eliminamos el primer problema y factorizamos a la izquierda para el segundo problema, quedando S R R C CR +CR EL EL TU (S ) a b

L L E U U T T T y ahora calculamos

F IRST (S ) = F IRST (C ) = F IRST (E ) = F IRST (T ) F IRST (R)

= {a, b, (} = {+, }

F IRST (L) = {a, b, (, } F IRST (U ) = {, } F OLLOW (S ) = F OLLOW (R) = {$, )} F OLLOW (C ) = F OLLOW (L) = {$, +, )} F OLLOW (E ) = F OLLOW (U ) = {$, a, b, (, ), +} F OLLOW (T ) lo cual nos permite calcular la tabla 6 = {$, a, b, (, ), +, }

S R C L E U T

a S CR C EL L EL E TU U T a

b S CR C EL L EL E TU U T b

( S CR C EL L EL E TU U T (S )

) R L U

+ R +CR L U

$ R L

Cuadro 6: Tabla de Pasing Predictivo No Recursivo para el Ejemplo 4 Comprobaremos su funcionamiento procesando la cadena (a + b) (ab + b) que pertenece al lenguaje

Pila $S $RC $RLE $RLU T $RLU )S ( $RLU )S $RLU )RC $RLU )RLE $RLU )RLU T $RLU )RLU a $RLU )RLU $RLU )RL $RLU )R $RLU )RC + $RLU )RC $RLU )RLE $RLU )RLU T $RLU )RLU b $RLU )RLU $RLU )RL $RLU )R $RLU ) $RLU $RL $RL $RLE $RLU T $RLU )S ( $RLU )S $RLU )RC $RLU )RLE $RLU )RLU T $RLU )RLU a $RLU )RLU $RLU )RL $RLU )RLE $RLU )RLU T $RLU )RLU b $RLU )RLU $RLU )RL $RLU )R $RLU )RC + $RLU )RC $RLU )RLE $RLU )RLU T $RLU )RLU b $RLU )RLU $RLU )RL $RLU )RL $RLU )R $RLU ) $RLU $RL $RL $R $

Entrada (a + b) (ab + b) $ (a + b) (ab + b) $ (a + b) (ab + b) $ (a + b) (ab + b) $ (a + b) (ab + b) $ a + b) (ab + b) $ a + b) (ab + b) $ a + b) (ab + b) $ a + b) (ab + b) $ a + b) (ab + b) $ +b) (ab + b) $ +b) (ab + b) $ +b) (ab + b) $ +b) (ab + b) $ b) (ab + b) $ b) (ab + b) $ b) (ab + b) $ b) (ab + b) $ ) (ab + b) $ ) (ab + b) $ ) (ab + b) $ ) (ab + b) $ (ab + b) $ (ab + b) $ (ab + b) $ (ab + b) $ (ab + b) $ (ab + b) $ ab + b) $ ab + b) $ ab + b) $ ab + b) $ ab + b) $ b + b) $ b + b) $ b + b) $ b + b) $ b + b) $ +b) $ +b) $ +b) $ +b) $ b) $ b) $ b) $ b) $ ) $ ) $ )$ )$ )$ $ $ $ $ $

Salida S CR C EL E TU T (S ) S CR R EL E TU T a U L R +CR C EL E TU T b U L R U L EL E TU T (S ) S CR C EL R TU T a U L EL E TU T b U L R +CR C EL E TU T b U L R U 8 L R

Detalles Estado inicial. Aplicar reglas[S, (] Aplicar reglas[C, (] Aplicar reglas[E, (] Aplicar reglas[T, (] Consumir ( y desempilar. Aplicar reglas[S, a] Aplicar reglas[C, a] Aplicar reglas[E, a] Aplicar reglas[T, a] Consumir a y desempilar. Aplicar reglas[U, +] Aplicar reglas[L, +] Aplicar reglas[R, +] Consumir + y desempilar. Aplicar reglas[C, b] Aplicar reglas[E, b] Aplicar reglas[T, b] Consumir b y desempilar. Aplicar reglas[U, )] Aplicar reglas[L, )] Aplicar reglas[R, )] Consumir ) y desempilar. Aplicar reglas[U, ] Consumir y desempilar. Aplicar reglas[L, (] Aplicar reglas[E, (] Aplicar reglas[T, (] Consumir ( y desempilar. Aplicar reglas[S, a] Aplicar reglas[C, a] Aplicar reglas[E, a] Aplicar reglas[T, a] Consumir a y desempilar. Aplicar reglas[U, b] Aplicar reglas[L, b] Aplicar reglas[E, b] Aplicar reglas[T, b] Consumir b y desempilar. Aplicar reglas[U, +] Aplicar reglas[L, +] Aplicar reglas[R, +] Consumir + y desempilar. Aplicar reglas[C, b] Aplicar reglas[E, b] Aplicar reglas[T, b] Consumir b y desempilar. Aplicar reglas[U, ] Consumir y desempilar. Aplicar reglas[L, )] Aplicar reglas[R, )] Consumir ) y desempilar. Aplicar reglas[U, ] Consumir y desempilar. Aplicar reglas[L, $] Aplicar reglas[R, $] Aceptar.

N otese que lo emitido por la salida representa las producciones que deben utilizarse para obtener una derivaci on m as izquierda en la gram atica para la cadena suministrada en la entrada. Concretamente: S CR ELR T U LR (S )U LR (CR)U LR (ELR)U LR (T U LR)U LR (aU LR)U LR (aLR)U LR (aR)U LR (a+CR)U LR (a+ELR)U LR (a+T U LR)U LR (a + bU LR)U LR (a + bLR)U LR (a + bR)U LR (a + b)U LR (a + b)LR (a + b)ELR (a + b)T U LR (a + b) (S )U LR (a + b) (CR)U LR (a + b) (ELR)U LR (a + b) (T U LR)U LR (a + b) (aU LR)U LR (a + b) (aLR)U LR (a + b) (aELR)U LR (a + b) (aT U LR)U LR (a + b) (abU LR)U LR (a + b) (abLR)U LR (a + b) (abR)U LR (a + b) (ab+CR)U LR (a + b) (ab+ELR)U LR (a + b) (ab+T U LR)U LR (a + b) (ab + bU LR)U LR (a + b) (ab + bLR)U LR (a + b) (ab + bR)U LR (a + b) (ab + b)U LR (a + b) (ab + b)LR (a + b) (ab + b)R (a + b) (ab + b)

También podría gustarte