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;
			}
예제 #2
0
파일: exparse.c 프로젝트: oleavitt/gem
/* =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= */
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;
}
예제 #3
0
파일: exparse.c 프로젝트: oleavitt/gem
/* , */
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;
			}
예제 #5
0
파일: exparse.c 프로젝트: oleavitt/gem
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;
}
예제 #6
0
파일: exparse.c 프로젝트: oleavitt/gem
/*************************************************************************
*
*  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;
}
예제 #7
0
void FirstTerm()
{
    SignedFactor();
    Term1();
}
예제 #8
0
void Term()
{
    Factor();
    Term1();
}
예제 #9
0
void FirstTerm() {
  FirstFactor();
  Term1();
}