Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/03/2010, 22:43
albert_sps
 
Fecha de Ingreso: diciembre-2003
Ubicación: San Pedro Sula
Mensajes: 165
Antigüedad: 20 años, 11 meses
Puntos: 0
Iteradores List STL

Hola, soy nuevo usando las listas de STL y en el caso que les presentare no funcionan como yo esperaba.

Las estoy usando en un arbol sintactico de un compilador.
Tengo un objeto block que contiene una lista de sentencias:

class block: public TreeNode {
public:
list<statement*> sentencias;
.
.
.
};

Para interpretar el bloque interpreto cada sentencia de la lista...
El problema lo tengo con las sentencias break, continue y return de mi gramatica.

Al interpretar un break sencillamente hago un break dentro del ciclo para que no se sigan interpretando las demas sentencias, si esta dentro de un bloque que no es ciclo (ejemplo IF) tiene que hacer un break para salirse del bloque del IF, y solo

Código PHP:
void block::inter() 
{
     list<
statement*>::iterator stm sentencias.begin();  // lista de sentencias del bloque
     
list<statement*>::iterator itAnterior// iterador para comparar la sentencia anterior

     
exeBreak 0;  // ocurrio un break, var global
     
conti=0;       // ocurrio un continue
     
retorno=0;     // ocurrio un return
     
     
while ( stm != sentencias.end() )      
     {      
               if (
stm != sentencias.begin()) {
                   
itAnteriorstm;
                   
itAnterior--;         
               }
               
              
// sentenciaBreak::inter()  cambio exeBreak a 1 
              // despues de salirse de todos los bloques verificar que quedo despues de una sentencia ciclo para continuar
              
if ( exeBreak==&&   ((*itAnterior)->NodeType() != SENTENCIAW ) || ((*itAnterior)->NodeType() != SENTENCIAF) ) 
                      break;     
                      
// otra opcion era igualar stm = sentencias.end() y saltarse el switch                               
               
else if (exeBreak==1exeBreak 0
              
               
//// sentenciaContinue::inter()  cambio conti a 1 
              // despues de salirse de todos los bloques verificar que el anterior sea un ciclo y ejecutarlo de nuevo
               
if (  conti==1  &&   (*itAnterior)->NodeType() != SENTENCIAW  || (*itAnterior)->NodeType() != SENTENCIAF)
                          break;                         
               else if (
conti==1)     stm itAnterior;
               
               
// verificar que el stm anterior fuera un method_call 
               
if (  retorno==&&  (*itAnterior)->NodeType() != METHODCALLNAME )  break;                         
               else if (
retorno==1retorno 0;
                
               switch ((*
stm)->NodeType())        {                  
                    case 
ASIGNACION: (dynamic_cast<assign*>(*stm))->inter(); break;
                    case 
METHODCALLNAME: (dynamic_cast<method_callname*>(*stm))->inter(); break;
                    case 
SENTENCIAI: (dynamic_cast<sentenciaIF*>(*stm))->inter(); break;
                    case 
SENTENCIAW: (dynamic_cast<sentenciaWHILE*>(*stm))->inter();break;
                    case 
SENTENCIAR: (dynamic_cast<sentenciaReturn*>(*stm))->inter();break;
                    case 
SENTENCIAB: (dynamic_cast<sentenciaBreak*>(*stm))->inter(); break;
                    case 
SENTENCIAC:(dynamic_cast<sentenciaContinue*>(*stm))->inter();break;                                                 
                         
                         
//  etc
                                            
                    
default: break;                    
               };  
               
stm++; // siempre va a la siguiente y despues verifica                       
       
}                            
}; 
Buena esta es una de las tantas formas que he intentado y hay error en tiempo de ejecucion.
Tambien he intentado asignar *stm a un objeto temporal statement* Anterior y en vez de usar *itAnterior->NodeType usar Anterior->NodeType ...

gracias x colaborar...
__________________
J. Alberto Montoya
------------------

Última edición por albert_sps; 25/03/2010 a las 21:14 Razón: correccionde codigo