POETCode* EvaluatePOET::parse_input(POETCode* input, POETCode* pattern) { static double token_time = 0, prep_time=0, parse_time=0; static bool first=true; bool dt = debug_time; if (dt) { if (first) { register_timing(&token_time, "time spent in tokenizer:"); register_timing(&prep_time, "time spent in parse preparation:"); register_timing(&parse_time, "time spent in parsing and AST construction:"); } first=false; } if (prep->get_entry().get_code() != 0) { double cur = (dt?GetWallTime():0); XformVar* prep_xform = dynamic_cast<XformVar*>(prep->get_entry().get_code()); if (prep_xform == 0) INCORRECT_XVAR(prep); input = prep_xform->eval(input); if (dt) prep_time +=GetWallTime()-cur; } if (tokens->get_entry().get_code() != 0) { double cur = (dt?GetWallTime():0); ApplyTokenOperator op(tokens->get_entry().get_code()); input = op.apply(input); if (dt) token_time +=GetWallTime()-cur; } input = eval_AST(input); if (pattern == 0) pattern = parseTarget->get_entry().get_code(); if (pattern == 0) return input; switch (pattern->get_enum()) { case SRC_READ_INPUT: return input; default: try { double cur = (dt?GetWallTime():0); POETCode* result = parse_AST(input, pattern); if (dt) parse_time +=GetWallTime()-cur; return result; } catch (ParseError err) { EXIT(err.message()); } } }
ParseExp::Result ParseExp::ParseExpImpl(POETCode* input, POETCode* bop, POETCode* inherit, int *p_lineno) { if (inherit == 0) { POETCode* p_uop = exp_uop->get_entry().get_code(); for (POETCode* cur = 0; ((cur=get_head(p_uop))!=0); p_uop = get_tail(p_uop)) { POETCode* p_input = MatchOp(cur, input); if (p_input != 0) { Result resOfRest = ParseItemType(p_input, p_lineno); if (resOfRest.first != 0) { if (buildUop->get_entry().get_code()!=0) { XformVar* xvar = dynamic_cast<XformVar*>(buildUop->get_entry().get_code()); if (xvar == 0) INCORRECT_XVAR(buildUop); inherit = xvar->eval(PAIR(cur,resOfRest.first),false); } else { CodeVar* cvar = dynamic_cast<CodeVar*>(parseUop->get_entry().get_code()); if (cvar == 0) INCORRECT_CVAR(parseUop); inherit = CODE_REF(cvar, PAIR(cur,resOfRest.first)); } input = resOfRest.second; } break; } } } if (inherit == 0) { Result res = ParseItemType(input, p_lineno); inherit = res.first; input = res.second; } if (inherit == 0) { return Result(0,input); } if (get_tail(input) != 0) { POETCode* p_bop = bop; for (POETCode* cur_bop=0; (cur_bop = get_head(p_bop)) != 0; p_bop = get_tail(p_bop) ) { for (POETCode* cur = 0; (cur = get_head(cur_bop)) != 0; cur_bop = get_tail(cur_bop)) { POETCode* p_input = MatchOp(cur, input); if (p_input != 0) { Result resOfTail = ParseExpImpl(p_input,get_tail(p_bop),0, p_lineno); if (resOfTail.first != 0) { POETCode* first1 = 0; if (buildBop->get_entry().get_code()!=0) { XformVar* xvar = dynamic_cast<XformVar*>(buildBop->get_entry().get_code()); if (xvar == 0) INCORRECT_XVAR(buildBop); first1 = xvar->eval(TUPLE3(cur,inherit,resOfTail.first),false); } else { CodeVar* cvar = dynamic_cast<CodeVar*>(parseBop->get_entry().get_code()); if (cvar == 0) INCORRECT_XVAR(parseBop); first1=CODE_REF(cvar,TUPLE3(cur,inherit,resOfTail.first)); } return ParseExpImpl(resOfTail.second,bop,first1, p_lineno); } return Result(inherit,input); } } } } return Result(inherit, input) ; }