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); }