La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Análisis sintáctico LR: SLR (LR simple)

Presentaciones similares


Presentación del tema: "Análisis sintáctico LR: SLR (LR simple)"— Transcripción de la presentación:

1 Análisis sintáctico LR: SLR (LR simple)

2 Ventajas de los analizadores sintácticos LR
Los analizadores sintácticos son construidos por tablas, similar a los analizadores sintácticos LL no recursivos. El análisis sintáctico LR es atractivo por varias razones: Pueden construirse analizadores sintácticos LR para reconocer prácticamente todas las construcciones de lenguajes de programación para las cuales puedan escribirse gramáticas libres de contexto. El método de análisis sintáctico LR es el método de análisis sintáctico de desplazamiento reducción sin rastreo hacia atrás más general que se conoce a la fecha. Un AS LR puede detectar un error sintáctico tan pronto como sea posible en una exploración de izquierda a derecha en la entrada. La clase de gramáticas que pueden analizarse mediante los métodos LR es un superconjunto propio de la clase de gramáticas que pueden analizarse con métodos predictivos o LL.

3 Desventajas Su principal desventaja es que es demasiado trabajo construir un analizador sintáctico LR en forma manual para una gramática común de un lenguaje de programación.

4 Los elementos y el autómata LR(0)
Un elemento LR (0) de una gramática G es una producción de G con un punto en cierta posición del cuerpo. Por ejemplo la producción A XYZ produce los siguientes elementos: A.XYZ AX.YZ AXY.Z AXYZ. La producción Aε genera solo un elemento A.

5 Una colección de conjuntos de elementos LR(0), conocida como la colección LR(0) canónica, proporciona la base para construir un autómata finito determinístico, el cual se utiliza para tomar decisiones en el análisis sintáctico. Para construir la colección LR(0) canónica de una gramática, definimos una gramática aumentada y dos funciones, CERRADURA e ir__A. Si G es una gramática con el símbolo inicial S, entonces G’ es G con un nuevo símbolo inicial S’ y la producción S’S

6 Cerradura de I ConjuntoDeElementos CERRADURA(I) { J=I repeat
for (cada elemento A α.Bβ en J) for (cada producción B .γ de G) if (B .γ no está en J) agregar B .γ a J until no se agreguen mas elementos a J en una ronda return J }

7 Ejemplo: E´ E E  E + T | T T  T * F | F F  ( E ) | id Si I={E’.E}, entonces CERRADURA (I) Contiene el conjunto {E’.E, E.E+T, E.T, T.T*F, T.F, F.(E), F.id}

8 La función ir__A Función ir__A(I,X), donde I es un conjunto de elementos y X es un símbolo gramatical. ir__A (I,X) se define como la cerradura del conjunto de todos los elementos A αX.β, de tal forma que A α.Xβ se encuentre en I. Ejemplo: Si I={E’E., EE.+T} entonces ir__A(I,+)={EE+.T, T.T*F, T.F, F.(E), F.id}

9 + T E id + * T * id id F ( T id F E ) ( ) ) F F I1 E’E. EE.+T I6
T.T*F T.F F.(E) F.id I9 EE+T. TT.*F I0 E’.E E.E+T E.T T.T*F T.F F.(E) F.id id + * T I2 ET. ET.*F * I7 TT*.F F.(E) F.id id I10 TT*F. id F ( T I5 Fid. id I4 F(.E) E.E+T E.T T.T*F T.F F.(E) F.id F E ) I11 F(E). I8 EE.+T F(E.) ( ) ) F F I3 TF.

10 El algoritmo de análisis sintáctico LR
Códigos para las acciones: si significa desplazar y meter el estado i en la pila. rj significa reducir mediante la produccion enumerada como j, acc significa aceptar Espacio en blanco significa error

11 Algoritmo: Construcción de una tabla de análisis sintáctico SLR
Entrada: Una gramática aumentada G’ Salida: Las funciones ACCION e ir_A para G’ de la tabla de análisis sintáctico SLR. Método: Construir C={I0, I1, …, In}, la colección de conjuntos de elementos LR(0) para G’. El estado i se construye a partir de Ii. Las acciones de análisis sintáctico i se determinan de la siguiente forma: Si [Aα.aβ] está en Ii e ir__A(Ii,a)=Ij, entonces establecer ACCION[i.a] a “desplazar j”. Aquí, a debe ser un terminal. Si [A α.] esta en Ii, entonces establecer ACCION[i,a] a “reducir A α” para toda a en SIGUIENTE(A); aquí, A tal vez no sea S’. Si [S’S.] esta en Ii, entonces establecer ACCION[i,$] a “aceptar”. Si resulta cualquier acción conflictiva debido a las reglas anteriores, decimos que la gramática no es SLR(1). El algoritmo no produce un analizador sintáctico en este caso.

12 3. Las transiciones de ir__A para el estado i se construyen para todos lo no terminales A usando la regla: Si ir__A(Ii, A)=Ij, entonces ir__A[i,A]=j. 4. Todas las entradas que no esten definidas por las reglas (2) y (3) se dejan como “error”. 5. El estado inicial del analizador sintáctico es el que se construyó a partir del conjunto de elementos que contienen [S’.S].

13 EE + T ET TT * F TF F( E ) Fid Entrada ACCION Ir__A id + * ( ) $
s5 s4 1 2 3 s6 acc r2 s7 r4 4 8 5 r6 6 9 7 10 s11 r1 r3 11 r5 EE + T ET TT * F TF F( E ) Fid

14 Algoritmo de análisis sintáctico LR.
Entrada: Una cadena de entrada w y una tabla de análisis sintáctico LR con las funciones ACCION e ir__A, para una gramática G. Salida: Si w está en L(G), los pasos de reducción de un análisis sintáctico ascendentes para w, en cualquier otro caso, una indicación de error. Método: Al principio, el analizador sintáctico tiene s0 en su pila, en donde s0 es el estado inicial y w$ está en el búfer de entrada. hacer que a sea el primer símbolo de w$ while (1) { hacer que s sea el estado en la parte superior de la pila; if (ACCION[s,a]=desplazar t) { meter t en la pila; hacer que a sea el siguiente símbolo de entrada; } else if (ACCION[s,a]=reducir Aβ ) { sacar |β| estados de la pila y sustituir los símbolos β por A; sea t el estado que esta en el tope de la pila; meter ir__A[t,A] en la pila; enviar de salida la producción Aβ; } else if (ACCION[s,a]=aceptar) break; else llamar a la rutina de recuperación de errores; }

15 Pila Símbolos Entrada Accion
0 id*id$ s5 0 5 id *id$ r6 0 F *id$ r4 0 3 T *id$ s7 T* id$ s5 T*id $ r6 T*F $ r3 T $ r2 0 2 T $ 0 1 E acc


Descargar ppt "Análisis sintáctico LR: SLR (LR simple)"

Presentaciones similares


Anuncios Google