Gramáticas Independientes del Contexto
Lenguajes Formales y de Programación Vacaciones Diciembre 2010
Basado en el capítulo 5 del libro:
Introducción a la Teoría de Autómatas, Lenguajes y Computación
J. Hopcroft, et al. 2002
2010 Lenguajes Formales y de Programación 2
Gramáticas independientes del contexto
• Los lenguajes generados por gramáticas independientes del contexto son una clase más amplia de lenguajes que los regulares.
• Ayudo a la implementación del analizador sintáctico.
• Entre algunos elementos están los árboles sintácticos que representan gráficamente la estructura de la gramática.
2010 Lenguajes Formales y de Programación 3
Gramáticas independientes del contexto
• Además existen los autómatas a pila que es un mecanismo para describir lenguajes independientes del contexto.
2010 Lenguajes Formales y de Programación 4
Definición de GIC
• Hay cuatro componentes importantes en la descripción gramatical:
– Un conjunto finito de símbolos o alfabeto que se llamarán símbolos terminales.
– Un conjunto finito de variables, o símbolos no terminales.
– Un símbolo inicial que pertenece a los símbolos no terminales.
– Un conjunto de producciones o reglas
Definición de GIC
G=(N, T, S, P)
Ejemplo 1
• Mostrar las reglas o producciones que definen cadenas palíndromas que se generar a través del alfabeto {0, 1}.
• La base es que por cada 0 del lado izquierdo aparezca un 0 del lado derecho, y de igual forma para el símbolo 1.
0..0 1..1
2010 Lenguajes Formales y de Programación 7
Ejemplo 1
P 0 P 0 P 1 P 1 P 0 P 1 P ε
2010 Lenguajes Formales y de Programación 8
Ejemplo 2
• Mostrar las producciones de una gramática que genere el lenguaje descrito por las operaciones aritméticas + y *, además de la aplicación de (), utilizando solamente los símbolos 0 y 1.
2010 Lenguajes Formales y de Programación 9
Ejemplo 2
E E + E E E * E E ( E ) E V V 0 V 1
2010 Lenguajes Formales y de Programación 10
Derivaciones
• Es uno de lo métodos para inferir que ciertas cadenas pertenecen al lenguaje.
• Otro método es la inferencia recursiva, pasando del cuerpo a la cabeza.
• En la derivación utilizamos las producciones pasando de la cabeza al cuerpo, es decir, sustituyendo el cuerpo por una producción.
2010 Lenguajes Formales y de Programación 11
Ejemplo 3
• Inferir si la cadena 1*(0+1) pertenece al lenguaje generado por la gramática del ejemplo 2.
EE*EV*E1*E1*(E)
1*(E+E)1*(V+E)1*(0+E)
1*(0+V)1*(0+1)
2010 Lenguajes Formales y de Programación 12
Derivación izquierda y derecha
• Derivación izquierda es aquella que reemplaza la variable situada más a la izquierda.
• Del mismo modo la derivación derecha es aquella que reemplaza la variable situada más a la derecha.
2010 Lenguajes Formales y de Programación 13
Ejemplo 4
• Derivación izquierda:
EE*EV*E1*E1*(E)
1*(E+E)1*(V+E)1*(0+E)
1*(0+V)1*(0+1)
• Derivación derecha:
EE*EE*(E)E*(E+E)E*(E+V)
E*(E+1)E*(V+1)E*(0+1)
V*(0+1)1*(0+1)
2010 Lenguajes Formales y de Programación 14
Árboles de derivación
• Las derivaciones se pueden representar en forma de árbol.
• Llamado árbol de derivación.
• La principal funcionalidad es que el árbol se utiliza en los compiladores para representar estructuras sintácticas del programa fuente.
2010 Lenguajes Formales y de Programación 15
Construcción de árboles de derivación
• Cada nodo interior está etiquetado por una variable.
• Cada nodo hoja está etiqueta por una variable, un terminal o un ε. Si es por ε la hoja debe ser única.
2010 Lenguajes Formales y de Programación 16
Ejemplo 5
• Supongamos la gramática de expresiones, la derivación V+E se puede representar así:
E
E + E
V
Ejemplo 6
• Construya el árbol de derivación para la derivación P0110
P
0 P 0
1 P 1
ε
Ambigüedad en las gramáticas
• Supongamos la forma sentencial E+E*E, puede generarse a través de:
– EE+EE+E*E – EE*EE+E*E
2010 Lenguajes Formales y de Programación 19
Ambigüedad en la gramáticas
• Arboles de derivación distintos:
E E
E + E E * E
E * E E + E
2010 Lenguajes Formales y de Programación 20
Eliminación de ambigüedad
• No hay un algoritmo efectivo para convertir una gramática ambigua a una no ambigua, debido a que hay gramáticas inherentemente ambiguas, es decir, es imposible quitarles la ambigüedad.
• Hay dos problemas que generan la ambigüedad:
– No respetar la precedencia – Utilización de operados idénticos
2010 Lenguajes Formales y de Programación 21
Eliminación de ambigüedad
• La forma más común es forzar la precedencia, introduciendo más variables:
– Un factor es una expresión que no puede separarse por ningún operados + o * adyacente.
– Un término es una expresión que no puede ser separada por el operados +.
– Expresión es una expresión posible, incluyendo las que pueden separarse por operadores + o * adyacentes.
2010 Lenguajes Formales y de Programación 22
Eliminación ambigüedad
• Tomando en cuenta la gramática de operadores, una gramática no ambigua sería:
F V | (E) T F | T*F E T | E+T V 0 | 1
2010 Lenguajes Formales y de Programación 23
FIN
2010 Lenguajes Formales y de Programación 24
Cuestionario
1. Diseñar una GIC que genere el lenguaje que contiene el conjunto {0n1n|n>=1}
2. Obtener las derivaciones más a la izquierda y más a la derecha de la cadena 00101, que es generado por la siguiente gramática:
S A1B A 0A | ε B 0B | 1B | ε
2010 Lenguajes Formales y de Programación 25
Cuestionario (solución)
1. S 0S1 | 01
2. Derivaciones
– Izquierda: S => A1B => 0A1B => 00A1B => 001B
=> 0010B => 00101B => 00101
– Derecha: S => A1B => A10B => A101B => A101
=> 0A101 => 00A101 => 00101
2010 Lenguajes Formales y de Programación 26