public bool ParseBlocks(string input)
        {
            //  [expression] opt ended by ";"
            //  (block)
            //      [(block) operator (block)]
            //      [(var op var) operator (var op (block))]
            //      [(var op var) operator (var op (op var))]
            // var & op delimited by ' ' :
            //      [(str str str) str (str str (str str))]
            // op is determined by:
            //      1. Outside of any block
            //      2. Item 1 if two items
            //      3. Even # items if odd # items total
            //      4. Error if even # items > 2
            // var is determined by:
            //      Remainders in the lists

            // Parse text into useable form
            IBlockParser parser = new BlockCharParser(OPEN_TAG, CLOSE_TAG, DELIMITER);
            Block        expression;

            if (parser.ValidateBalancedTags(input))
            {
                expression = new Block(input, parser);
                Console.WriteLine(expression);
            }
            else
            {
                Console.WriteLine(parser.Log);
                return(false);
            }

            // Create operations
            BooleanExp operation = ParseOperators(expression);


            // Create assignment context.
            Dictionary <string, string>    allAssignments   = GetVariablesText(input, ASSIGNMENT_TRIGGER, ASSIGNMENT_OPERATOR);
            Dictionary <VariableExp, bool> validAssignments = ConvertVariableAssignment(allAssignments);

            Context context = new Context();

            context = AssignVariables(validAssignments, context);

            // Perform calculation
            return(operation.Evaluate(context));
        }
 public override bool Evaluate(Context aContext)
 {
     return
         (_operand1.Evaluate(aContext) &&
          _operand2.Evaluate(aContext));
 }