SlideShare una empresa de Scribd logo
1 de 34
Descargar para leer sin conexión
Universidad Nacional San Luis Gonzaga
            Facultad de Ing. De Sistemas

                   Lenguajes y Compiladores
                      Análisis Sintáctico
                           Parte II



Teoría Lenguajes
                                              1
Análisis Ascendente

    El análisis ascendente es conocido como análisis por
    desplazamiento y reducción.
    Intenta construir el árbol sintáctico comenzando por
    las hojas y avanzando hacia la raíz.
    Se puede considerar este proceso como una
    reducción de la cadena de entrada al símbolo inicial.
    Existen los siguientes métodos:
        Sintáctico LR y sus variantes
        Sintáctico por Precedencia de operadores


Teoría Lenguajes
                                                     2
Análisis Ascendente
  Para la gramática:
  S → aABe
  A → Abc  b
  B→d
La frase abbcde se puede reducir a S:
  abbcde
  aAbcde
  aAde
  aABe
  S
Teoría Lenguajes
                                         3
Análisis Ascendente

  Se usaron las siguientes producciones:
   A→b
   A → Abc
  B→d
  S → aABe
Estas reducciones trazan la siguiente derivación por la
  derecha en orden inverso:
  S → aABe → aAde → aAbcde → abbcde


Teoría Lenguajes
                                                    4
Definición

    Si S →* αAw → αβw →* xw es a rightmost
    derivation (derivación más a la derecha)
    Se dice que αAw, αβw y xw son formas sentenciales
    derecha.
          • La forma sentencial derecha αβw puede ser reducida
            con la producción A → β a la forma sentencial αAw.
          • La subcadena β es “a handle” de αβw (mango o mando de
            αβw).
•   El análisis ascendente está basado en el uso del
    mango para encontrar la reducción a realizar

Teoría Lenguajes
                                                              5
Ejemplo

    Para la gramática
     S → Ac Bd
     A → aAb ab
     B → aBbb abb
       Para la forma sentencial aabbbbd el único mango es
       abb ya que usando B → abb, podemos reducirla a
       aBbbd que es una forma sentencial derecha. Observe
       que ab es el lado derecho de la producción A → ab
       pero ab no es mango de aabbbbd ya que de aplicar
       A → ab se tendría aAbbbd que no es una forma
       sentencial derecha.
Teoría Lenguajes
                                                       6
Ejemplo de reconocimiento

    Para la gramática
          (   1)   E→   E+E
          (   2)   E→   E*E
          (   3)   E→   (E)
          (   4)   E→   id
    Considere la cadena de entrada id + id * id
    Se muestra los pasos realizados por el analizador por
    desplazamiento y reducción.
    Note que siempre a la derecha del mango sólo hay
    símbolos terminales

Teoría Lenguajes
                                                     7
Ejemplo de reconocimiento

      Forma sentencial            Mango   Producción de
          derecha                           reducción
                   id + id * id    id     E → id
                    E + id * id    id     E → id
                    E + E * id     id     E → id
                     E + E * E    E*E     E→E * E
                         E + E    E+E     E→E + E
                              E



Teoría Lenguajes
                                                          8
Análisis Ascendente por
       desplazamiento y reducción (AADR)

    Hay que resolver dos problemas:
        Determinar el mango
        Escoger la producción para la reducción caso exista
        más de una.
    Para el análisis ascendente por desplazamiento y
    reducción se usa una pila para guardar los símbolos
    gramaticales, un buffer de entrada para la cadena a
    analizar.
    El símbolo $ sirve para marcar el fondo de la pila y el
    final de la cadena de entrada.

Teoría Lenguajes
                                                          9
AADR
             Pila        Entrada             Acción
   1. $                 id + id * id$ desplazar
   2. $id                  + id * id$ reducir por E → id
   3. $E                   + id * id$ desplazar
   4. $E +                  id * id$ desplazar
   5. $E +     id              * id$ reducir por   E → id
   6. $E +     E               * id$ desplazar
   7. $E +     E*                id$ desplazar
   8. $E +     E * id              $ reducir por   E → id
   9. $E +     E*E                 $ reducir por   E→E*E
   10. $E +    E                   $ reducir por   E→E+E
   11. $E                          $ aceptar
Teoría Lenguajes
                                                            10
AADR
    Aunque las acciones básicas realizadas por el AADR
    son el desplazamiento y la reducción, en realidad
    existen cuatro acciones:
          • Desplazar: el símbolo de la entrada se empila, se
            toma otro símbolo de entrada
          • Reducir: Desempila el tope y empila el lado
            izquierdo de la producción que se está reduciendo
          • Aceptar: fin del análisis sintáctico con éxito ($ en
            la entrada y $S en el tope de la pila)
          • Error: hay un error de sintaxis y se llama a la rutina
            de recuperación de errores

Teoría Lenguajes
                                                             11
AADR

    Para usar el método de desplazamiento y reducción
    es necesario que la gramática no sea ambigua.
    Ejemplo
     Prop → if Expr then Prop
               if Expr then Prop else Prop
               otro
    Si tenemos:
     Pila:          ... if Expr then Prop
     Entrada:       else ...$


Teoría Lenguajes
                                                   12
AADR

    Si no es posible escoger de manera única la
    producción para la reducción esa gramática no es
    LR(1).
    Ejemplo:
     1    prop → id ( lista-param)
     2    prop → exp := exp
     3    lista-param → lista-param, paramparam
     4    param → id
     5    exp → id ( lista-exp)  id
     6    lista-exp → lista-exp, exp exp

Teoría Lenguajes
                                                       13
AADR

    Si tenemos:
     Pila:             ... id1(id
     Entrada:          ,id) ...$
        ¿Cuál es la reducción a aplicar?
         Si id1 es un nombre de procedimiento entonces
        usaremos la producción 4, si id1 es un arreglo
        usaremos la producción 5.
        Una solución es que el léxico determine si el token es
        un nombre de procedimiento para lo cual tendría que
        consultar la tabla de símbolos pero ayudaría al
        sintáctico.
Teoría Lenguajes
                                                           14
Análisis Sintáctico LR

     Entrada              a   +   b   $



   Pila                  Programa para      Salida
            X              Parser LR
            Y
            Z
            $           Acción    ir-a


Teoría Lenguajes
                                               15
Análisis Sintáctico LR

    El analizador LR consta de:
        Una entrada
        Una pila
        Un programa conductor
        Una tabla de análisis sintáctico dividida en dos
        partes:
         »Acción: indica la acción del analizador.
         »Ir - a: indica las transiciones entre estados.


Teoría Lenguajes
                                                    16
Codificación de la tabla LR

    Acción
        di indica desplazar, empilar la entrada y el
        estado i
        rj indica reducir por la producción número j
        acep indica aceptar
        un blanco indica error de sintaxis
    Ir-a
        Indica el estado a empilar junto a un no
        terminal
Teoría Lenguajes
                                                   17
Uso de la tabla LR

   Normalmente se usa la sección Acción de la tabla para
   realizar un desplazamiento o una reducción
       Desplazamiento: empilar entrada y estado indicado
   Cuando se reduce se usa la sección Ir-a de la tabla:
       Desempilar hasta encontrar, en la pila, el símbolo más a
       la izquierda de la producción usada
       Accesar la tabla con la combinación
     (tope expuesto, lado izquierdo de la producción usada)
       en la sección Ir-a y empilar el lado izquierdo de la
       producción y el estado hallado en la tabla

Teoría Lenguajes
                                                           18
Ejemplo de Análisis Sintáctico LR

    Para la gramática
          (   1)   E→E+T
          (   2)   E→T
          (   3)   T→T*F
          (   4)   T→F
          (   5)   F → (E)
          (   6)   F → id


    Analizar la frase id + id * id


Teoría Lenguajes
                                          19
Ejemplo de Tabla LR
                   Estado               Acción                       ir-a
                             id    +    *   (     )    $         E     T   F
                      0     d5             d4                1        2   3
                      1           d6                  acep
                      2           r2   d7        r2   r2
                      3           r4   r4        r4   r4
                      4     d5              d4               8       2   3
                      5           r6   r6        r6   r6
                      6     d5              d4                       9   3
                      7     d5              d4                           10
                      8           d6             d11
                      9           r1   d7        r1 r1
                     10           r3   r3        r3 r3
                     11           r5   r5        r5 r5
Teoría Lenguajes
                                                                               20
Ejemplo de análisis LR

              Pila           Entrada               Acción
  (1)      0               id * id + id $   desplazar
  (2)      0 id 5             * id + id $   reducir por F → id
  (3)      0F3                * id + id $   reducir por T → F
  (4)      0T2                * id + id $   desplazar
  (5)      0 T 2* 7             id + id $   desplazar
  (6)      0 T 2* 7 id 5           + id $   reducir por F → id
  (7)      0 T 2* 7 F 10           + id $   reducir por T → T * F


Teoría Lenguajes
                                                               21
Ejemplo de análisis LR

            Pila            Entrada             Acción
(8)      0T2                    + id $   reducir por E → T
(9)      0E1                    + id $   desplazar
(10)     0E1+6                    id $   desplazar
(11)     0 E 1 + 6 id 5              $   reducir por F → id
(12)     0E1+6F3                     $   reducir por T → F
(13)     0E1+6T9                     $   E→E + T
(14)     0E1                         $   aceptar


Teoría Lenguajes
                                                         22
Ejemplo de análisis LR

    Pasos del analizador:
    Se comienza con 0 en la pila e id en la entrada
    Accion[0,id] = d5: empilar id y 5
    Acción [5,+] = r6: se usará la producción F → id para
    reducir,
    desempilar hasta encontrar id
    el tope expuesto es 0 y el no terminal del lado izquierdo
    de la producción es F
    Ir-a [0,F] = 3
    empilar F y 3

Teoría Lenguajes
                                                          23
Gramática de operadores

    Son gramáticas que cumplen:
        Ningún lado derecho de la producción es ε
        No tiene dos no terminales adyacentes
    Las gramáticas de operadores permiten la
    construcción manual de analizadores por
    desplazamiento y reducción
    Estas gramáticas permiten implementar el análisis
    sintáctico por precedencia de operadores.
    Tiene restricciones que hace que su uso sea limitado
    para un tipo especial de gramáticas.
Teoría Lenguajes
                                                     24
Ejemplos de gramáticas de operadores

    La siguiente gramática

     E → EAE  (E) -E id
     A → +  -  *  / ↑
     No es una gramática de operadores, pero se puede
       transformar fácilmente a

     E → E + EE - EE * EE / EE ↑ E (E)  -E  id
     Que sí es una gramática de operadores y permite aplicar
       el método de precedencia de operadores.

Teoría Lenguajes
                                                        25
Análisis Sintáctico por Precedencia de
      Operadores (ASPO)

    Se deben definir tres relaciones de precedencia
    disjuntas <. , >. e =. entre algunos pares de
    terminales.
    Estas reglas de precedencia guían la selección de
    mangos con el siguiente significado
            Relación              Significado
                       a cede precedencia a b
          a <. b
                       a tiene la misma precedencia que b
          a =. b
                       a tiene más precedencia que b
          a .> b
Teoría Lenguajes
                                                            26
ASPO

    Para determinar la precedencia de operadores se
    puede:
        Hacer un estudio intuitivo basado en el concepto de
        precedencia de operadores y determinar por ejemplo
        que + <. *. Esto resolverá las ambigüedades de la
        última gramática propuesta.
        Construir una gramática no ambigua que refleje la
        precedencia de operadores como la gramática usada en
        el ejemplo de análisis LR.



Teoría Lenguajes
                                                        27
ASPO

    Ejemplo de análisis por precedencia de operadores
    Relación de precedencia de operadores
                        id   +    *    $
                   id
                             .>   .>   .>
                   +
                        <.   .>   <.   .>
                   *
                        <.   .>   .>   .>
                   $
                        <.   <.   <.
Teoría Lenguajes
                                                   28
ASPO

    Dada la frase: id + id * id
    Se insertan las precedencias considerando que la
    frase comienza y termina con $.
    Para insertar la precedencia entre dos terminales se
    busca el operador de precedencia en la matriz . Para
    el primer caso caso se busca entre la fila de $ y la
    columna de id (resulta <. ).
    La cadena con las relaciones de precedencia
    resultante es: $ <. id >. + <. id >. * <. id >. $

Teoría Lenguajes
                                                        29
ASPO

    Para encontrar el mango se usa el siguiente
    algoritmo:
        Buscar desde el extremo izquierdo el primer .>

        Luego buscar hacia atrás el primer <. Saltando los    =.
        El mango es todo lo que está entre   <. y .>
    Para la frase mostrada el primer mango sería id
    entonces se reduce a E obteniendo la forma
    sentencial E + id * id. Luego de reducir todos los id
    se obtiene E + E * E.

Teoría Lenguajes
                                                             30
ASPO

    Eliminando los no terminales se tiene: $+*$
    Insertando las relaciones de precedencia se
    obtiene: $ <. + <. * .>$
    El mango es E * E que se reduce a E.
    Quedando $+$ ($E + E$) o $ <. +.> $
    El proceso se repite hasta tener $$ en la frase (sin
    considerar los no terminales).



Teoría Lenguajes
                                                     31
ASPO

    En una implementación no es necesario:
      Insertar las precedencias en la frase
      Examinar toda la frase para determinar el mango.
      Se debe usar una pila para guardar los elementos
      de la entrada ya examinados.
      Se usa la matriz de precedencia de operadores
      para determinar el mango




Teoría Lenguajes
                                                  32
Algoritmo para ASPO

    Si se cumple <. o =. entre el tope de la pila y el
    elemento de la entrada se realiza un desplazamiento
    (empilar entrada y avanza la entrada).
    Si se cumple .> ya se encontró el mango y hay que
    reducir (desempilar hasta encontrar la relación <.)
    Si no cumple ninguna relación de precedencia se ha
    detectado un error de sintaxis.




Teoría Lenguajes
                                                     33
Algoritmo para ASPO
 repetir
   si Tope(Pila) <. Entrada o Tope(Pila) =. Entrada
   entonces Empilar(Entrada, Pila)
             Lexico(Entrada)
   sino si Tope(Pila) >. Entrada
       entonces repetir
                    Desempilar(X, Pila)
                  hasta Tope(Pila) <. X
                  frepetir
        fsi
   fsi
 hasta Tope(Pila) = $ y Entrada = $
 frepetir
Teoría Lenguajes
                                                      34

Más contenido relacionado

La actualidad más candente

Repaso del lenguaje
Repaso del lenguajeRepaso del lenguaje
Repaso del lenguaje
g_torrealba
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gio
Robert Wolf
 
Expresiones logicas
Expresiones logicasExpresiones logicas
Expresiones logicas
zamand14
 
1 1 2 Datos Primitivas Y Objetos
1 1 2 Datos Primitivas Y Objetos1 1 2 Datos Primitivas Y Objetos
1 1 2 Datos Primitivas Y Objetos
UVM
 
Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1
drakul09
 
Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1
Karin Rojas Gutiérrez
 
Funciones del lenguaje ensamblador
Funciones del lenguaje ensambladorFunciones del lenguaje ensamblador
Funciones del lenguaje ensamblador
Ana Velazquez
 
Clase 3introduccion a_lenguace_c
Clase 3introduccion a_lenguace_cClase 3introduccion a_lenguace_c
Clase 3introduccion a_lenguace_c
kikeMerck
 

La actualidad más candente (20)

Repaso del lenguaje
Repaso del lenguajeRepaso del lenguaje
Repaso del lenguaje
 
Presentación 2014 profe gabriel
Presentación 2014 profe gabrielPresentación 2014 profe gabriel
Presentación 2014 profe gabriel
 
Lenguajec intorduccionui
Lenguajec intorduccionuiLenguajec intorduccionui
Lenguajec intorduccionui
 
Entornos de lenguaje c
Entornos de lenguaje cEntornos de lenguaje c
Entornos de lenguaje c
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gio
 
Compiladores1
Compiladores1Compiladores1
Compiladores1
 
Expresiones logicas
Expresiones logicasExpresiones logicas
Expresiones logicas
 
1 1 2 Datos Primitivas Y Objetos
1 1 2 Datos Primitivas Y Objetos1 1 2 Datos Primitivas Y Objetos
1 1 2 Datos Primitivas Y Objetos
 
Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1
 
Cobol
CobolCobol
Cobol
 
Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1Variables constantes-y-tipos-de-datos-1231094571639405-1
Variables constantes-y-tipos-de-datos-1231094571639405-1
 
Revista digital
Revista digitalRevista digital
Revista digital
 
3.3.- Operadores y Expresiones
3.3.- Operadores y Expresiones3.3.- Operadores y Expresiones
3.3.- Operadores y Expresiones
 
Funciones del lenguaje ensamblador
Funciones del lenguaje ensambladorFunciones del lenguaje ensamblador
Funciones del lenguaje ensamblador
 
3.2.- Identificadores, Variables y Constantes
3.2.- Identificadores, Variables y Constantes3.2.- Identificadores, Variables y Constantes
3.2.- Identificadores, Variables y Constantes
 
Identificadores en Lógia de Programación
Identificadores en Lógia de ProgramaciónIdentificadores en Lógia de Programación
Identificadores en Lógia de Programación
 
Clase 3introduccion a_lenguace_c
Clase 3introduccion a_lenguace_cClase 3introduccion a_lenguace_c
Clase 3introduccion a_lenguace_c
 
Gramatica libre de contexto
Gramatica libre de contextoGramatica libre de contexto
Gramatica libre de contexto
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
Funcionsi
FuncionsiFuncionsi
Funcionsi
 

Similar a Asa

Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)
Oliver Centeno
 
tutorial y Guia de fundamentos drscheme
tutorial y Guia de fundamentos drschemetutorial y Guia de fundamentos drscheme
tutorial y Guia de fundamentos drscheme
Hospital de Yumbo
 
Analisis sintactico10
Analisis sintactico10Analisis sintactico10
Analisis sintactico10
Emanuel Gs
 
Asignación n°4
Asignación n°4Asignación n°4
Asignación n°4
aarg90
 
22 Php. Cambios De Base Y Formatos
22 Php. Cambios De Base Y Formatos22 Php. Cambios De Base Y Formatos
22 Php. Cambios De Base Y Formatos
José M. Padilla
 

Similar a Asa (20)

Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)
 
Funciones logaritmicas
Funciones logaritmicasFunciones logaritmicas
Funciones logaritmicas
 
Curso de Python
Curso de PythonCurso de Python
Curso de Python
 
Analisis Lexico Ii
Analisis Lexico IiAnalisis Lexico Ii
Analisis Lexico Ii
 
tutorial y Guia de fundamentos drscheme
tutorial y Guia de fundamentos drschemetutorial y Guia de fundamentos drscheme
tutorial y Guia de fundamentos drscheme
 
tutorial de drscheme
tutorial de drscheme tutorial de drscheme
tutorial de drscheme
 
Tema 1
Tema 1Tema 1
Tema 1
 
Analisis sintactico10
Analisis sintactico10Analisis sintactico10
Analisis sintactico10
 
Compilador2
Compilador2Compilador2
Compilador2
 
Asignación n°4
Asignación n°4Asignación n°4
Asignación n°4
 
Capitulo 3 paul carrera,dego balcazar
Capitulo 3 paul carrera,dego balcazarCapitulo 3 paul carrera,dego balcazar
Capitulo 3 paul carrera,dego balcazar
 
Fundamentos de programación I.pptx
Fundamentos de programación I.pptxFundamentos de programación I.pptx
Fundamentos de programación I.pptx
 
Claselexico
ClaselexicoClaselexico
Claselexico
 
Analizador Sintáctico
Analizador SintácticoAnalizador Sintáctico
Analizador Sintáctico
 
Expresiones Regulares
Expresiones RegularesExpresiones Regulares
Expresiones Regulares
 
I S A
I S AI S A
I S A
 
22 Php. Cambios De Base Y Formatos
22 Php. Cambios De Base Y Formatos22 Php. Cambios De Base Y Formatos
22 Php. Cambios De Base Y Formatos
 
Expresiones regulares2.pdf
Expresiones regulares2.pdfExpresiones regulares2.pdf
Expresiones regulares2.pdf
 
Programación Lógica con PROLOG
Programación Lógica con PROLOGProgramación Lógica con PROLOG
Programación Lógica con PROLOG
 

Asa

  • 1. Universidad Nacional San Luis Gonzaga Facultad de Ing. De Sistemas Lenguajes y Compiladores Análisis Sintáctico Parte II Teoría Lenguajes 1
  • 2. Análisis Ascendente El análisis ascendente es conocido como análisis por desplazamiento y reducción. Intenta construir el árbol sintáctico comenzando por las hojas y avanzando hacia la raíz. Se puede considerar este proceso como una reducción de la cadena de entrada al símbolo inicial. Existen los siguientes métodos: Sintáctico LR y sus variantes Sintáctico por Precedencia de operadores Teoría Lenguajes 2
  • 3. Análisis Ascendente Para la gramática: S → aABe A → Abc  b B→d La frase abbcde se puede reducir a S: abbcde aAbcde aAde aABe S Teoría Lenguajes 3
  • 4. Análisis Ascendente Se usaron las siguientes producciones: A→b A → Abc B→d S → aABe Estas reducciones trazan la siguiente derivación por la derecha en orden inverso: S → aABe → aAde → aAbcde → abbcde Teoría Lenguajes 4
  • 5. Definición Si S →* αAw → αβw →* xw es a rightmost derivation (derivación más a la derecha) Se dice que αAw, αβw y xw son formas sentenciales derecha. • La forma sentencial derecha αβw puede ser reducida con la producción A → β a la forma sentencial αAw. • La subcadena β es “a handle” de αβw (mango o mando de αβw). • El análisis ascendente está basado en el uso del mango para encontrar la reducción a realizar Teoría Lenguajes 5
  • 6. Ejemplo Para la gramática S → Ac Bd A → aAb ab B → aBbb abb Para la forma sentencial aabbbbd el único mango es abb ya que usando B → abb, podemos reducirla a aBbbd que es una forma sentencial derecha. Observe que ab es el lado derecho de la producción A → ab pero ab no es mango de aabbbbd ya que de aplicar A → ab se tendría aAbbbd que no es una forma sentencial derecha. Teoría Lenguajes 6
  • 7. Ejemplo de reconocimiento Para la gramática ( 1) E→ E+E ( 2) E→ E*E ( 3) E→ (E) ( 4) E→ id Considere la cadena de entrada id + id * id Se muestra los pasos realizados por el analizador por desplazamiento y reducción. Note que siempre a la derecha del mango sólo hay símbolos terminales Teoría Lenguajes 7
  • 8. Ejemplo de reconocimiento Forma sentencial Mango Producción de derecha reducción id + id * id id E → id E + id * id id E → id E + E * id id E → id E + E * E E*E E→E * E E + E E+E E→E + E E Teoría Lenguajes 8
  • 9. Análisis Ascendente por desplazamiento y reducción (AADR) Hay que resolver dos problemas: Determinar el mango Escoger la producción para la reducción caso exista más de una. Para el análisis ascendente por desplazamiento y reducción se usa una pila para guardar los símbolos gramaticales, un buffer de entrada para la cadena a analizar. El símbolo $ sirve para marcar el fondo de la pila y el final de la cadena de entrada. Teoría Lenguajes 9
  • 10. AADR Pila Entrada Acción 1. $ id + id * id$ desplazar 2. $id + id * id$ reducir por E → id 3. $E + id * id$ desplazar 4. $E + id * id$ desplazar 5. $E + id * id$ reducir por E → id 6. $E + E * id$ desplazar 7. $E + E* id$ desplazar 8. $E + E * id $ reducir por E → id 9. $E + E*E $ reducir por E→E*E 10. $E + E $ reducir por E→E+E 11. $E $ aceptar Teoría Lenguajes 10
  • 11. AADR Aunque las acciones básicas realizadas por el AADR son el desplazamiento y la reducción, en realidad existen cuatro acciones: • Desplazar: el símbolo de la entrada se empila, se toma otro símbolo de entrada • Reducir: Desempila el tope y empila el lado izquierdo de la producción que se está reduciendo • Aceptar: fin del análisis sintáctico con éxito ($ en la entrada y $S en el tope de la pila) • Error: hay un error de sintaxis y se llama a la rutina de recuperación de errores Teoría Lenguajes 11
  • 12. AADR Para usar el método de desplazamiento y reducción es necesario que la gramática no sea ambigua. Ejemplo Prop → if Expr then Prop  if Expr then Prop else Prop  otro Si tenemos: Pila: ... if Expr then Prop Entrada: else ...$ Teoría Lenguajes 12
  • 13. AADR Si no es posible escoger de manera única la producción para la reducción esa gramática no es LR(1). Ejemplo: 1 prop → id ( lista-param) 2 prop → exp := exp 3 lista-param → lista-param, paramparam 4 param → id 5 exp → id ( lista-exp)  id 6 lista-exp → lista-exp, exp exp Teoría Lenguajes 13
  • 14. AADR Si tenemos: Pila: ... id1(id Entrada: ,id) ...$ ¿Cuál es la reducción a aplicar? Si id1 es un nombre de procedimiento entonces usaremos la producción 4, si id1 es un arreglo usaremos la producción 5. Una solución es que el léxico determine si el token es un nombre de procedimiento para lo cual tendría que consultar la tabla de símbolos pero ayudaría al sintáctico. Teoría Lenguajes 14
  • 15. Análisis Sintáctico LR Entrada a + b $ Pila Programa para Salida X Parser LR Y Z $ Acción ir-a Teoría Lenguajes 15
  • 16. Análisis Sintáctico LR El analizador LR consta de: Una entrada Una pila Un programa conductor Una tabla de análisis sintáctico dividida en dos partes: »Acción: indica la acción del analizador. »Ir - a: indica las transiciones entre estados. Teoría Lenguajes 16
  • 17. Codificación de la tabla LR Acción di indica desplazar, empilar la entrada y el estado i rj indica reducir por la producción número j acep indica aceptar un blanco indica error de sintaxis Ir-a Indica el estado a empilar junto a un no terminal Teoría Lenguajes 17
  • 18. Uso de la tabla LR Normalmente se usa la sección Acción de la tabla para realizar un desplazamiento o una reducción Desplazamiento: empilar entrada y estado indicado Cuando se reduce se usa la sección Ir-a de la tabla: Desempilar hasta encontrar, en la pila, el símbolo más a la izquierda de la producción usada Accesar la tabla con la combinación (tope expuesto, lado izquierdo de la producción usada) en la sección Ir-a y empilar el lado izquierdo de la producción y el estado hallado en la tabla Teoría Lenguajes 18
  • 19. Ejemplo de Análisis Sintáctico LR Para la gramática ( 1) E→E+T ( 2) E→T ( 3) T→T*F ( 4) T→F ( 5) F → (E) ( 6) F → id Analizar la frase id + id * id Teoría Lenguajes 19
  • 20. Ejemplo de Tabla LR Estado Acción ir-a id + * ( ) $ E T F 0 d5 d4 1 2 3 1 d6 acep 2 r2 d7 r2 r2 3 r4 r4 r4 r4 4 d5 d4 8 2 3 5 r6 r6 r6 r6 6 d5 d4 9 3 7 d5 d4 10 8 d6 d11 9 r1 d7 r1 r1 10 r3 r3 r3 r3 11 r5 r5 r5 r5 Teoría Lenguajes 20
  • 21. Ejemplo de análisis LR Pila Entrada Acción (1) 0 id * id + id $ desplazar (2) 0 id 5 * id + id $ reducir por F → id (3) 0F3 * id + id $ reducir por T → F (4) 0T2 * id + id $ desplazar (5) 0 T 2* 7 id + id $ desplazar (6) 0 T 2* 7 id 5 + id $ reducir por F → id (7) 0 T 2* 7 F 10 + id $ reducir por T → T * F Teoría Lenguajes 21
  • 22. Ejemplo de análisis LR Pila Entrada Acción (8) 0T2 + id $ reducir por E → T (9) 0E1 + id $ desplazar (10) 0E1+6 id $ desplazar (11) 0 E 1 + 6 id 5 $ reducir por F → id (12) 0E1+6F3 $ reducir por T → F (13) 0E1+6T9 $ E→E + T (14) 0E1 $ aceptar Teoría Lenguajes 22
  • 23. Ejemplo de análisis LR Pasos del analizador: Se comienza con 0 en la pila e id en la entrada Accion[0,id] = d5: empilar id y 5 Acción [5,+] = r6: se usará la producción F → id para reducir, desempilar hasta encontrar id el tope expuesto es 0 y el no terminal del lado izquierdo de la producción es F Ir-a [0,F] = 3 empilar F y 3 Teoría Lenguajes 23
  • 24. Gramática de operadores Son gramáticas que cumplen: Ningún lado derecho de la producción es ε No tiene dos no terminales adyacentes Las gramáticas de operadores permiten la construcción manual de analizadores por desplazamiento y reducción Estas gramáticas permiten implementar el análisis sintáctico por precedencia de operadores. Tiene restricciones que hace que su uso sea limitado para un tipo especial de gramáticas. Teoría Lenguajes 24
  • 25. Ejemplos de gramáticas de operadores La siguiente gramática E → EAE  (E) -E id A → +  -  *  / ↑ No es una gramática de operadores, pero se puede transformar fácilmente a E → E + EE - EE * EE / EE ↑ E (E)  -E  id Que sí es una gramática de operadores y permite aplicar el método de precedencia de operadores. Teoría Lenguajes 25
  • 26. Análisis Sintáctico por Precedencia de Operadores (ASPO) Se deben definir tres relaciones de precedencia disjuntas <. , >. e =. entre algunos pares de terminales. Estas reglas de precedencia guían la selección de mangos con el siguiente significado Relación Significado a cede precedencia a b a <. b a tiene la misma precedencia que b a =. b a tiene más precedencia que b a .> b Teoría Lenguajes 26
  • 27. ASPO Para determinar la precedencia de operadores se puede: Hacer un estudio intuitivo basado en el concepto de precedencia de operadores y determinar por ejemplo que + <. *. Esto resolverá las ambigüedades de la última gramática propuesta. Construir una gramática no ambigua que refleje la precedencia de operadores como la gramática usada en el ejemplo de análisis LR. Teoría Lenguajes 27
  • 28. ASPO Ejemplo de análisis por precedencia de operadores Relación de precedencia de operadores id + * $ id .> .> .> + <. .> <. .> * <. .> .> .> $ <. <. <. Teoría Lenguajes 28
  • 29. ASPO Dada la frase: id + id * id Se insertan las precedencias considerando que la frase comienza y termina con $. Para insertar la precedencia entre dos terminales se busca el operador de precedencia en la matriz . Para el primer caso caso se busca entre la fila de $ y la columna de id (resulta <. ). La cadena con las relaciones de precedencia resultante es: $ <. id >. + <. id >. * <. id >. $ Teoría Lenguajes 29
  • 30. ASPO Para encontrar el mango se usa el siguiente algoritmo: Buscar desde el extremo izquierdo el primer .> Luego buscar hacia atrás el primer <. Saltando los =. El mango es todo lo que está entre <. y .> Para la frase mostrada el primer mango sería id entonces se reduce a E obteniendo la forma sentencial E + id * id. Luego de reducir todos los id se obtiene E + E * E. Teoría Lenguajes 30
  • 31. ASPO Eliminando los no terminales se tiene: $+*$ Insertando las relaciones de precedencia se obtiene: $ <. + <. * .>$ El mango es E * E que se reduce a E. Quedando $+$ ($E + E$) o $ <. +.> $ El proceso se repite hasta tener $$ en la frase (sin considerar los no terminales). Teoría Lenguajes 31
  • 32. ASPO En una implementación no es necesario: Insertar las precedencias en la frase Examinar toda la frase para determinar el mango. Se debe usar una pila para guardar los elementos de la entrada ya examinados. Se usa la matriz de precedencia de operadores para determinar el mango Teoría Lenguajes 32
  • 33. Algoritmo para ASPO Si se cumple <. o =. entre el tope de la pila y el elemento de la entrada se realiza un desplazamiento (empilar entrada y avanza la entrada). Si se cumple .> ya se encontró el mango y hay que reducir (desempilar hasta encontrar la relación <.) Si no cumple ninguna relación de precedencia se ha detectado un error de sintaxis. Teoría Lenguajes 33
  • 34. Algoritmo para ASPO repetir si Tope(Pila) <. Entrada o Tope(Pila) =. Entrada entonces Empilar(Entrada, Pila) Lexico(Entrada) sino si Tope(Pila) >. Entrada entonces repetir Desempilar(X, Pila) hasta Tope(Pila) <. X frepetir fsi fsi hasta Tope(Pila) = $ y Entrada = $ frepetir Teoría Lenguajes 34