virtual void visitCodeVar( CodeVar* v) { if (curVar >= traceVars.size()) return; res = 0; defaultVisit(v); if (res == 0) ReplInfoVisitor::visitCodeVar(v); else res->visit(this); }
virtual void visitList(POETList* l) { if (curVar >= traceVars.size()) return; res = 0; defaultVisit(l); if (res == 0) ReplInfoVisitor::visitList(l); else res->visit(this); }
virtual void visitLocalVar( LocalVar* v) { if (curVar >= traceVars.size()) return; POETCode* val = EvalTrace(v); res = 0; defaultVisit(val); if (res == 0) { res = v; } else if (res != v) { v->get_entry().set_code(res); res = v; } ReplInfoVisitor::visitLocalVar(v); }
virtual void visitTupleAccess(TupleAccess* v) { defaultVisit(v); }
virtual void visitOperator(POETOperator* v) { defaultVisit(v); }
virtual void visitXformVar( XformVar* v) { defaultVisit(v); }
virtual void visitOperator(POETOperator *op) { switch (op->get_op()) { case POET_OP_TUPLE: { parseTuple(op->get_arg(0)); break; } case TYPE_LIST1: case TYPE_LIST: { POETCode* arg = op->get_arg(0); POETCode* matchSave = fullmatch; fullmatch = EMPTY; std::vector<POETCode*> match_res; do { POETCode* r1_first=match_eval(arg); if (r1_first == 0) { fullmatch = matchSave; if (fullmatch != 0) { res = Vector2List(match_res); if (res == EMPTY && op->get_op() == TYPE_LIST1) PARSE_MISMATCH(r1,op,lineno); return; } else PARSE_MISMATCH(r1,op,lineno); } match_res.push_back(r1_first); } while (r1 != 0); fullmatch = matchSave; if (match_res.size() == 0) PARSE_MISMATCH(r1,op,lineno); res = Vector2List(match_res); assert(res != EMPTY); return; } case TYPE_TOR: { POETCode* r1_first = get_head(r1); if (r1_first->get_enum() == SRC_CVAR && static_cast<CodeVar*>(r1_first)->get_parseInfo() != EMPTY) { /*QY: r1_first is already parsed and is not a token*/ if (!match_eval(op)) PARSE_MISMATCH(r1,op,lineno); return; } if (!backtrack) { POETTypeTor* tor = static_cast<POETTypeTor*>(op); POETCode* arg = tor->get_parseInfo(this, r1); apply(arg, fullmatch); if (fullmatch != 0) fullmatch=EMPTY; return; } else { POETCode* r1save = r1; size_t size = op->numOfArgs(); for (unsigned i = 0; i < size; ++i) { POETCode* arg = op->get_arg(i); POETCode* filter = 0; switch (arg->get_enum()) { case SRC_STRING: if (arg != EMPTY) filter = arg; break; case SRC_CVAR: filter=static_cast<CodeVar*>(arg)->get_parseInfo(); if (filter != 0 && filter->get_enum() == SRC_LIST) filter = static_cast<POETList*>(filter)->get_first(); else filter = 0; break; default: ; /* no filtering */ } if (filter != 0 && filter->get_enum()==SRC_STRING && filter != r1_first) { continue; } try { apply(arg, EMPTY); if (res != 0) return; } catch (ParseError err) { r1 = r1save; } } } PARSE_MISMATCH(r1,op,lineno); return; } case POET_OP_EXP: { ParseExp::Result exp_res = ParseExp::inst()->parse(r1, &lineno); res = exp_res.first; if (res == 0) PARSE_MISMATCH(r1,op,lineno); if (fullmatch != 0) r1 = exp_res.second; else if (exp_res.second != 0 && exp_res.second != EMPTY) { PARSE_MISMATCH_LEFT(exp_res.second,lineno); } else r1 = 0; break; } case POET_OP_LIST1: case POET_OP_LIST: { POETParseList* oplist = dynamic_cast<POETParseList*>(op); assert(oplist != 0); std::string sepString; POETCode* sep = op->get_arg(1); if (sep != 0) { sep = eval_AST(sep); POETString* sep1 = AST2String(sep); if (sep1 == 0) INCORRECT_STRING(sep); sepString = sep1->get_content(); } else sep = EMPTY; if (IS_SPACE(sepString)) sep = EMPTY; try { parseList(oplist, op->get_arg(0), sep); } catch (ParseError err) { if (op->get_op() == POET_OP_LIST && backtrack && fullmatch != 0) res = EMPTY; else throw err; } break; } default: defaultVisit(eval_AST(op)); } }