SOFTWARE DE GENERACIÓN Y SIMULACIÓN DE TABLAS DE ANÁLISIS SINTÁCTICO (BURGRAM)
Portada > Los algoritmos de análisis sintáctico > Análisis Sintáctico Ascendente > Construcción de las tablas de análisis LALR

Construcción de las tablas de análisis LALR

El análisis LALR (lookahead-LR), es el que se utiliza normalmente en la práctica porque las tablas de análisis que genera son mucho más pequeñas que las del análisis LR canónico.

Por ejemplo, un analizador LR para un lenguaje como Pascal puede tener miles de estados, mientras que con un análisis SLR o LALR se pueden tener solo cientos de estados.

La reducción de estados es bastante significativa.

El inconveniente es que el conjunto de gramáticas que reconoce es menor que el LR, pero con el análisis LALR se pueden expresar la mayoría de los lenguajes de programación.

Lo que se hace en el análisis LALR es buscar estados con el mismo núcleo, es decir, estados que se diferencian únicamente en los símbolos de anticipación. Y se fusionan formando un único estado. Por ejemplo en el autómata anterior se puede ver que los estados 3 y 6 tienen el mismo núcleo.

Estado 3:

Estado 6:

Al realizar la fusión quedaría

El resultado final de fusionar los estados equivalentes puede verse en la siguiente figura (Figura 41). Como puede verse los estados equivalentes eran el (3, 6), (8, 9) y el (4, 7).

Figura 41: Autómata generada mediante el método LALR

Con lo que se puede comprobar que la reducción del número de estados es considerable. Ahora solo queda saber las consecuencias de realizar esta fusión de estados.

Supóngase que se tiene una gramática LR que no tiene conflictos de análisis. A continuación se fusionan los estados con el mismo núcleo, ahora queda resolver la cuestión de saber las consecuencias de dicha fusión. La fusión hecha puede tener un conflicto nuevo que no existía en el análisis LR, pero no es probable. El único conflicto nuevo que se puede generar, es un conflicto reducción/reducción, porque al unir dos estados puede pasar que en dos items de reducción de dos estados se tenga algún símbolo de anticipación común. Al estar separados en el análisis LR, no hay conflicto pero al juntarlos se genera el conflicto.

Por ejemplo, en la siguiente gramática

S→aAd|bBd|aBe|bAe

A→c

B→c

Al hacer el análisis LR no se genera ningún conflicto, pero al juntar los estados 6 y 9 se genera un conflicto nuevo reducción/reducción.

Estado 6:

Estado 9:

Nuevo estado:

Como puede verse hay dos items que reducen por el mismo terminal (d), con lo cual se genera un nuevo conflicto (reducción/reducción), que no existía en el análisis LR.

El otro conflicto es el desplazamiento/reducción, pero en el análisis LALR sólo puede ocurrir si previamente el análisis LR ya lo tenía, ya que la fusión de estados tiene que ver con juntar los símbolos de anticipación y estos símbolos no tienen nada que ver con los desplazamientos.

Construcción de la tabla de Acción/Ir_A

Las tablas de análisis LALR se pueden construir directamente a partir de una gramática, pero es más fácil construirlas a partir del conjunto de estados LR. Lo primero que se hace es fusionar los estados con el mismo núcleo, y a partir de este nuevo conjunto de estados generar de la misma forma que el análisis LR la tabla de acción y la de Ir_A.

En la siguiente tabla (Tabla 6) puede verse el resultado de generar la tabla de análisis del autómata de la figura 41. Como se puede ver, el método LALR ha conseguido reducir de 10 estados que generaba el LR a 7 estados que genera LALR.



c

d

$

S

C

0

D36

D47


1

2

1



ACEPTAR



2

D36

D47



5

36

D36

D47



89

47

R3

R3

R3



5



R1



89

R2

R2

R2



Tabla 6: Tabla de análisis LALR