/*203:*/
//#line 687 "/usr/local/yacco2/library/thread.w"

/*565:*/
//#line 24 "/usr/local/yacco2/library/macros.w"



/*:565*/
//#line 688 "/usr/local/yacco2/library/thread.w"

/*23:*/
//#line 392 "/usr/local/yacco2/library/intro.w"

using namespace yacco2;

/*:23*/
//#line 689 "/usr/local/yacco2/library/thread.w"

/*209:*/
//#line 768 "/usr/local/yacco2/library/thread.w"

char ma[SMALL_BUFFER_4K];
const char*pp_start= "YACCO2_MSG__::PROC::%i::%s start parsing\n";
const char*pp_stop= "YACCO2_MSG__::PROC::%i::%s stop parsing\n";
/*23:*/
//#line 392 "/usr/local/yacco2/library/intro.w"

using namespace yacco2;

/*:23*/
//#line 772 "/usr/local/yacco2/library/thread.w"


/*:209*/
//#line 690 "/usr/local/yacco2/library/thread.w"

/*210:*/
//#line 775 "/usr/local/yacco2/library/thread.w"

proc_parser->pp_requesting_parallelism__= Caller_pp;
proc_parser->launched_as_procedure__= true;
proc_parser->from_thread__= Caller_pp;
proc_parser->no_competing_pp_ths__= Caller_pp->no_requested_ths_to_run__;


/*:210*/
//#line 691 "/usr/local/yacco2/library/thread.w"


/*208:*/
//#line 747 "/usr/local/yacco2/library/thread.w"

if(Caller_pp->top_stack_record()->state__->proc_call_addr__==0){
proc_parser->override_current_token(*Caller_pp->current_token()
,Caller_pp->current_token_pos__);
proc_parser->set_start_token(*Caller_pp->current_token());
proc_parser->set_start_token_pos(Caller_pp->current_token_pos__);
proc_parser->top_stack_record()->set_symbol(proc_parser->current_token());
}else{
Cparse_record*pr= 
Caller_pp->get_stack_record(Caller_pp->current_stack_pos()-2);
int new_pos= Caller_pp->current_token_pos__-1;
proc_parser->override_current_token(*pr->symbol__,new_pos);
proc_parser->set_start_token(*pr->symbol__);
proc_parser->set_start_token_pos(new_pos);
}
proc_parser->token_supplier__= Caller_pp->token_supplier__;
proc_parser->token_producer__= Caller_pp->token_producer__;
proc_parser->error_queue__= Caller_pp->error_queue__;
proc_parser->recycle_bin__= Caller_pp->recycle_bin__;
proc_parser->sym_lookup_functor__= Caller_pp->sym_lookup_functor__;
/*:208*/
//#line 693 "/usr/local/yacco2/library/thread.w"

/*638:*/
//#line 1401 "/usr/local/yacco2/library/macros.w"

if(yacco2::YACCO2_MSG__){
/*389:*/
//#line 3053 "/usr/local/yacco2/library/parser.w"

LOCK_MUTEX(yacco2::TRACE_MU);
if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<<FILE_LINE<<std::endl;
}

/*:389*/
//#line 1403 "/usr/local/yacco2/library/macros.w"

sprintf(ma,pp_start,proc_parser->thread_no__,called_proc_name);
yacco2::lrclog<<ma;
Parser*pp_= proc_parser->pp_requesting_parallelism__;
yacco2::lrclog<<"YACCO2_MSG__::"
<<proc_parser->thread_no__
<<"::"
<<proc_parser->thread_name()
<<" requesting parser*: "<<pp_
<<FILE_LINE<<std::endl;
yacco2::lrclog<<"\tYACCO2_MSG__::PROC::"<<proc_parser->thread_no__<<"::"
<<proc_parser->thread_name()
<<" Caller's # threads to run:: "<<pp_->no_requested_ths_to_run__
<<" Caller's # active threads: "<<pp_->th_active_cnt__
<<" Self # competing threads: "<<proc_parser->no_competing_pp_ths__
<<FILE_LINE<<std::endl;
yacco2::lrclog<<"\tYACCO2_MSG__::PROC::"
<<proc_parser->thread_no__<<"::"
<<proc_parser->thread_name()
<<" passed token*: "<<pp_->current_token()
<<'"'<<proc_parser->current_token()->id__<<'"'
<<" pos: "<<proc_parser->current_token_pos__
<<FILE_LINE<<std::endl;
yacco2::lrclog
<<"\t\t::GPS FILE: ";
EXTERNAL_GPSing(proc_parser->current_token__)
yacco2::lrclog
<<" GPS LINE: "
<<proc_parser->current_token__->tok_co_ords__.line_no__
<<" GPS CHR POS: "
<<proc_parser->current_token__->tok_co_ords__.pos_in_line__
<<FILE_LINE<<std::endl;
/*390:*/
//#line 3060 "/usr/local/yacco2/library/parser.w"

if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Releasing trace mu"<<FILE_LINE<<std::endl;
}
UNLOCK_MUTEX(yacco2::TRACE_MU);

/*:390*/
//#line 1435 "/usr/local/yacco2/library/macros.w"

}
if(yacco2::YACCO2_T__){
/*389:*/
//#line 3053 "/usr/local/yacco2/library/parser.w"

LOCK_MUTEX(yacco2::TRACE_MU);
if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<<FILE_LINE<<std::endl;
}

/*:389*/
//#line 1438 "/usr/local/yacco2/library/macros.w"

yacco2::lrclog<<"YACCO2_T__::"
<<proc_parser->thread_no__
<<"::"
<<proc_parser->thread_name()
<<" token*: "<<proc_parser->current_token__
<<" enum: "<<proc_parser->current_token__->enumerated_id__
<<" pos: "<<proc_parser->current_token_pos__
<<' '<<'"'<<proc_parser->current_token__->id__<<'"'
<<FILE_LINE<<std::endl;
yacco2::lrclog
<<"\t\t::GPS FILE: ";
EXTERNAL_GPSing(proc_parser->current_token__)
yacco2::lrclog
<<" GPS LINE: "
<<proc_parser->current_token__->tok_co_ords__.line_no__
<<" GPS CHR POS: "
<<proc_parser->current_token__->tok_co_ords__.pos_in_line__
<<FILE_LINE<<std::endl;
/*390:*/
//#line 3060 "/usr/local/yacco2/library/parser.w"

if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Releasing trace mu"<<FILE_LINE<<std::endl;
}
UNLOCK_MUTEX(yacco2::TRACE_MU);

/*:390*/
//#line 1457 "/usr/local/yacco2/library/macros.w"

}

/*:638*/
//#line 694 "/usr/local/yacco2/library/thread.w"

/*207:*/
//#line 732 "/usr/local/yacco2/library/thread.w"

THR_result rslt= proc_parser->parallel_parse();

/*:207*/
//#line 695 "/usr/local/yacco2/library/thread.w"

/*206:*/
//#line 720 "/usr/local/yacco2/library/thread.w"

proc_parser->remove_from_stack(proc_parser->parse_stack__.top_sub__-1);
CAbs_lr1_sym*sym= proc_parser->top_stack_record()->symbol__;
if(sym!=0){
if(sym->auto_delete__==ON){
/*641:*/
//#line 1482 "/usr/local/yacco2/library/macros.w"

if(yacco2::YACCO2_TH__){
THREAD_NO tid= proc_parser->thread_no__;
/*389:*/
//#line 3053 "/usr/local/yacco2/library/parser.w"

LOCK_MUTEX(yacco2::TRACE_MU);
if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<<FILE_LINE<<std::endl;
}

/*:389*/
//#line 1485 "/usr/local/yacco2/library/macros.w"

yacco2::lrclog<<"YACCO2_TH__:: "<<"sym to be deleted: "
<<tid<<"::"
<<proc_parser->fsm_tbl__->id__<<"::"
<<sym->id__
<<FILE_LINE<<std::endl;
/*390:*/
//#line 3060 "/usr/local/yacco2/library/parser.w"

if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Releasing trace mu"<<FILE_LINE<<std::endl;
}
UNLOCK_MUTEX(yacco2::TRACE_MU);

/*:390*/
//#line 1491 "/usr/local/yacco2/library/macros.w"

}

/*:641*/
//#line 725 "/usr/local/yacco2/library/thread.w"

delete sym;
}
proc_parser->top_stack_record()->set_symbol(0);
}
proc_parser->parse_stack__.lr_stk_init(*proc_parser->fsm_tbl__->start_state__);
/*:206*/
//#line 696 "/usr/local/yacco2/library/thread.w"

/*205:*/
//#line 709 "/usr/local/yacco2/library/thread.w"

proc_parser->set_use_all_shift_on();
proc_parser->set_abort_parse(OFF);
proc_parser->set_stop_parse(OFF);
proc_parser->has_questionable_shift_occured__= OFF;

/*:205*/
//#line 697 "/usr/local/yacco2/library/thread.w"


finished_working:
/*204:*/
//#line 705 "/usr/local/yacco2/library/thread.w"

proc_parser->clear_parse_stack();

/*:204*/
//#line 700 "/usr/local/yacco2/library/thread.w"

/*645:*/
//#line 1527 "/usr/local/yacco2/library/macros.w"

if(yacco2::YACCO2_MSG__){
/*389:*/
//#line 3053 "/usr/local/yacco2/library/parser.w"

LOCK_MUTEX(yacco2::TRACE_MU);
if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<<FILE_LINE<<std::endl;
}

/*:389*/
//#line 1529 "/usr/local/yacco2/library/macros.w"

yacco2::lrclog<<"YACCO2_MSG__::PROC::"<<proc_parser->thread_no__
<<"::"<<called_proc_name
<<" ==>procedure finished working"
<<FILE_LINE<<std::endl;
/*390:*/
//#line 3060 "/usr/local/yacco2/library/parser.w"

if(yacco2::YACCO2_MU_TRACING__){
yacco2::lrclog<<"YACCO2_MU_TRACING__::Releasing trace mu"<<FILE_LINE<<std::endl;
}
UNLOCK_MUTEX(yacco2::TRACE_MU);

/*:390*/
//#line 1534 "/usr/local/yacco2/library/macros.w"

}

/*:645*/
//#line 701 "/usr/local/yacco2/library/thread.w"

return rslt;

/*:203*/