Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
“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.
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
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:
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.
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.
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
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