OpenStax-CNX module: m16320 1 Gramaticas Independientes del Contexto, ejemplos y ejercicios * Carlos Arturo Cortés Fuentes This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribution License 2.0 Gramáticas Independientes del Contexto, ejemplos y ejercicios Una Gramática independientes del contexto (GIC) es una gramática formal 1 en la que cada regla de producción es de la forma: Exp x Donde Exp es un símbolo no terminal 2 y x es una cadena de terminales y/o no terminales. El término independiente del contexto se reere al hecho de que el no terminal Exp puede siempre ser sustituido por x sin tener en cuenta el contexto en el que ocurra. Un lenguaje formal 3 es independiente de contexto 4 si hay una gramática libre de contexto que lo genera, este tipo de gramática fue creada por Backus-Naur 5 y se utiliza para describir la mayoría de los lenguajes de programación. Una GIC está compuesta por 4 elementos: 1. Símbolos terminales (elementos que no generan nada) 2. No terminales (elementos del lado izquierdo de una producción, antes de la echa "- >") 3. Producciones (sentencias que se escriben en la gramática) 4. Símbolo inicial (primer elemento de la gramática) Ejemplo 1: Teniendo un lenguaje que genera expresiones de tipo: 9 + 5 2 Para determinar si una GIC esta bien escrita se utilizan los arboles de analisis sintáctico 6, así: Producciones: lista -> lista + digito lista -> lista - digito lista -> digito digito -> 0 1 2 3 4 5 6 7 8 9 Arbol de analisis sintactico: * Version 1.1: May 29, 2008 10:12 am -0500 http://creativecommons.org/licenses/by/2.0/ 1 http://es.wikipedia.org/wiki/gramática_formal 2 http://es.wikipedia.org/w/index.php?title=símbolo_no_terminal&action=edit&redlink=1 3 http://es.wikipedia.org/wiki/lenguaje_formal 4 http://es.wikipedia.org/wiki/lenguaje_libre_de_contexto 5 http://es.wikipedia.org/w/index.php?title=backus-naur_form&action=edit&redlink=1 6 http://es.wikipedia.org/w/index.php?title=arbol_de_analisi_sintacticol&action=edit&redlink=1
OpenStax-CNX module: m16320 2 Figure 1 La gramática es correcta siempre y cuando el símbolo inicial este al lado izquierdo de las producciones y sea la raíz del árbol. Ejemplo 2: Hacer una gramática que genere el número 5 Símbolo inicial (no terminal): Exp y Símbolo terminal: 5 Exp -> 5 Ejemplo 3: Hacer una gramática que genere un dígito. Exp -> 0 1 2 3 4 5 6 7 8 9 Arbol de analisis sintactico: Exp 3 Ejemplo 4: Hacer una gramática que repita muchas veces el número 5 Exp -> Exp 5 5 Prueba con el número 555
OpenStax-CNX module: m16320 3 Figure 2 Ejemplo 5: Gramática que genera muchos dígitos Exp -> Exp dig dig dig -> 0 1 2 3 4... 9 Prueba: Figure 3 Ejemplo 6: Hacer una GIC que genere un número binario Exp -> Exp bin bin bin -> 0 1 Ó con una sola producción: Exp -> Exp 0 Exp 1 0 1 Prueba:
OpenStax-CNX module: m16320 4 Figure 4 Aunque esta producción puede generar expresiones como 0000, para evitar errores como este: dig -> 1 Exp 1 Exp -> Exp 0 Exp 1 0 1 Nota 1: El símbolo inicial siempre debe estar en la primera producción de la gramática. Nota 2: Expresiones de tipo, Exp -> Exp 0 1, genera potencias de 10, ejemplo Figure 5 Ejemplo 7: Hacer una gramática que genere un conjunto de 1 seguido de un conjunto de 0, donde el número 1 debe ser impar y el número de 0 debe ser par. Exp -> unos ceros ceros -> ceros 00 00 unos -> unos 11 1
OpenStax-CNX module: m16320 5 Figure 6 Figure 7 Ejemplo 8: ¾Cuál es el lenguaje de la siguiente producción? Pal -> Pal letras letras Letras -> a b c d e f g... z R/ Es una GIC que genera palabras escritas en minúsculas. Ejemplo 9: Hacer una GIC que genere una frase cuya letra inicial de cada palabra sea mayúscula. Frase -> Frase Exp pal pal Exp -> Pal -> may pal min min -> a b c d... z may -> A B C D... Z
OpenStax-CNX module: m16320 6 Figure 8 Ejercicios 1. Hacer una gramática independiente del contexto (G.I.C), que genere nombres de persona, mínimo un nombre y un apellido, máximo dos nombres y dos apellidos. Cada nombre y apellido debe comenzar por mayúscula. Nota: Se tiene en cuenta que =vacio; no se aceptan apellidos compuestos. nombre nom nom2 esp nom nom2 nom2 esp nom nom nom min may may A B C D... Z min a b c d... z esp Árbol de análisis sintáctico
OpenStax-CNX module: m16320 7 Figure 9 2. Hacer una gramática independiente del contexto (G.I.C), que genere frases cuyas palabras empiecen en una vocal mayúscula y terminen en una consonante minúscula. En medio de la vocal mayúscula y la consonante pueden haber letras minúsculas. frase frase esp pal2 pal2 esp pal2 pal1 conmin pal1 pal2 min vocmay vocmay A E I O U min conmin vocmin conmin b c d f g... z vocnim a e i o u 3. Hacer una gramática independiente del contexto (G.I.C), que genere la sentencia condicional if con las siguientes restricciones: Siempre se va a comparar una variable con un número entero o una variable con otra variable. Los operadores relacionales son: < > ==!=
OpenStax-CNX module: m16320 8 Las variables deben empezar en una letra y después de esa letra pueden haber cualquier cantidad de números o letras. Los números solamente van a ser enteros de cualquier cantidad de dígitos. Un número no debe empezar en cero, pero puede ser cero. Se pueden utilizar los operadores lógicos && (and) y II (or). Solamente se van a utilizar los paréntesis después del if y al nal del if. Solución 1 if2 if1 term if1 if cond5 inicio cond5 cond5 oprlog cond4 cond4 cond1 cond2 cond3 cond3 var opr var cond2 var opr cero cond1 var opr num2 oprlog '&&' 'II' opr < > ==!= var var todo letras todo A B C D... Z 0 1 2... 9 letras A B C D... Z num2 num2 num1 num3 num1 num3 cero num3 1 2 3 4 5... 9 cero 0 inicio if ( term ) Solución 2 si if (exp) exp comp comp oplog exp comp var oprel num var oprel var oprel < > ==!= oplog '&&' 'II' var var numero var letra letra letra a b c d... z A B C D... Z numero num 0 num num dig num 0 dig dig 1 2 3 4 5 6 7 8 9