static return_type<T1,U1,Term1> subs(const Term1 &t, const std::string &name, const T1 &c, const U1 &s, const symbol_set &s_set) { Derived tmp; tmp.m_symbol_set = s_set; tmp.insert(Term1(typename Term1::cf_type(1),t.m_key)); return math::t_subs(t.m_cf,name,c,s) * tmp; }
/* =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= */ Expr *Term1(void) { int op; Expr *l, *expr; expr = Term2(); while((op = token) == OP_ASSIGN) { if((expr == NULL) || (expr->fn != eval_lvalue)) { LogError("expression syntax: Variable expected on left side of %s.", token_buffer); PrintFileAndLineNumber(); } l = expr; expr = ExprNew(); expr->l = l; token = GetToken(); expr->r = Term1(); switch(op) { case OP_ASSIGN: expr->fn = eval_assign; CheckRValue(expr->r, "="); break; default: expr->fn = eval_assign; CheckRValue(expr->r, "="); break; } } return expr; }
/* , */ Expr *Term0(void) { Expr *expr, *l; int old_vector_closing = vector_closing; vector_closing = 0; expr = Term1(); while(token == OP_COMMA) { l = expr; expr = ExprNew(); expr->fn = eval_comma; expr->l = l; token = GetToken(); expr->r = Term1(); CheckLValue(expr->l, ","); CheckRValue(expr->r, ","); } vector_closing = old_vector_closing; return expr; }
static return_type<T1,U1,Term1> subs(const Term1 &t, const std::string &name, const T1 &c, const U1 &s, const symbol_set &s_set) { return_type<T1,U1,Term1> retval(0); const auto key_subs = t.m_key.t_subs(name,c,s,s_set); for (const auto &x: key_subs) { Derived tmp; tmp.m_symbol_set = s_set; tmp.insert(Term1(t.m_cf,x.second)); retval += x.first * tmp; } return retval; }
Expr *MakeVec(void) { Expr *expr; expr = ExprNew(); expr->r = ExprNew(); expr->fn = eval_vector; expr->isvec = 1; token = GetToken(); if((expr->r->r = Term1()) != NULL) { if(token == OP_COMMA) { token = GetToken(); if((expr->r->l = Term1()) != NULL) { if(token == OP_COMMA) { token = GetToken(); vector_closing++; if((expr->l = Term1()) != NULL) { if(token == OP_GREATERTHAN) { token = GetToken(); vector_closing--; return expr; } else ErrUnknown(token, ">", "expression syntax"); } } else ErrUnknown(token, ",", "expression syntax"); } } else ErrUnknown(token, ",", "expression syntax"); } return expr; }
/************************************************************************* * * ExprParse - Parses and contructs an expression parse tree. * * Returns a pointer to top of expr tree or NULL if there's no * expr or an error occurred. * *************************************************************************/ Expr *ExprParse(void) { Expr *expr; int errcnt = error_count; token = GetToken(); vector_closing = 0; expr = Term1(); UngetToken(); if(error_count > errcnt) { ExprDelete(expr); return NULL; } return expr; }
void FirstTerm() { SignedFactor(); Term1(); }
void Term() { Factor(); Term1(); }
void FirstTerm() { FirstFactor(); Term1(); }