VbCodeExpressionPtr VbCodeExpressionFactory::CreateXorExpression(const Sentence& sentence)
{
	VbXorExpression expression{ sentence };
	if (!expression.xorExpression)
		return CreateAndExpression(expression.andExpression);
	return std::make_shared<VbCodeBinaryExpression>(
		VbCodeBinaryExpressionType::Xor,
		CreateXorExpression(*expression.xorExpression),
		CreateAndExpression(expression.andExpression));
}
    Expression ESolver::CreateAndExpression(const vector<Expression>& Conjuncts)
    {
        if(Conjuncts.size() == 0) {
            return Expression::NullObject;
        }
        if(Conjuncts.size() == 1) {
            return Conjuncts[0];
        }

        Expression Current = CreateAndExpression(Conjuncts[0], Conjuncts[1]);
        uint32 NumConjuncts = Conjuncts.size();
        for(uint32 i = 2; i < NumConjuncts; ++i) {
            Current = CreateAndExpression(Current, Conjuncts[i]);
        }
        return CreateExpression("and", Current->GetChildren());
    }
 Expression ESolver::CreateIffExpression(const Expression& Exp1,
                                         const Expression& Exp2)
 {
     vector<Expression> Children;
     Children.push_back(CreateImpliesExpression(Exp1, Exp2));
     Children.push_back(CreateImpliesExpression(Exp2, Exp1));
     return CreateAndExpression(Children);
 }