Beispiel #1
0
/* ?: */
Expr *Term2(void)
{
	Expr *expr, *l;
	expr = Term3();
	while(token == OP_QUESTION)
	{
		l = expr;
		expr = ExprNew();
		expr->fn = eval_ternary;
		expr->l = l;
		token = GetToken();
		expr->r = ExprNew();
		expr->r->l = Term2();
		if(token == OP_COLON)
		{
			token = GetToken();
			expr->r->r = Term2();
		}
		else
		{
			ErrUnknown(token, ":", "expression syntax");
		}
	}
	return expr;
}
Beispiel #2
0
void CParser::Term()
{
	Term2();
	while (true)
	{
		switch (mLookahead)
		{
			case '/': Match('/'); Term2(); AddToken(opDiv); break;
			case '*': Match('*'); Term2(); AddToken(opMul); break;
			default: return;
		}
	}
} // CParser::Term
Beispiel #3
0
/* =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= */
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;
}