Sei sulla pagina 1di 5

Maria Jose Barrera Ronquillo.

S7M
Compiladores

Analizador sintáctico LR
Los analizadores sintácticos LR, también conocidos como Parser LR, son un tipo de analizadores para
algunas gramáticas libres de contexto. Pertenece a la familia de los analizadores ascendentes, ya que
construyen el árbol sintáctico de las hojas hacia la raíz.
Utilizan la técnica de análisis por desplazamiento reducción.
Existen tres tipos de parsers LR: SLR (K), LALR (K) y LR (K) canónico.
Un analizador LR consta de:

 Un programa conductor
 Una entrada
 Una salida
 Una tabla de análisis sintáctico, compuesta de dos partes (ACCIÓN Y GOTO).
Cabe acotar que el programa conductor es siempre igual, solo variando para cada lenguaje la tabla de análisis
sintáctico.
El algoritmo para reconocer cadenas es el siguiente: dado el primer carácter de la cadena y el estado inicial de
la tabla, buscar qué acción corresponde en la tabla de acción.
Si el estado es shift n (n ∈ N), se coloca el carácter y el número de estado n en la pila, se lee el siguiente
carácter y repite el procedimiento, solo que esta vez buscando en el estado correspondiente.
SI ACCIÓN = REDUCE n (n ∈ N), se sacan de la pila tantas tuplas (estado, símbolo) como el largo de la cola
de la producción en el n-ésimo lugar, y se reemplaza por la cabeza de esta producción. El nuevo estado sale de
buscar en la tabla GOTO usando para ubicarlo el número de estado que quedó en el tope de la pila, y el no
terminal en la cabeza.
Analizador Sintáctico de abajo hacia arriba

 Es un proceso de Reducción, que construye el parser a partir de las hojas (símbolos de la cadena de
entrada), y encuentra hacia arriba los nodos, hasta llegar a la raíz.
 En cada paso de la reducción, una subcadena de símbolos - que coincide con el lado derecho de una
producción- es reemplazada con el no terminal del lado izquierdo de la producción.
 Encuentra la derivación más derecha
Ejemplo analizador de abajo hacia arriba

Mando (handle) de una cadena

 “Handle” (mando o control) de una cadena es una subcadena que coincide con el lado derecho de una
producción, y cuya reducción al no terminal de la izquierda representa un paso en la derivación por la
derecha (en forma inversa).
Si S *⇒ αAw *⇒ αβw, entonces A → β es un handle de αβw (la cadena w contiene símbolos
terminales solamente)
Maria Jose Barrera Ronquillo.
S7M
Compiladores
 Poda de mandos: Obtiene de forma inversa la derivación por la derecha.

Analizador Sintáctico Ascendente por desplazamiento/reducción

 Usa una pila y un puntero a la cadena de entrada.


 Se basa en cuatro operaciones:
Desplazar: pone un símbolo de la entrada en el tope de la pila.
Reducir: desapila algunos símbolos que son el cuerpo de una producción y los reemplaza por la cabeza.
Aceptar
Detectar error

Análisis Sintáctico desplazamiento / reducción

El analizador sintáctico (parser), desplaza (shift) cero o más símbolos de la entrada al tope de la pila, hasta que
un mando (handle) β está en el tope de la pila. Entonces reduce β al no terminal del lado izquierdo de la regla
de producción que aplica.
Analizador Sintáctico Ascendente por desplazamiento/reducción

Conflictos durante el análisis desplazamiento/reducción

 Fallo desplazamiento/reducción
 Fallo reducción/reducción
¿Cómo saber si desplazar o reducir?

 Para saberlo se debe llevar cuenta de que parte de una producción ha sido ya reconocida en la cadena
de entrada.
 Ítem LR (0): es una producción con un punto en algún sitio de la parte derecha.
 Colección canónica LR (0).
Maria Jose Barrera Ronquillo.
S7M
Compiladores
 Autómata LR (0).

Ítems LR (0)
 Ítems:
 Un ítem LR (0) de una gramática G, es una regla de producción de G, con un punto en alguna posición
del lado derecho.
 Por ejemplo, la regla E ® E + T, genera los ítems:

A ® є, genera el ítem: A ® ·

Ítems LR (0)

 Conjuntos de Ítems:
Un ítem no determina el estado de un parser
Por ejemplo, los ítems:

Para determinar el estado de un parser se consideran conjuntos de ítems


Los conjuntos de ítems serán los estados del autómata determinista LR (0).

Colección Canónica LR (0)

 Gramática Aumentada:
 Si G es una gramática con símbolo inicial S, entonces, G’ -la gramática G aumentada- es con
un nuevo símbolo de inicio S, tal que S ® S
 Este nuevo símbolo (S’) se crea para indicar al analizador que detenga el proceso y acepte la
entrada (la cadena se acepta cuando se hace el reduce por S’ ® S)

Formalización

Vamos a analizar los pasos que hemos dado en el análisis anterior fijándonos solo en los elementos de la pila
que no eran estados. Podemos representar los pasos mediante la siguiente tabla:
Maria Jose Barrera Ronquillo.
S7M
Compiladores
Si observas la concatenación de la pila con la entrada, te darás cuenta de que se obtienen los pasos de la
derivación por la derecha en orden inverso. Podemos ver el funcionamiento del analizador de la siguiente
forma:

 La pila junto con la entrada que falta por analizar es un paso de la derivación de la entrada original.
 Si la pila termina en un sufijo que sea la parte derecha de la regla que se empleó en el paso anterior de
la derivación, lo sustituye por la parte izquierda, de modo que se retrocede un paso en el análisis. Por
eso, reconstruimos la derivación en orden inverso.
 Si no tenemos una parte derecha, avanzamos en la entrada hasta encontrar alguna.

Construcción del autómata de prefijos viables

Para construir este autómata necesitamos en primer lugar un procedimiento para construir los estados. Antes
lo hemos hecho de manera intuitiva; la formalización es muy sencilla. Si tenemos un conjunto de ítems que
representa las situaciones en que “podemos estar” durante el análisis, lo que hay que hacer es aumentarlo para
que incluya todos aquellos ítems en los que también podemos estar. Para ello utilizamos la operación de
clausura.

El siguiente algoritmo hace el cálculo para un conjunto de ítems I:

Algoritmo clausura(I);
repetir
I0 := I;
para todo hAi ! _· hBi_ 2 I0 : hBi 2 N hacer
I := I [ {hBi ! · | hBi ! 2 P}
fin para todo
hasta I = I0
devolver I
fin clausura.

Análisis Sintáctico LR

 Pueden ser construidos para reconocer virtualmente todas las construcciones de los lenguajes de
programación, para los que se puede escribir una gramática libre de contexto.
 Es el método más general de parser desplazamiento/reducción sin back tracking.
 Las gramáticas que pueden ser analizadas con parser predictivo (top-down) son un subconjunto de las
gramáticas que pueden ser analizadas con parser LR.
 Detecta errores sintácticos tan pronto como es posible hacerlo recorriendo izquierda-a-derecha de la
entrada

Algoritmo de análisis sintáctico LR


Maria Jose Barrera Ronquillo.
S7M
Compiladores

Gramáticas LR

 Una gramática para la cual se puede construir una tabla de parsing LR.
 Significa que un parser shift-reduce, que lee la entrada de izquierda a derecha, sea capaz de reconocer
los mandos, cuando aparecen en el tope de la pila.
 El parser toma la decisión de acuerdo con el estado que está en el tope de la pila, y con los siguientes
k símbolos de la cadena de entrada Þ gramática LR(k) (reconoce la ocurrencia del lado derecho de una
producción, teniendo lo que se ha derivado y k símbolos hacia adelante).
 Las gramáticas LR pueden describir más lenguajes que las gramáticas LL.

Ejemplo LR

Comparación entre analizadores sintácticos LR(k) y LL(k).


La colección de analizadores sintácticos LR(k) es más poderosa que la de los analizadores LL(k) (por ejemplo
ningún LL(k) puede manejar el lenguaje{ : } { : } x n N x y n N n n n Î È Î que si es manejable por LR(1)).
Existen lenguajes independientes del contexto que ningún analizador LR(k) puede reconocer. Un analizador
LR(k) debe ser determinista y, puesto que su estructura se basa en un autómata de pila, se debe deducir que
los analizadores sintácticos LR(k) sólo pueden analizar los lenguajes que aceptan los autómatas de pila
deterministas.

Potrebbero piacerti anche