[antlr-interest] Theading Tree Walkers

code_dude at nym.hush.com code_dude at nym.hush.com
Mon Feb 2 09:11:30 PST 2009


Hi there,
Im using antr-2.7.6 (C++ code generation) and have a threading 
problem with the antlr generated tree walker. 
 
Basically what Im doing if taking the parse tree and sorting the 
expressions ( using my custom function openmp_sort(tr, &inn_vtr) ) 
into  their own basic blocks then and then parallel process (using 
Open MP) the expressions in each block.   

The thing I when I run it , every so often I get a segmentation 
fault from my tree parser. Below is the stack trace from ddd
  

antlr::ASTRef::~ASTRef ()  (destructor called from ASTRefCount.hpp)
ncoTree::assign            (process an essign expression)  
ncoTree::out               (expression walker)
ncoTree::statements        (statement walker) 


Below is an example of my "openmp_sort(RefAST 
tr,std::vector<RefAST> &inn_vtr)"  function in action. Also 
attached is ( a big simplification ) code detailing how I invoke 
the antlr generated code. I hope I have made clear what I'm doing.



// Input Expressions
A=10;
B=20;
C=30;
D=40;
A++;
B*=20;
C-=40;
E=A+B;
F=A+B+C+D+E;
G=A;
G++;
D++;
H=20/++A;
I=A+C+D;
J=40;
K=H*(C-=1);

// Sorted Expressions
-------------------------------
 ( EXPR ( = A 10 ) )
 ( EXPR ( = B 20 ) )
 ( EXPR ( = C 30 ) )
 ( EXPR ( = D 40 ) )
 ( EXPR ( = J 40 ) )
-------------------------------
-------------------------------
 ( EXPR ( POST_INC A ) )
 ( EXPR ( *= B 20 ) )
 ( EXPR ( -= C 40 ) )
-------------------------------
-------------------------------
 ( EXPR ( = E ( + A B ) ) )
 ( EXPR ( = G A ) )
-------------------------------
-------------------------------
 ( EXPR ( = F ( + ( + ( + ( + A B ) C ) D ) E ) ) )
 ( EXPR ( POST_INC G ) )
-------------------------------
-------------------------------
 ( EXPR ( POST_INC D ) )
 ( EXPR ( = H ( / 20 ( ++ A ) ) ) )
-------------------------------
-------------------------------
 ( EXPR ( = I ( + ( + A C ) D ) ) )
-------------------------------
-------------------------------
 ( EXPR ( = K ( * H ( -= C 1 ) ) ) )
-------------------------------


/********************** Code 
*************************************************/

int parse_antlr(std::vector<prs_cls> &prs_vtr,char* fl_spt_usr,char 
*cmd_ln_sng)
{
  
  ANTLR_USING_NAMESPACE(std);
  ANTLR_USING_NAMESPACE(antlr);
  

  int idx;  
  prs_cls *prs_arg;
  std::string filename(fl_spt_usr);

  std::vector<ncoTree*> wlk_vtr;
  std::vector<RefAST> inn_vtr;

  ncoLexer *lexer=NULL;
  ncoParser *parser=NULL;

  istringstream *sin=NULL;
  ifstream *in=NULL;
  
  
  RefAST tr,a;
  ASTFactory ast_factory;

  prs_arg=&prs_vtr[0]; 
  
  std::vector<ncoTree*> wlk_vtr;
  std::vector<RefAST> inn_vtr;


    
    if( cmd_ln_sng ){
      sin= new  istringstream(cmd_ln_sng);
      lexer= new ncoLexer( *sin, prs_arg);
      selector.addInputStream(lexer,cmd_ln_sng);
      selector.select(cmd_ln_sng);
    }else {
      in=new ifstream(filename.c_str());          
      lexer= new ncoLexer( *in, prs_arg);
      selector.addInputStream(lexer,filename);
      selector.select(filename);

    }     
    
    
    lexer->setFilename(filename);
    
    parser= new ncoParser(selector);
    parser->setFilename(filename);
    parser->inc_vtr.push_back(filename);
    

    parser->initializeASTFactory(ast_factory);
    parser->setASTFactory(&ast_factory);
    
    
    // Parse the input expressions
    parser->program();
    a = parser->getAST();
  
  tr=a;

  // Do an OpenMP Sort
  (void)openmp_sort(tr,&inn_vtr);   
  
  // initialize walkers   
    ncoTree* wlk_obj;    
    for(idx=0 ; idx< (int)prs_vtr.size(); idx++){
      wlk_obj=new ncoTree(&prs_vtr[idx]);  
      wlk_obj->initializeASTFactory(ast_factory);
      wlk_obj->setASTFactory(&ast_factory);
      wlk_vtr.push_back(wlk_obj); 
    }      
    
     


    // walk the tree in parallel processing statements
   
#ifdef _OPENMP
#pragma omp parallel for default(none) private(kdx,wlk_vtr,tr) 
#endif
   for(kdx=0 ;kdx< nbr_sz; kdx++) {      

     tr=inn_vtr[kdx];
     wlk_vtr[omp_get_thread_num]->statements(tr);


   } //end OPENMP parallel loop






   
  return 1;
}


/********************** Code 
*************************************************/





More information about the antlr-interest mailing list