public static string Balance(SequenceExpressionType op, string operand, IGraphModel model)
        {
            string result;

            switch (op)
            {
            case SequenceExpressionType.UnaryMinus:
                result = BalanceArithmetic(operand, model);
                return(result);

            default:
                return("");
            }
        }
Example #2
0
        /// <summary>
        /// Initializes a new SequenceExpression object with the given sequence expression type.
        /// </summary>
        /// <param name="seqExprType">The sequence expression type.</param>
        public SequenceExpression(SequenceExpressionType seqExprType)
            : base(SequenceComputationType.Expression)
        {
            SequenceExpressionType = seqExprType;

            id = idSource;
            ++idSource;
        }
Example #3
0
 public SequenceExpressionFunctionCall(SequenceExpressionType seqExprType, FunctionInvocationParameterBindings paramBindings)
     : base(seqExprType)
 {
     ParamBindings = paramBindings;
 }
Example #4
0
 public SequenceExpressionIsReachable(SequenceExpression sourceNode, SequenceExpression endElement, SequenceExpression edgeType, SequenceExpression oppositeNodeType, SequenceExpressionType type)
     : base(type)
 {
     SourceNode = sourceNode;
     EndElement = endElement;
     EdgeType = edgeType;
     OppositeNodeType = oppositeNodeType;
     if(!(type == SequenceExpressionType.IsReachableNodes || type == SequenceExpressionType.IsReachableNodesViaIncoming || type == SequenceExpressionType.IsReachableNodesViaOutgoing)
         && !(type == SequenceExpressionType.IsReachableEdges || type == SequenceExpressionType.IsReachableEdgesViaIncoming || type == SequenceExpressionType.IsReachableEdgesViaOutgoing))
         throw new Exception("Internal failure, reachable with wrong type");
 }
Example #5
0
 public SequenceExpressionIsAdjacentIncident(SequenceExpression sourceNode, SequenceExpression endElement, SequenceExpression edgeType, SequenceExpression oppositeNodeType, SequenceExpressionType type)
     : base(type)
 {
     SourceNode = sourceNode;
     EndElement = endElement;
     EdgeType = edgeType;
     OppositeNodeType = oppositeNodeType;
     if(!(type == SequenceExpressionType.IsAdjacentNodes || type == SequenceExpressionType.IsAdjacentNodesViaIncoming || type == SequenceExpressionType.IsAdjacentNodesViaOutgoing)
         && !(type == SequenceExpressionType.IsIncidentEdges || type == SequenceExpressionType.IsIncomingEdges || type == SequenceExpressionType.IsOutgoingEdges))
         throw new Exception("Internal failure, isAdjacent/isIncident with wrong type");
 }
Example #6
0
 public SequenceExpressionCountBoundedReachable(SequenceExpression sourceNode, SequenceExpression depth, SequenceExpression edgeType, SequenceExpression oppositeNodeType, SequenceExpressionType type)
     : base(type)
 {
     SourceNode = sourceNode;
     Depth = depth;
     EdgeType = edgeType;
     OppositeNodeType = oppositeNodeType;
     if(!(type == SequenceExpressionType.CountBoundedReachableNodes || type == SequenceExpressionType.CountBoundedReachableNodesViaIncoming || type == SequenceExpressionType.CountBoundedReachableNodesViaOutgoing)
         && !(type == SequenceExpressionType.CountBoundedReachableEdges || type == SequenceExpressionType.CountBoundedReachableEdgesViaIncoming || type == SequenceExpressionType.CountBoundedReachableEdgesViaOutgoing))
         throw new Exception("Internal failure, count bounded reachable with wrong type");
 }
Example #7
0
 public SequenceExpressionBoundedReachableWithRemainingDepth(SequenceExpression sourceNode, SequenceExpression depth, SequenceExpression edgeType, SequenceExpression oppositeNodeType, SequenceExpressionType type)
     : base(type)
 {
     SourceNode = sourceNode;
     Depth = depth;
     EdgeType = edgeType;
     OppositeNodeType = oppositeNodeType;
     if(!(type == SequenceExpressionType.BoundedReachableNodesWithRemainingDepth || type == SequenceExpressionType.BoundedReachableNodesWithRemainingDepthViaIncoming || type == SequenceExpressionType.BoundedReachableNodesWithRemainingDepthViaOutgoing))
         throw new Exception("Internal failure, bounded reachable with remaining depth with wrong type");
 }
Example #8
0
 public SequenceExpressionCountAdjacentIncident(SequenceExpression sourceNode, SequenceExpression edgeType, SequenceExpression oppositeNodeType, SequenceExpressionType type)
     : base(type)
 {
     SourceNode = sourceNode;
     EdgeType = edgeType;
     OppositeNodeType = oppositeNodeType;
     if(!(type == SequenceExpressionType.CountAdjacentNodes || type == SequenceExpressionType.CountAdjacentNodesViaIncoming || type == SequenceExpressionType.CountAdjacentNodesViaOutgoing)
         && !(type == SequenceExpressionType.CountIncidentEdges || type == SequenceExpressionType.CountIncomingEdges || type == SequenceExpressionType.CountOutgoingEdges))
         throw new Exception("Internal failure, count adjacent/incident with wrong type");
 }
Example #9
0
        public string BalancedTypeStatic; // the type of the operator, i.e. the common type of both operands for the operation

        /// <summary>
        /// Initializes a new SequenceBinaryExpression object with the given sequence expression type.
        /// </summary>
        /// <param name="seqExprType">The sequence expression type.</param>
        /// <param name="left">The left sequence expression.</param>
        /// <param name="right">The right sequence expression.</param>
        public SequenceBinaryExpression(SequenceExpressionType seqExprType, 
            SequenceExpression left, SequenceExpression right)
            : base(seqExprType)
        {
            SequenceExpressionType = seqExprType;

            this.Left = left;
            this.Right = right;
        }
Example #10
0
 public SequenceExpressionContainer(SequenceExpressionType type, SequenceExpression containerExpr)
     : base(type)
 {
     ContainerExpr = containerExpr;
 }
Example #11
0
 public SequenceExpressionContainerConstructor(SequenceExpressionType seqExprType, String valueType, SequenceExpression[] containerItems)
     : base(seqExprType)
 {
     ValueType = valueType;
     ContainerItems = containerItems;
 }
Example #12
0
 internal StatementsSeqExpr(
     Token identifer,
     SequenceExpressionType type)
     : this()
 {
     identifier = identifer;
     sequenceType = type;
 }
        /// <summary>
        /// Returns the types to which the operands must be casted to, 
        /// for the types of the left and right operands and the operator given.
        /// Used for type checking and casting at compile time.
        /// Returns "" if the type can only be determined at runtime.
        /// Returns "-" in case of a type error.
        /// </summary>
        public static string Balance(SequenceExpressionType op, string left, string right, IGraphModel model)
        {
            string result;

            switch(op)
            {
                case SequenceExpressionType.Equal:
                case SequenceExpressionType.NotEqual:
                    result = BalanceArithmetic(left, right, model);
                    if(result == "") return "";
                    if(result == "-")
                    {
                        result = BalanceString(left, right, model);
                        if(result == "") return "";
                        if(result == "-")
                        {
                            result = BalanceGraphElement(left, right, model);
                            if(result == "") return "";
                            if(result == "-")
                            {
                                result = BalanceExternalType(left, right, model);
                                if(result == "") return "";
                                if(result == "-")
                                {
                                    if(left == right) return left;
                                    else return "-";
                                }
                            }
                        }
                    }
                    return result;
                
                case SequenceExpressionType.Lower:
                case SequenceExpressionType.LowerEqual:
                case SequenceExpressionType.Greater:
                case SequenceExpressionType.GreaterEqual:
                    result = BalanceArithmetic(left, right, model);
                    if(result == "-")
                    {
                        if(left == right && (left.StartsWith("set<") || left.StartsWith("map<")
                            || left.StartsWith("array<") || left.StartsWith("deque<")))
                        {
                            return left;
                        }

                        result = BalanceExternalType(left, right, model);
                        return result;
                    }
                    return result;

                case SequenceExpressionType.StructuralEqual:
                    return "graph";

                case SequenceExpressionType.Plus:
                    result = BalanceArithmetic(left, right, model);
                    if(result == "") return "";
                    if(result == "-")
                    {
                        result = BalanceString(left, right, model);
                        if(result == "") return "";
                        if(result == "-")
                        {
                            if(left == right && (left.StartsWith("array<") || left.StartsWith("deque<")))
                                return left;
                            else return "-";
                        }
                    }
                    return result;

                case SequenceExpressionType.Minus:
                case SequenceExpressionType.Mul:
                case SequenceExpressionType.Div:
                case SequenceExpressionType.Mod:
                    result = BalanceArithmetic(left, right, model);
                    return result;

                default:
                    return "";
            }
        }
        // implicit casts supported by GrGen:
        // enum -> (integer) number
        // integer number -> larger integer number (note that there are no operators working on byte and short)
        // floating point number -> larger floating point number
        // integer number -> floating point number
        // everything -> string (for convenient emitting)

        // explicit casts supported by GrGen:
        // integer number -> smaller integer number
        // floating point number -> smaller floating point number
        // floating point number -> integer number
        // everything -> object


        /// <summary>
        /// Returns the types to which the operands must be casted to,
        /// for the types of the left and right operands and the operator given.
        /// Used for type checking and casting at compile time.
        /// Returns "" if the type can only be determined at runtime.
        /// Returns "-" in case of a type error.
        /// </summary>
        public static string Balance(SequenceExpressionType op, string left, string right, IGraphModel model)
        {
            string result;

            switch (op)
            {
            case SequenceExpressionType.Equal:
            case SequenceExpressionType.NotEqual:
                result = BalanceArithmetic(left, right, model);
                if (result == "")
                {
                    return("");
                }
                if (result == "-")
                {
                    result = BalanceString(left, right, model);
                    if (result == "")
                    {
                        return("");
                    }
                    if (result == "-")
                    {
                        result = BalanceGraphElement(left, right, model);
                        if (result == "")
                        {
                            return("");
                        }
                        if (result == "-")
                        {
                            result = BalanceExternalType(left, right, model);
                            if (result == "")
                            {
                                return("");
                            }
                            if (result == "-")
                            {
                                if (left == right)
                                {
                                    return(left);
                                }
                                else
                                {
                                    return("-");
                                }
                            }
                        }
                    }
                }
                return(result);

            case SequenceExpressionType.Lower:
            case SequenceExpressionType.LowerEqual:
            case SequenceExpressionType.Greater:
            case SequenceExpressionType.GreaterEqual:
                result = BalanceArithmetic(left, right, model);
                if (result == "-")
                {
                    if (left == right && (left.StartsWith("set<") || left.StartsWith("map<") ||
                                          left.StartsWith("array<") || left.StartsWith("deque<")))
                    {
                        return(left);
                    }

                    result = BalanceExternalType(left, right, model);
                    return(result);
                }
                return(result);

            case SequenceExpressionType.StructuralEqual:
                return("graph");

            case SequenceExpressionType.Plus:
                result = BalanceArithmetic(left, right, model);
                if (result == "")
                {
                    return("");
                }
                if (result == "-")
                {
                    result = BalanceString(left, right, model);
                    if (result == "")
                    {
                        return("");
                    }
                    if (result == "-")
                    {
                        if (left == right && (left.StartsWith("array<") || left.StartsWith("deque<")))
                        {
                            return(left);
                        }
                        else
                        {
                            return("-");
                        }
                    }
                }
                return(result);

            case SequenceExpressionType.Minus:
            case SequenceExpressionType.Mul:
            case SequenceExpressionType.Div:
            case SequenceExpressionType.Mod:
                result = BalanceArithmetic(left, right, model);
                return(result);

            case SequenceExpressionType.Except:
                if (left == "" || right == "")
                {
                    return("");
                }
                if (left == right && left.StartsWith("set<"))
                {
                    return(left);
                }
                if (left == right && left.StartsWith("map<"))
                {
                    return(left);
                }
                if (left.StartsWith("map<") && right.StartsWith("set<") && TypesHelper.ExtractSrc(left) == TypesHelper.ExtractSrc(right))
                {
                    return(left);
                }
                return("-");

            case SequenceExpressionType.StrictAnd:
            case SequenceExpressionType.StrictOr:
                if (left == "" || right == "")
                {
                    return("");
                }
                if (left == right && left == "boolean")
                {
                    return(left);
                }
                if (left == right && left.StartsWith("set<"))
                {
                    return(left);
                }
                if (left == right && left.StartsWith("map<"))
                {
                    return(left);
                }
                return("-");

            default:
                return("");
            }
        }