Code/Operators/IOperator.cs
using Expressive.Expressions;
using System.Collections.Generic;

namespace Expressive.Operators
{
    /// <summary>
    /// Definition for all Operators (i.e. +, -, etc.) that are available in Expressive.
    /// </summary>
    public interface IOperator : IOperatorMetadata
    {
        /// <summary>
        /// Builds the operator in to an <see cref="IExpression"/> ready for evaluation.
        /// </summary>
        /// <param name="previousToken">The previous <see cref="Token"/>.</param>
        /// <param name="expressions">The <see cref="IExpression"/>s to use within the operation (e.g. left hand side and right hand side).</param>
        /// <param name="context">The <see cref="Context"/> to use within the operation.</param>
        /// <returns>An <see cref="IExpression"/> that can be evaluated.</returns>
        IExpression BuildExpression(Token previousToken, IExpression[] expressions, Context context);

        /// <summary>
        /// Determines whether this implementation can consume the supplied <see cref="Token"/>s.
        /// </summary>
        /// <param name="previousToken">The previous <see cref="Token"/>.</param>
        /// <param name="token">The current <see cref="Token"/>.</param>
        /// <param name="remainingTokens">A remaining <see cref="Token"/>s.</param>
        /// <returns>True if this implementation can consume the supplied <see cref="Token"/>s, false otherwise.</returns>
        bool CanGetCaptiveTokens(Token previousToken, Token token, Queue<Token> remainingTokens);

        /// <summary>
        /// Consume the supplied <see cref="Token"/>s.
        /// </summary>
        /// <param name="previousToken">The previous <see cref="Token"/>.</param>
        /// <param name="token">The current <see cref="Token"/>.</param>
        /// <param name="remainingTokens">A remaining <see cref="Token"/>s.</param>
        /// <returns>The consumed <see cref="Token"/>s.</returns>
        Token[] GetCaptiveTokens(Token previousToken, Token token, Queue<Token> remainingTokens);

        /// <summary>
        /// Gets any nested <see cref="Token"/>s that can be consumed from within.
        /// </summary>
        /// <param name="allCaptiveTokens">All possible <see cref="Token"/>s to consume.</param>
        /// <returns>The consumed <see cref="Token"/>s.</returns>
        Token[] GetInnerCaptiveTokens(Token[] allCaptiveTokens);

        /// <summary>
        /// Gets the <see cref="OperatorPrecedence"/>. Basically how important it is over the other implementations.
        /// </summary>
        /// <param name="previousToken">The previous <see cref="Token"/>. Useful for determining whether the operator is unary or binary.</param>
        /// <returns>The <see cref="OperatorPrecedence"/> of this implementation.</returns>
        OperatorPrecedence GetPrecedence(Token previousToken);
    }
}