Exemple #1
0
 /**
   * Run a function given its call string, eg "doSomething(1,2,opt=True)"
   */
 boost::shared_ptr<Variable> ScriptModule::runFunction(const std::string& fnStr)
 {
   Kernel::EParser pars;
   pars.parse(fnStr);
   std::string fnName = pars.name();
   ScriptFunction_ptr fun = getFunction(fnName);
   if (fun)
   {
     bool keyWords = false;
     const std::vector<std::string>& argNames = fun->arguments();
     for(int i=0;i<pars.size();++i)
     {
       const Kernel::EParser& arg = pars[i];
       if (!keyWords){ keyWords = (arg.name() == "=");}
       if (!keyWords)
       {
         if (i >= argNames.size())
         {
           throw std::invalid_argument("Wrong number of arguments in "+fnName);
         }
         Expression valExpr(m_namespace,arg);
         fun->setArgument(argNames[i],valExpr.eval());
       }
       else
       {
         if (arg.name() != "=")
         {
           throw std::invalid_argument("Keyword argument expected in "+fnName);
         }
         Expression valExpr(m_namespace,arg[1]);
         fun->setArgument(arg[0].name(),valExpr.eval());
       }
     }
     fun->eval();
     Variable_ptr res = fun->getLocalNamespace_ptr()->getVariable("return");
     return res;
   }
   return Variable_ptr();
 }
Exemple #2
0
Node* WidthRatioNodeFactory::getNode( const QString &tagContent, Parser *p ) const
{
  QStringList expr = smartSplit( tagContent );

  if ( expr.size() != 4 ) {
    throw Grantlee::Exception( TagSyntaxError, QStringLiteral( "widthratio takes three arguments" ) );
  }
  FilterExpression valExpr( expr.at( 1 ), p );
  FilterExpression maxExpr( expr.at( 2 ), p );
  FilterExpression maxWidth( expr.at( 3 ), p );

  return new WidthRatioNode( valExpr, maxExpr, maxWidth, p );
}
Exemple #3
0
ScriptLine* ScriptLineBlock::createLine(const Kernel::EParser& code)
{
    if (code.name() == ":") // define variable
    {
        std::string type = code[0].name();
        std::string name,value = "";
        if (code[1].name() != "=")
        {
            name = code[1].name();
        }
        else
        {
            name = code[1][0].name();
            Expression valExpr(m_local_namespace,code[1][1].str());
            value = valExpr.eval().toString();
        }
        return new ScriptLineDef(m_local_namespace,type,name,value);
    }
    else if (code.name() == "=") // assign new value
    {
        std::string name = code[0].name();
        const Kernel::EParser& value = code[1];
        return new ScriptLineSet(m_local_namespace,name,Expression_ptr(new Expression(m_local_namespace,value)));
    }
    else if (code.name() == "if") // if(cond1:expr1,cond2:(expr2;expr3;expr4;...),def_expr)
    {
        ScriptLineIf *sif = new ScriptLineIf(m_local_namespace);
        size_t n = code.size();
        for(size_t i=0; i<n; ++i)
        {
            const Kernel::EParser& clause = code[i];
            if (clause.name() == ":")
            {
                Expression* cond = new Expression(m_local_namespace,clause[0]);
                ScriptAnonymousBlock* block = new ScriptAnonymousBlock(this);
                //block->addLines(clause[1]);
                sif->addCondition(Expression_ptr(cond),ScriptAnonymousBlock_ptr(block));
            }
            else
            {
                ScriptAnonymousBlock* block = new ScriptAnonymousBlock(this);
                //block->addLines(clause);
                sif->addDefault(ScriptAnonymousBlock_ptr(block));
            }
        }
        return sif;
    }
    else if (code.name() == "for") // for(Scalar: i=0,i<10,i = i + 1,(line1;line2;line3;...))
    {
        if (code.size() != 4)
        {
            throw std::runtime_error("Script line -for- has a wrong structure");
        }
        ScriptAnonymousBlock_ptr block = ScriptAnonymousBlock_ptr(new ScriptAnonymousBlock(this));
        ScriptLine* init = block->createLine(code[0]);
        Expression_ptr end_cond(new Expression(block->getLocalNamespace_ptr(),code[1]));
        ScriptLine* next = block->createLine(code[2]);
        //block->addLines(code[3]);
        ScriptLineFor* sfor = new ScriptLineFor(init,end_cond,next,block);
        return sfor;
    }
    else // function call
    {
        std::string fnName = code.name();
        ScriptLineCall* call = new ScriptLineCall(m_local_namespace,*this,fnName);
        for(int i=0; i<code.size(); ++i) // looping the function arguments
        {
            const Kernel::EParser& arg = code[i];
            if (arg.name() != "=")
            {
                throw std::invalid_argument("Actual function arguments must be passed as name=value");
            }
            std::string name = arg[0].name();
            const Kernel::EParser& value = arg[1];
            call->setArgument(name,value);
        }
        call->check();
        return call;
    }
    return NULL;
}