SlideShare una empresa de Scribd logo
Escritura de una
   gramática
     Clase 8
Repaso
• Un analizador sintáctico consume una
  secuencia de tokens s y produce un árbol
  sintáctico.
  Puntos importantes:
  – ¿Cómo reconocemos que s ∈ L(G)?
  – Un árbol sintáctico de s describe cómo s ∈ L(G).
  – Ambigüedad: más de un árbol sintáctico para la
    misma cadena s
  – Error: no existe árbol sintáctico para la cadena s.
  – ¿Cómo construimos el árbol sintáctico?
Ambigüedad
• Gramática
  E→ E+E  E*E  (E) int


• Cadena
  int + int + int
  int * int +int
Ejemplo de Ambiguedad
      • La cadena int + int + int tiene dos
        árboles sintácticos
          E                                   E


      E   +     E                  E              +         E


E     +   E     int                     int           E     +   E

                      + es asociativa
int       int         a la izquierda                  int       int
Ambigüedad. Ejemplo
    • La cadena int * int + int tiene dos
      árboles de derivación
          E                                E


      E   +      E                   E     *         E


E     *   E      int                 int       E     +   E
                       Tiene mayor
                       precedencia que
int        int         +                       int       int
Ambigüedad (Cont.)
• Una gramática es ambigua si tiene más de
  un árbol sintáctico para alguna cadena.
  – Equivalente, existe más de una derivación por la
    derecha o por la izquierda de alguna cadena
• La ambigüedad es mala
  – Deja el significado de algunos programas
    indefinidos.
• La ambigüedad es común en lenguajes de
  programación
  – Expresiones Aritméticas
  – IF-THEN-ELSE
Como tratar la ambigüedad
• Hay diferentes maneras de tratar con la
  ambigüedad
• El método más directo es reescribir la
  gramática de forma no ambigua.
  E → E+TT
  T → T * intint(E)
• Imponer precedencia de * sobre +
• Imponer asociatividad a la izquierda de + y *
Ambigüedad. Ejemplo


    La cadena int * int + int tiene dos árboles de derivación


            E                               E


      E    +      E                   E    *          E


E     *     E     int                int       E      +   E


int         int                                 int       int
Ambigüedad: El Else
          ambiguo
• Considere la gramática
  E → if E then E
     if E then E else E
     OTHER


• Esta gramática es ambigua.
El Else ambiguo: Ejemplo
• La expresión:
  If E1 then E2 then E3 else E4
Tiene dos árboles sintácticos               Típicamente
        if                        if        queremos la
                                            segunda forma
                           E1     if
  E1   if    E4

                           E2     E3   E4
  E2   E3
El Else ambiguo: una forma
        de repararlo
• else combina el then más cercano que no
  haya sido combinado
• Podemos describirlo en la gramática
  – (distinguiendo entre then combinados y no
    combinados)
  E → MIF /* todos los then combinados */
        UIF        /* algún then no combinado */
  MIF → if E then MIF else MIF
         OTHER
  UIF → if E then E
         If E then MIF else UIF
Describen el mismo conjunto de cadenas
El Else ambiguo: Ejemplo
             Corregido
 La expresión if E1 then E2 then E3 else E4
         if                          if


                                 E1    if
   E1   if    E4

                                 E2    E3    E4
   E2    E3

No válido por que la expresión        Un árbol sintáctico
then no es MIF                        Válido (para un UIF)
Ambigüedad
• No existe regla general para tratar la
  ambigüedad.
• Imposible convertir de manera automática
  una gramática ambigua en una no ambigua.
• Si se emplea con cuidado, la ambigüedad
  puede simplificar la gramática.
  – Algunas veces permite definiciones más naturales
  – Necesitamos mecanismos para quitar la
    ambigüedad,
Precedencia y Asociatividad
• En vez de reescribir la gramática
   – Usar la gramática más natural (ambigua)
   – Junto con declaraciones no ambiguas


• La mayoría de las herramientas permite
  precedencia y asociatividad en las
  declaraciones de gramáticas

• Ejemplos . . .
Declaraciones asociativas
    • Considere la gramática E →E+Eint
    • Ambigüedad: dos árboles de int+int+int
                                             E
          E


      E   +     E                      E         +     E


E     +   E     int                    int       E     +   E
                      Declaración de
                      asociatividad a la
int       int         izquierda %left +          int       int
Declaración de Precedencia
    • Considere la gramática
         E →E+EE*E int
    • La cadena int+int*int
                                                E
           E


      E    *      E                      E      +         E


E      +    E     int                   int         E     *   E
                        Declaración de
int         int         Precedencia: %left +        int       int
                                     % left *
Resumen
• Podemos especificar la sintaxis de un
  lenguaje empleando una GLC
• Un parser responderá si s ∈ L(G)
  – Y construirá un árbol sintáctico
  – Y lo pasará al resto de la fase de compilado.
• Siguiente clase:
  – ¿Cómo respondemos sí s ∈ L(G) y construimos
    un árbol sintáctico?
Eliminación de recursión
  por la izquierda inmediata
• Considere la gramática recursiva por la
  izquierda
  S →Sαβ
• S genera todas las cadenas comenzando con
  β seguido de un número de α´s
• Podemos reescribirla empleando recursión
  por la derecha.
  – S → βS´
  – S´ →αS´ε
Eliminación de recursión
 por la izquierda inmediata.
Ejemplo
• Considere la gramática
  – S → 1 S0 (β=1 y α=0)
  Podemos reescribir como:
   S → 1S´
   S´ →0S´ε
Eliminación de recursión
  por la izquierda inmediata
• En general
  – S →Sα1…Sαnβ1…βm
• Todas las cadenas derivadas a partir de S
  comienzan con uno de los β1…βm y continúan
  con varias instancias de α1…αn
• Reescribir como
  – S →β1S´…βmS´
  – S´ →α1S´…αnS´ε
Forma general de recursión
   izquierda inmediata
• La gramática
   – S → Aαδ
   – A→ Sβ
   También es recursiva por la izquierda por que
     S →+ Sβα

• Esta recursión por la izquierda también se puede
  eliminar
Eliminación de recursión
   por la izquierda general
• Algoritmo
  – Entrada: Una gramática G sin ciclos
    (derivaciones de la forma A ⇒+ A) o
    producciones epsilon (producciones de la
    forma A →ε)

  – Salida: Una gramática equivalente sin
    recursión por la izquierda
Eliminación de recursión
 por la izquierda general
Acomoda los no terminales en algún orden A1,A2,…,
An
Para (cada i desde 1 a n) {
  para (cada j de 1 a i-1) {
    reemplazar cada producción de la forma Ai→Ajγ
          por las producciones Ai→δ1γ|δ2γ|… | δkγ
          donde Aj→δ1|δ2|… | δk son las Aj
          producciones
  }
  eliminar la recursión por la izquierda inmediata de
  la gramática
}

Más contenido relacionado

La actualidad más candente

Lenguajes de una maquina de turing
Lenguajes de una maquina de turingLenguajes de una maquina de turing
Lenguajes de una maquina de turing
Guillermo Iván Prisco Pérez
 
Arboles
ArbolesArboles
Arboles
Karen Gimenez
 
Operadores en c_ (1)
Operadores en c_ (1)Operadores en c_ (1)
Operadores en c_ (1)
luis_ocampo27
 
Metodologiasad 1
Metodologiasad 1Metodologiasad 1
Metodologiasad 1
innovalabcun
 
Algebra relacional
Algebra relacionalAlgebra relacional
Algebra relacional
DorvinEduardo
 
Unidad 2 expresiones regulares
Unidad 2 expresiones regularesUnidad 2 expresiones regulares
Unidad 2 expresiones regulares
ROSA IMELDA GARCIA CHI
 
Topicos Avanzados de Programacion - Unidad 4 programacion concurrente
Topicos Avanzados de Programacion - Unidad 4 programacion concurrenteTopicos Avanzados de Programacion - Unidad 4 programacion concurrente
Topicos Avanzados de Programacion - Unidad 4 programacion concurrente
José Antonio Sandoval Acosta
 
C++
C++C++
Árboles Multicamino, B y B+
Árboles Multicamino, B y B+Árboles Multicamino, B y B+
Árboles Multicamino, B y B+
Alvaro Enrique Ruano
 
Tema manejo de la entrada
Tema manejo de la entradaTema manejo de la entrada
Tema manejo de la entrada
Sasil Catzim
 
TEORÍA DE GRAFOS
TEORÍA DE GRAFOSTEORÍA DE GRAFOS
TEORÍA DE GRAFOS
TERE FERNÁNDEZ
 
GRAMATICAS AMBIGUAS
GRAMATICAS AMBIGUASGRAMATICAS AMBIGUAS
GRAMATICAS AMBIGUAS
Alejandro Bolaños Ussa
 
Estructuras anidadas
Estructuras anidadasEstructuras anidadas
Estructuras anidadas
Geannina García
 
Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4
Daniel Gomez Jaramillo
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
José A. Alonso
 
Base de datos orientada a objetos vs base obje to relacion
Base de datos orientada a objetos vs base obje to relacionBase de datos orientada a objetos vs base obje to relacion
Base de datos orientada a objetos vs base obje to relacion
Alfonso Triana
 
91897836 clase-1-1-1-ecdif-teoria-preliminar
91897836 clase-1-1-1-ecdif-teoria-preliminar91897836 clase-1-1-1-ecdif-teoria-preliminar
91897836 clase-1-1-1-ecdif-teoria-preliminar
JESUS FRANCISCO CRUZ CANCHE
 
Redes petri
Redes petriRedes petri
Redes petri
giovatovar
 
Clases abstractas e interfaces
Clases abstractas e interfacesClases abstractas e interfaces
Clases abstractas e interfaces
lopezcortes
 
AUTOMATAS Y LENGUAJES FORMALES
AUTOMATAS Y LENGUAJES FORMALESAUTOMATAS Y LENGUAJES FORMALES
AUTOMATAS Y LENGUAJES FORMALES
vmtorrealba
 

La actualidad más candente (20)

Lenguajes de una maquina de turing
Lenguajes de una maquina de turingLenguajes de una maquina de turing
Lenguajes de una maquina de turing
 
Arboles
ArbolesArboles
Arboles
 
Operadores en c_ (1)
Operadores en c_ (1)Operadores en c_ (1)
Operadores en c_ (1)
 
Metodologiasad 1
Metodologiasad 1Metodologiasad 1
Metodologiasad 1
 
Algebra relacional
Algebra relacionalAlgebra relacional
Algebra relacional
 
Unidad 2 expresiones regulares
Unidad 2 expresiones regularesUnidad 2 expresiones regulares
Unidad 2 expresiones regulares
 
Topicos Avanzados de Programacion - Unidad 4 programacion concurrente
Topicos Avanzados de Programacion - Unidad 4 programacion concurrenteTopicos Avanzados de Programacion - Unidad 4 programacion concurrente
Topicos Avanzados de Programacion - Unidad 4 programacion concurrente
 
C++
C++C++
C++
 
Árboles Multicamino, B y B+
Árboles Multicamino, B y B+Árboles Multicamino, B y B+
Árboles Multicamino, B y B+
 
Tema manejo de la entrada
Tema manejo de la entradaTema manejo de la entrada
Tema manejo de la entrada
 
TEORÍA DE GRAFOS
TEORÍA DE GRAFOSTEORÍA DE GRAFOS
TEORÍA DE GRAFOS
 
GRAMATICAS AMBIGUAS
GRAMATICAS AMBIGUASGRAMATICAS AMBIGUAS
GRAMATICAS AMBIGUAS
 
Estructuras anidadas
Estructuras anidadasEstructuras anidadas
Estructuras anidadas
 
Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
 
Base de datos orientada a objetos vs base obje to relacion
Base de datos orientada a objetos vs base obje to relacionBase de datos orientada a objetos vs base obje to relacion
Base de datos orientada a objetos vs base obje to relacion
 
91897836 clase-1-1-1-ecdif-teoria-preliminar
91897836 clase-1-1-1-ecdif-teoria-preliminar91897836 clase-1-1-1-ecdif-teoria-preliminar
91897836 clase-1-1-1-ecdif-teoria-preliminar
 
Redes petri
Redes petriRedes petri
Redes petri
 
Clases abstractas e interfaces
Clases abstractas e interfacesClases abstractas e interfaces
Clases abstractas e interfaces
 
AUTOMATAS Y LENGUAJES FORMALES
AUTOMATAS Y LENGUAJES FORMALESAUTOMATAS Y LENGUAJES FORMALES
AUTOMATAS Y LENGUAJES FORMALES
 

Clase8

  • 1. Escritura de una gramática Clase 8
  • 2. Repaso • Un analizador sintáctico consume una secuencia de tokens s y produce un árbol sintáctico. Puntos importantes: – ¿Cómo reconocemos que s ∈ L(G)? – Un árbol sintáctico de s describe cómo s ∈ L(G). – Ambigüedad: más de un árbol sintáctico para la misma cadena s – Error: no existe árbol sintáctico para la cadena s. – ¿Cómo construimos el árbol sintáctico?
  • 3. Ambigüedad • Gramática E→ E+E  E*E  (E) int • Cadena int + int + int int * int +int
  • 4. Ejemplo de Ambiguedad • La cadena int + int + int tiene dos árboles sintácticos E E E + E E + E E + E int int E + E + es asociativa int int a la izquierda int int
  • 5. Ambigüedad. Ejemplo • La cadena int * int + int tiene dos árboles de derivación E E E + E E * E E * E int int E + E Tiene mayor precedencia que int int + int int
  • 6. Ambigüedad (Cont.) • Una gramática es ambigua si tiene más de un árbol sintáctico para alguna cadena. – Equivalente, existe más de una derivación por la derecha o por la izquierda de alguna cadena • La ambigüedad es mala – Deja el significado de algunos programas indefinidos. • La ambigüedad es común en lenguajes de programación – Expresiones Aritméticas – IF-THEN-ELSE
  • 7. Como tratar la ambigüedad • Hay diferentes maneras de tratar con la ambigüedad • El método más directo es reescribir la gramática de forma no ambigua. E → E+TT T → T * intint(E) • Imponer precedencia de * sobre + • Imponer asociatividad a la izquierda de + y *
  • 8. Ambigüedad. Ejemplo La cadena int * int + int tiene dos árboles de derivación E E E + E E * E E * E int int E + E int int int int
  • 9. Ambigüedad: El Else ambiguo • Considere la gramática E → if E then E if E then E else E OTHER • Esta gramática es ambigua.
  • 10. El Else ambiguo: Ejemplo • La expresión: If E1 then E2 then E3 else E4 Tiene dos árboles sintácticos Típicamente if if queremos la segunda forma E1 if E1 if E4 E2 E3 E4 E2 E3
  • 11. El Else ambiguo: una forma de repararlo • else combina el then más cercano que no haya sido combinado • Podemos describirlo en la gramática – (distinguiendo entre then combinados y no combinados) E → MIF /* todos los then combinados */  UIF /* algún then no combinado */ MIF → if E then MIF else MIF  OTHER UIF → if E then E  If E then MIF else UIF Describen el mismo conjunto de cadenas
  • 12. El Else ambiguo: Ejemplo Corregido La expresión if E1 then E2 then E3 else E4 if if E1 if E1 if E4 E2 E3 E4 E2 E3 No válido por que la expresión Un árbol sintáctico then no es MIF Válido (para un UIF)
  • 13. Ambigüedad • No existe regla general para tratar la ambigüedad. • Imposible convertir de manera automática una gramática ambigua en una no ambigua. • Si se emplea con cuidado, la ambigüedad puede simplificar la gramática. – Algunas veces permite definiciones más naturales – Necesitamos mecanismos para quitar la ambigüedad,
  • 14. Precedencia y Asociatividad • En vez de reescribir la gramática – Usar la gramática más natural (ambigua) – Junto con declaraciones no ambiguas • La mayoría de las herramientas permite precedencia y asociatividad en las declaraciones de gramáticas • Ejemplos . . .
  • 15. Declaraciones asociativas • Considere la gramática E →E+Eint • Ambigüedad: dos árboles de int+int+int E E E + E E + E E + E int int E + E Declaración de asociatividad a la int int izquierda %left + int int
  • 16. Declaración de Precedencia • Considere la gramática E →E+EE*E int • La cadena int+int*int E E E * E E + E E + E int int E * E Declaración de int int Precedencia: %left + int int % left *
  • 17. Resumen • Podemos especificar la sintaxis de un lenguaje empleando una GLC • Un parser responderá si s ∈ L(G) – Y construirá un árbol sintáctico – Y lo pasará al resto de la fase de compilado. • Siguiente clase: – ¿Cómo respondemos sí s ∈ L(G) y construimos un árbol sintáctico?
  • 18. Eliminación de recursión por la izquierda inmediata • Considere la gramática recursiva por la izquierda S →Sαβ • S genera todas las cadenas comenzando con β seguido de un número de α´s • Podemos reescribirla empleando recursión por la derecha. – S → βS´ – S´ →αS´ε
  • 19. Eliminación de recursión por la izquierda inmediata. Ejemplo • Considere la gramática – S → 1 S0 (β=1 y α=0) Podemos reescribir como: S → 1S´ S´ →0S´ε
  • 20. Eliminación de recursión por la izquierda inmediata • En general – S →Sα1…Sαnβ1…βm • Todas las cadenas derivadas a partir de S comienzan con uno de los β1…βm y continúan con varias instancias de α1…αn • Reescribir como – S →β1S´…βmS´ – S´ →α1S´…αnS´ε
  • 21. Forma general de recursión izquierda inmediata • La gramática – S → Aαδ – A→ Sβ También es recursiva por la izquierda por que S →+ Sβα • Esta recursión por la izquierda también se puede eliminar
  • 22. Eliminación de recursión por la izquierda general • Algoritmo – Entrada: Una gramática G sin ciclos (derivaciones de la forma A ⇒+ A) o producciones epsilon (producciones de la forma A →ε) – Salida: Una gramática equivalente sin recursión por la izquierda
  • 23. Eliminación de recursión por la izquierda general Acomoda los no terminales en algún orden A1,A2,…, An Para (cada i desde 1 a n) { para (cada j de 1 a i-1) { reemplazar cada producción de la forma Ai→Ajγ por las producciones Ai→δ1γ|δ2γ|… | δkγ donde Aj→δ1|δ2|… | δk son las Aj producciones } eliminar la recursión por la izquierda inmediata de la gramática }