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 LR

Construcción de las tablas de análisis LR

La clave del análisis LR son las reducciones, mientras que en análisis SLR se hacía la reducción por todos los seguidores de la parte izquierda del item a reducir, en el LR solo se hace la reducción por los símbolos de anticipación del item.

Para realizar el análisis LR hay que modificar la función de cierre y la de la generación de la tabla de acción.

Cálculo del cierre

Al calcular el cierre de un item de un estado en el análisis SLR, lo que se hacía era ver el símbolo a la derecha del marcador y crear nuevos items (si no existían previamente), con las producciones donde el símbolo marcado sea la parte izquierda. En cambio, en el análisis LR, se registra que símbolos pueden aparecer detrás del símbolo marcado, para cuando se tenga que realizar la reducción, reducir solo por estos símbolos y no por todos los seguidores.

Por ejemplo, si se tuviera el siguiente item:

El nuevo item que se genera es

Como se puede ver, se añade a los nuevos items los iniciales de la parte que le sigue al símbolo marcado, como se verá en el siguiente algoritmo (Algoritmo 12).

Por ejemplo:

S'→S

S→Ab

S→Bc

A→a

B→a

A→cBb

El cierre de I sería:

S'→S, $

S →Ab, $

S →Bc, $

A→a, b

B→a, b

A→cBb, c

Si al rellenar la tabla se llega a un conflicto (desplazamiento/reducción, reducción/reducción), el método no es aplicable y la gramática no es LR. Si no existen conflictos entonces la gramática es LR.

La ventaja del método LR es que reconoce un número mayor de lenguajes que el SLR, pero tiene el inconveniente de que las tablas de análisis son mayores.

Entrada: I, conjunto de elementos de una gramática ampliada G' = (V',T,P ' ,S ' )

Salida:

1: I: =

2: repeat

3: for all [, a] do

4: for all B P 'do

5: for all b FIRST( ) do

6: if then

7: := { [ ]}

8: end if

9: end for

10: end for

11: end for

12: until no hay cambio

Algoritmo 12: Algoritmo del cálculo del cierre LR.

Por ejemplo sea la siguiente gramática:

S→C C

C→c C

C→d

Aplicando el mismo método que se aplicó para generar la tabla de análisis SLR, pero con las nuevas versiones para el LR se generaría el autómata que se puede ver en la siguiente figura (Figura 40).

Ahora con el método LR los items incorporan los símbolos de anticipación, a diferencia del análisis LR. Por ejemplo, con el método SLR los estados 3 y 6 no hubieran existido por separado, solo hubiera habido uno de ellos. En cambio, con el método LR como sí tiene en cuenta los símbolos de anticipación, sí que son estados diferentes.

Figura 40: Autómata generada mediante el método LR

Generación de la tabla de acción

La parte de esta función que hay que modificar con respecto al análisis SLR, es la parte concerniente a la reducción. En vez de reducir por todos los símbolos seguidores, solo hay que reducir por los símbolos de anticipación. En el siguiente algoritmo (Algoritmo13) se ve el algoritmo completo.

Entrada: C, la colección canónica de estados del autómata.

Salida: Tabla de Acción

1: for all C do

2: for all item do

3: if [] and FOLLOW (, a) = then

4: Acción [, a] = Desplazar y

5: else if [] then

6: Acción [, b] = Reducir por

7: end if

8: if [] then

9: Acción [, $] = Aceptar

10: end if

11: end for

12: end for

13: Para las restantes entradas de la tabla que no están rellenadas poner ERROR.

Algoritmo 13: Algoritmo de generación de la tabla de acción

Como puede verse en la siguiente tabla (Tabla5), cuando se hace una reducción, sólo se reduce por los símbolos de anticipación.



c

d

$

S

C

0

D3

D4


1

2

1



ACEPTAR



2

D6

D7



5

3

D3

D4



8

4

R3

R3




5



R1



6

D6

D7



9

7



R3



8

R2

R2




9



R2



Tabla 5: Tabla de analisis LR

Por ejemplo, en el estado 9 hay una reducción, al generar la tabla de análisis si se utilizara el método SLR, habría que poner dicha reducción en todos los seguidores del no terminal C, que son los terminales {c, d, $}. En cambio al utilizar el método LR solo se pone la reducción en su símbolo de anticipación.