public TypeNode Dispatch(ExpressionNode node, List <TypeNode> parameterTypes)
 {
     return(node switch
     {
         IBinaryNumberOperator n => _numberHelper.VisitBinaryNumOp(n, parameterTypes),
         IBinaryBooleanOperator n => _booleanHelper.VisitBinaryBoolOp(n, parameterTypes),
         IBinarySetOperator n => _setHelper.VisitBinarySetOp(n, parameterTypes),
         SubsetExpression n => _setHelper.VisitSubset(n, parameterTypes),
         SetExpression n => _setHelper.VisitSet(n, parameterTypes),
         NotExpression n => _booleanHelper.VisitNot(n, parameterTypes),
         FunctionCallExpression n => _declarationHelper.VisitFunctionCall(n, parameterTypes),
         IdentifierExpression n => _declarationHelper.VisitIdentifier(n, parameterTypes),
         IntegerLiteralExpression _ => _declarationHelper.VisitIntegerLiteral(),
         RealLiteralExpression _ => _declarationHelper.VisitRealLiteral(),
         BooleanLiteralExpression _ => _declarationHelper.VisitBooleanLiteral(),
         StringLiteralExpression _ => _declarationHelper.VisitStringLiteral(),
         EmptySetLiteralExpression _ => _declarationHelper.VisitEmptySetLiteral(),
         AdditionExpression n => _commonOperatorHelper.VisitAddition(n, parameterTypes),
         SubtractionExpression n => _commonOperatorHelper.VisitSubtraction(n, parameterTypes),
         AbsoluteValueExpression n => _commonOperatorHelper.VisitAbsoluteValue(n, parameterTypes),
         IRelationOperator n => _commonOperatorHelper.VisitRelationalOperator(n, parameterTypes),
         IEquivalenceOperator n => _commonOperatorHelper.VisitEquivalenceOperator(n, parameterTypes),
         NegativeExpression n => _numberHelper.VisitNegative(n, parameterTypes),
         ElementExpression n => _commonOperatorHelper.VisitElement(n, parameterTypes),
         ISetGraphField n => _commonOperatorHelper.VisitISetGraphField(n, parameterTypes),
         IFunctionGraphField n => _commonOperatorHelper.VisitIFunctionGraphField(n, parameterTypes),
         GraphExpression n => _commonOperatorHelper.VisitGraph(n, parameterTypes),
         AnonymousFunctionExpression n => _declarationHelper.VisitAnonymousFunction(n, parameterTypes),
         _ => throw new UnimplementedTypeCheckerException(node, "Dispatch"),
     });
        private SubsetExpression GetSubsetExpression(TypeEnum left, TypeEnum right)
        {
            ExpressionNode leftNode  = GetSet();
            ExpressionNode rightNode = GetSet();
            var            node      = new SubsetExpression(leftNode, rightNode, 0, 0);

            return(node);
        }
        public bool SubsetBoolean(SubsetExpression node, List <object> parameters)
        {
            ExpressionNode lhs      = node.Children[0];
            ExpressionNode rhs      = node.Children[1];
            Set            subset   = _interpreter.DispatchSet(lhs, parameters);
            Set            superset = _interpreter.DispatchSet(rhs, parameters);

            return(subset.Elements.IsSubsetOf(superset.Elements));
        }
Exemplo n.º 4
0
        public TypeNode VisitSubset(SubsetExpression node, List <TypeNode> parameterTypes)
        {
            TypeNode left  = _getType(node.Children[0], parameterTypes);
            TypeNode right = _getType(node.Children[1], parameterTypes);

            if (!IsSet(left.Type) || !IsSet(right.Type))
            {
                throw new UnmatchableTypesException((Node)node, left.Type, right.Type, "boolean");
            }
            return(new TypeNode(TypeEnum.Boolean, 0, 0));
        }
        public void SubsetBoolean_GivenSetAndSet_CorrectValueReturned(int[] a, int[] b, bool expected)
        {
            Set              lhsValue   = GetSetWith1DElements(a);
            Set              rhsValue   = GetSetWith1DElements(b);
            SetExpression    lhs        = GetSetInit();
            SetExpression    rhs        = GetSetInit();
            SubsetExpression expression = new SubsetExpression(lhs, rhs, 0, 0);

            IInterpreterBoolean parent = Substitute.For <IInterpreterBoolean>();

            DispatchSetForParent(lhsValue, lhs, parent);
            DispatchSetForParent(rhsValue, rhs, parent);
            BooleanHelper booleanHelper = Utilities.GetBooleanHelper(parent);

            bool res = booleanHelper.SubsetBoolean(expression, new List <object>());

            Assert.AreEqual(expected, res);
        }