Usuario:TooloTF/Eliminación de símbolos inútiles

La Eliminación de símbolos inútiles, es uno los procesos a ejecutar cuando se habla de Simplificación de gramáticas. En la primera etapa de este proceso, se eliminan los símbolos no terminales desde los que no se pueda llegar a una palabra de w y las producciones en las que aparezcan. En su última etapa, se eliminan aquellos símbolos no alcanzables desde el símbolo inicial (S), y las producciones en las que aparecen.

Algoritmo editar

Para entender la eliminación de símbolos inútiles, es necesario entender qué se considera un símbolo útil:

  Un símbolo  se dice que es útil  una derivación de la forma: 
  .

La eliminación de símbolos inútiles se lleva a cabo a través de un procedimiento en dos etapas:

  • Los símbolos no terminales de los que no se puede derivar una cadena de terminales son identificados y borrados. Un pseudocódigo que describe esta etapa es:
  ;
  para todo  Producción de la forma  hacer
        ;
  mientras  cambie  hacer
        para todo  Producción de la forma  hacer
              si todos los no-terminales de  entonces
                    ;
  Eliminar todas las variables  que estén en  y no en ;
  Eliminar todas las producciones donde aparezca una variable de las eliminadas en el paso anterior; 
  • Los no terminales que no son alcanzables desde el símbolo de arranque o axioma son borrados. Este proceso puede ser descrito por el pseudocódigo que sigue:
  ;
  ;
  ;
  mientras  hacer
     Extraer un no terminal  de : ;
     para todo Producción de la forma  hacer
        Poner todos los terminales de  en ;
        para todo  no-terminal  en  hacer
           si  entonces
              ;
              ;
  Eliminar todos los no terminales que no estén en  y todos los terminales que no estén en ;
  Eliminar todas las producciones donde aparezca un símbolo o variable de los eliminados;

Algoritmo aplicado a un ejemplo concreto editar

Considérese la CFG siguiente:

  
  
  
  

Etapa 1:

  
  Primer bucle; se analizan las 8 producciones, pero sólo se detiene en aquellas que generan un símbolo terminal:
   
     ;
   
     ;
  Segunda estructura iterativa;  ha cambiado, luego se entra dentro del bucle.
       
          
      
           entonces:
             
      
          
      
          No hay no-terminales que evaluar.
      
          
      
          
      
           entonces:
             
      
          No hay no-terminales que evaluar.
      ha cambiado, pero no se producirán más cambios en las iteraciones siguientes del bucle
     "para todo", por lo que se sale del bucle "mientras".
  Finalmente:
      y , luego  será eliminada.
     La producción  será eliminada también.

La CFG tendrá el aspecto siguiente después de este primer paso:

  
  
  
  

Etapa 2:

  ;
  ;
  ;
  Se entra al bucle;
  El primer no terminal que se extrae es ; 
     Se analizan todas las producciones de :
         
             
             No terminal en 
                
                
         
             No se actualiza 
             No terminal en 
                
                
  Se extrae un nuevo no-terminal: 
     Se analizan sus producciones:
          
             No se actualiza 
             No terminal en 
                Ya está en 
         
             
             No terminal en 
                Ya está en 
         
             No se actualiza 
             No terminal en 
                Ya está en 
  Se extrae nuevamente un no terminal: 
     Se analiza su única producción:
         
             No se actualiza 
             No hay no terminal en 
  Fin del bucle
  
  
  Eliminamos los no terminales que no aparecen en , es decir: eliminamos 
  Eliminamos los terminales que no aparecen en , en este caso: eliminamos 

La CFG después de la segunda etapa, y por tanto sin símbolos inútiles será como sigue:

  
  
  

Referencias editar