<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document PUBLIC "-//CNX//DTD CNXML 0.5 plus MathML//EN" "http://cnx.rice.edu/cnxml/0.5/DTD/cnxml_mathml.dtd">
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="id9227713">
  <name>Gramaticas Independientes del Contexto, ejemplos y ejercicios</name>
  <metadata>
  <md:version>1.1</md:version>
  <md:created>2008/05/27 16:33:54.828 GMT-5</md:created>
  <md:revised>2008/05/29 10:12:27.297 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="carcorfu">
      <md:firstname>Carlos</md:firstname>
      <md:othername>Arturo</md:othername>
      <md:surname>Cortés Fuentes</md:surname>
      <md:email>carcorfu@yahoo.com</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="carcorfu">
      <md:firstname>Carlos</md:firstname>
      <md:othername>Arturo</md:othername>
      <md:surname>Cortés Fuentes</md:surname>
      <md:email>carcorfu@yahoo.com</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>Backus-Naur form</md:keyword>
    <md:keyword>BNF</md:keyword>
    <md:keyword>Compiladores</md:keyword>
    <md:keyword>GIC</md:keyword>
    <md:keyword>gramaticas</md:keyword>
    <md:keyword>gramaticas independientes del contexto</md:keyword>
    <md:keyword>gramaticas libres del contexto</md:keyword>
  </md:keywordlist>

  <md:abstract>Las gramáticas libres de contexto permiten describir la mayoría de los lenguajes de programación, de hecho, la síntaxis de la mayoría de lenguajes de programación está definida mediante gramáticas libres de contexto. Por otro lado, estas gramáticas son suficientemente simples como para permitir el diseño de eficientes algoritmos de análisis sintáctico que, para una cadena de caracteres dada determinen como puede ser generada desde la gramática</md:abstract>
</metadata>
  <content>
    <para id="id9197470">Gramáticas Independientes del Contexto, ejemplos y ejercicios</para>
    <para id="id7234617">Una Gramática independientes del contexto (GIC) es una <link src="http://es.wikipedia.org/wiki/Gramática_formal">gramática formal</link> en la que cada regla de producción es de la forma:</para>
    <para id="id7266193">Exp → x</para>
    <para id="id9197592">Donde Exp es un <link src="http://es.wikipedia.org/w/index.php?title=Símbolo_no_terminal&amp;action=edit&amp;redlink=1">símbolo no terminal</link> y x es una cadena de terminales y/o no terminales. El término independiente del contexto se refiere 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 <link src="http://es.wikipedia.org/wiki/Lenguaje_formal">lenguaje formal</link> es <link src="http://es.wikipedia.org/wiki/Lenguaje_libre_de_contexto">independiente de contexto</link> si hay una gramática libre de contexto que lo genera, este tipo de gramática fue creada por 
<link src="http://es.wikipedia.org/w/index.php?title=Backus-Naur_form&amp;action=edit&amp;redlink=1">Backus-Naur</link> 
y se utiliza para describir la mayoría de los lenguajes de programación.</para>
    <para id="id9178877">Una GIC está compuesta por 4 elementos:</para>
    <para id="id9199758">1. Símbolos terminales (elementos que no generan nada)</para>
    <para id="id8676102">2. No terminales (elementos del lado izquierdo de una producción, antes de la flecha "-&gt;")</para>
    <para id="id9190958">3. Producciones (sentencias que se escriben en la gramática)</para>
    <para id="id9190962">4. Símbolo inicial (primer elemento de la gramática)</para>
    <para id="id8426458">Ejemplo 1: Teniendo un lenguaje que genera expresiones de tipo:</para>
    <para id="id9251766">9 + 5 – 2</para>
    <para id="id8203126">Para determinar si una GIC esta bien escrita se utilizan los 
<link src="http://es.wikipedia.org/w/index.php?title=arbol_de_analisi_sintacticol&amp;action=edit&amp;redlink=1">arboles de analisis sintáctico</link> 
, así:</para>
    <para id="id8517907">Producciones:</para>
    <para id="id8498796">lista -&gt; lista + digito</para>
    <para id="id7225825">lista -&gt; lista - digito</para>
    <para id="id9182718">lista -&gt; digito</para>
    <para id="id7044306">digito -&gt; 0|1|2|3|4|5|6|7|8|9</para>
    <para id="element-998">Arbol de analisis sintactico:</para><figure id="id7250374">
      <media type="image/png" src="Dibujo compiladores.png">
        <param name="height" value="243"/>
        <param name="width" value="489"/>
      </media>
    </figure>
    <para id="id8723281">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.</para>
    <para id="id8717022">Ejemplo 2: Hacer una gramática que genere el número 5</para>
    <para id="id8203290">Símbolo inicial (no terminal): Exp y Símbolo terminal: 5</para>
    <para id="id8607254">Exp -&gt; 5</para>
    <para id="id9194180">Ejemplo 3: Hacer una gramática que genere un dígito.</para>
    <para id="id8517967">Exp -&gt; 0|1|2|3|4|5|6|7|8|9</para>
    <para id="element-95">Arbol de analisis sintactico:</para><para id="id9182221">Exp</para>
    <para id="id8449630">|</para>
    <para id="id7249814">3</para>
    <para id="id9197063">Ejemplo 4: Hacer una gramática que repita muchas veces el número 5</para>
    <para id="id9189542">Exp -&gt; Exp 5|5</para>
    <para id="id9251585">Prueba con el número 555</para>
    <figure id="id8510269">
      <media type="image/jpg" src="compila.jpg">
        <param name="height" value="182"/>
        <param name="width" value="297"/>
      </media>
    </figure>
    <para id="id9176914">Ejemplo 5: Gramática que genera muchos dígitos</para>
    <para id="id8585319">Exp -&gt; Exp dig | dig</para>
    <para id="id9199525">dig -&gt; 0|1|2|3|4|…|9</para>
    <para id="id8494122">Prueba:</para>
    <figure id="id8494133">
      <media type="image/jpg" src="compila.jpg">
        <param name="height" value="209"/>
        <param name="width" value="375"/>
      </media>
    </figure>
    <para id="id8101148">Ejemplo 6: Hacer una GIC que genere un número binario</para>
    <para id="id8101162">Exp -&gt; Exp bin | bin </para>
    <para id="id3751611">bin -&gt; 0 | 1</para>
    <para id="id3751638">Ó con una sola producción:</para>
    <para id="id3751642">Exp -&gt; Exp 0 | Exp 1 | 0 | 1</para>
    <para id="id8480902">Prueba:</para>
    <figure id="id8480910">
      <media type="image/jpg" src="compila.jpg">
        <param name="height" value="226"/>
        <param name="width" value="288"/>
      </media>
    </figure>
    <para id="id7283507">Aunque esta producción puede generar expresiones como 0000, para evitar errores como este:</para>
    <para id="id7283514">dig -&gt; 1 Exp | 1</para>
    <para id="id7283541">Exp -&gt; Exp 0 | Exp 1 | 0 | 1</para>
    <para id="id8510129">Nota 1: El símbolo inicial siempre debe estar en la primera producción de la gramática.</para>
    <para id="id8510143">Nota 2: Expresiones de tipo, Exp -&gt;  Exp 0 | 1, genera potencias de 10, ejemplo </para>
    <figure id="id8424962">
      <media type="image/png" src="Dibujo1.png">
        <param name="height" value="174"/>
        <param name="width" value="199"/>
      </media>
    </figure>
    <para id="id8429941">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.</para>
    <para id="id8429957">Exp -&gt; unos ceros</para>
    <para id="id7002508">ceros -&gt; ceros 00 | 00</para>
    <para id="id7002534">unos -&gt; unos 11 | 1</para>
    <figure id="id7259265">
      <media type="image/jpg" src="compila.jpg">
        <param name="height" value="133"/>
        <param name="width" value="167"/>
      </media>
    </figure>
    <figure id="id8449006">
      <media type="image/jpg" src="compila.jpg">
        <param name="height" value="246"/>
        <param name="width" value="489"/>
      </media>
    </figure>
    <para id="id8449029">Ejemplo 8: ¿Cuál es el lenguaje de la siguiente producción?</para>
    <para id="id8449041">Pal -&gt; Pal letras | letras </para>
    <para id="id8525489">Letras -&gt;  a | b | c | d | e | f | g | … | z</para>
    <para id="id8525518">R/ Es una GIC que genera palabras escritas en minúsculas. </para>
    <para id="id8525526">Ejemplo 9: Hacer una GIC que genere una frase cuya letra inicial de cada palabra sea mayúscula.</para>
    <para id="id8525541">Frase -&gt; Frase Exp pal | pal </para>
    <para id="id8428413">Exp -&gt; “ “</para>
    <para id="id8428442">Pal -&gt; may | pal min </para>
    <para id="id8493575">min -&gt; a | b | c | d | … | z</para>
    <para id="id8428991">may -&gt; A | B | C | D | … | Z</para>
    <figure id="id8429021">
      <media type="image/png" src="Dibujo1.png">
        <param name="height" value="395"/>
        <param name="width" value="633"/>
      </media>
    </figure>
    <para id="id8429045">Ejercicios</para>
    <para id="id3976123">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. </para>
    <para id="id3976142">Nota: Se tiene en cuenta que Є=vacio; no se aceptan apellidos compuestos.</para>
    <para id="id3976152">nombre → nom nom2 esp nom nom2</para>
    <para id="id3976157">nom2 → esp nom │Є</para>
    <para id="id3976170">nom → nom min │may</para>
    <para id="id3976175">may → A│B│C│D│…│Z</para>
    <para id="id8502634">min → a│b│c│d│…│z</para>
    <para id="id8502639">esp → “ “</para>
    <para id="id8502644">Árbol de análisis sintáctico</para>
    <figure id="id8502651">
      <media type="image/jpg" src="graphics1.jpg">
        <param name="height" value="474"/>
        <param name="width" value="614"/>
      </media>
    </figure>
    <para id="id8502675">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.</para>
    <para id="id8721675">frase → frase esp pal2│pal2</para>
    <para id="id8502690">esp → “ “</para>
    <para id="id8502694">pal2 → pal1 conmin</para>
    <para id="id8721683">pal1 → pal2 min│vocmay</para>
    <para id="id8721688">vocmay → A│E│I│O│U</para>
    <para id="id8721693">min → conmin│vocmin</para>
    <para id="id8721698">conmin → b│c│d│f│g│…│z</para>
    <para id="id8721704">vocnim → a│e│i│o│u</para>
    <para id="id8721709">3. Hacer una gramática independiente del contexto (G.I.C), que genere la sentencia condicional if con las siguientes restricciones:</para>
    <list type="bulleted" id="id8721725">
      <item>Siempre se va a comparar una variable con un número entero o una variable con otra variable.</item>
      <item>Los operadores relacionales son: &lt;│&gt;│≤│≥│==│!=</item>
      <item>Las variables deben empezar en una letra y después de esa letra pueden haber cualquier cantidad de números o letras.</item>
      <item>Los números solamente van a ser enteros de cualquier cantidad de dígitos. </item>
      <item>Un número no debe empezar en cero, pero puede ser cero.</item>
      <item>Se pueden utilizar los operadores lógicos &amp;&amp; (and) y II (or).</item>
      <item>Solamente se van a utilizar los paréntesis después del if y al final del if.</item>
    </list>
    <para id="id8456772">Solución 1</para>
    <para id="id8456776">if2 → if1 term</para>
    <para id="id3162380">if1 → if cond5│inicio </para>
    <para id="id3162385">cond5 → cond5 oprlog cond4</para>
    <para id="id3162391">cond4 → cond1│ cond2│ cond3</para>
    <para id="id3162396">cond3 → var opr var</para>
    <para id="id3162401">cond2 → var opr cero</para>
    <para id="id3162406">cond1 → var opr num2</para>
    <para id="id3162411">oprlog → '&amp;&amp;'│'II'</para>
    <para id="id3162416">opr → &lt;│&gt;│≤│≥│==│!=</para>
    <para id="id3162421">var → var todo│letras</para>
    <para id="id3162426">todo → A│B│C│D│...│Z│0│1│2│...│9</para>
    <para id="id3162432">letras → A│B│C│D│...│Z</para>
    <para id="id9243072">num2 → num2 num1│num3</para>
    <para id="id9243076">num1 → num3│cero</para>
    <para id="id9243081">num3 → 1│2│3│4│5│...│9</para>
    <para id="id9243087">cero → 0</para>
    <para id="id9243091">inicio → if (</para>
    <para id="id9243096">term → )</para>
    <para id="id9243101">Solución 2</para>
    <para id="id9243105">si → if (exp)</para>
    <para id="id9243110">exp → comp│comp oplog exp </para>
    <para id="id9243116">comp → var oprel num│var oprel var</para>
    <para id="id9243121">oprel → &lt;│&gt;│≤│≥│==│!=</para>
    <para id="id9243127">oplog → '&amp;&amp;'│'II'</para>
    <para id="id9243132">var → var numero│var letra│letra</para>
    <para id="id9243137">letra → a│b│c│d│...│z│A│B│C│D│...│Z</para>
    <para id="id9176229">numero → num│0</para>
    <para id="id9176234">num → num dig│num 0│dig</para>
    <para id="id9176239">dig → 1│2│3│4│5│6│7│8│9</para>
  </content>
</document>
