예제 #1
0
  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;
     }
  }
예제 #2
0
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;
}