virtual void visitCodeVar(CodeVar* v2) { if (match_eval(v2)) { return; } POETCode* v2parse = v2->get_parseInfo(); assert (v2parse != 0); if (v2parse == EMPTY) PARSE_MISMATCH(v2,r1,lineno); // v2 is built only through scanning POETCode* pars=0; switch (v2parse->get_enum()) { case SRC_OP: case SRC_XVAR: break; /*QY: parameters are not involved in parsing*/ default: pars = v2->get_entry().get_param(); } POETCode* r1Save = r1; try { if (pars != 0) v2->get_entry().get_symTable()->push_table(false); LocalVar* inherit_var = v2->get_entry().get_inherit_var(); if (inherit_var != 0) { inherit_var->get_entry().set_code( inherit); if (debug_parse()) std::cerr << inherit_var->toString(OUTPUT_VAR_VAL) << "\n"; } apply(v2parse,fullmatch); if (fullmatch != 0) fullmatch=EMPTY; if (pars != 0) { /*QY get the values stored in pars*/ pars=ReplaceSingletonListVisitor().apply(pars); POETCode* cond = v2->get_static_attr("cond"); if (cond != 0 && !AST2Bool(eval_AST(cond))) PARSE_MISMATCH(v2,pars,lineno); res = v2->invoke_rebuild(pars); v2->get_entry().get_symTable()->pop_table(); } else if (v2->get_entry().get_param() != 0) { if (!v2->check_cond(res)) PARSE_MISMATCH(v2,res,lineno); POETCode* rres = v2->invoke_rebuild(res); res = rres; } else if (v2->get_entry().get_code() != 0) res = fac->build_codeRef(v2->get_entry(),0); } catch (ParseError err) { if (pars != 0) v2->get_entry().get_symTable()->pop_table(); r1 = r1Save; throw err; } catch (Error err) { std::cerr << " From parsing code template " << v2->toString() << "\n"; throw err; } }
POETCode* POETProgram:: make_Iconst( char* text, int len, bool parseInput) { if (parseInput) { LocalVar* config = find_macroVar(ASTFactory::inst()->new_string("PARSE_INT")); POETCode* res = 0; if (config == 0 || (res = config->get_entry().get_code()) == 0 || !AST2Bool(res)) { std::string val; for (int i = 0; i < len; ++i) val.push_back(text[i]); return ASTFactory::inst()->new_string(val); } } POETCode *res = string2Iconst(text, len); if (res == 0) { std::cerr << "Expecting an integer string but get : "; for (int i = 0; i < len; ++i) std::cerr << text[i]; std::cerr << "\n"; assert(0); } return res; }