Beispiel #1
0
        public override void Check(SequenceCheckingEnvironment env)
        {
            base.Check(env);

            if (DestVar.Type == "")
            {
                return; // we can't check source and destination types if the variable is untyped, only runtime-check possible
            }
            if (TypesHelper.ExtractSrc(DestVar.Type) == null || TypesHelper.ExtractDst(DestVar.Type) == null || TypesHelper.ExtractDst(DestVar.Type) == "SetValueType")
            {
                throw new SequenceParserException(Symbol, "map<S,T> or array<T> or deque<T>", DestVar.Type);
            }
            if (DestVar.Type.StartsWith("array"))
            {
                if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), "int", env.Model))
                {
                    throw new SequenceParserException(Symbol, "int", KeyExpression.Type(env));
                }
            }
            else if (DestVar.Type.StartsWith("deque"))
            {
                if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), "int", env.Model))
                {
                    throw new SequenceParserException(Symbol, "int", KeyExpression.Type(env));
                }
            }
            else
            {
                if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), TypesHelper.ExtractSrc(DestVar.Type), env.Model))
                {
                    throw new SequenceParserException(Symbol, TypesHelper.ExtractSrc(DestVar.Type), KeyExpression.Type(env));
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Checks whether called match class filter exists, and type checks the inputs.
        /// </summary>
        public void CheckMatchClassFilterCalls(List <SequenceFilterCall> sequenceFilterCalls, List <SequenceRuleCall> ruleCalls)
        {
            foreach (SequenceFilterCall sequenceFilterCall in sequenceFilterCalls)
            {
                String matchClassName = GetMatchClassName(sequenceFilterCall);
                foreach (SequenceRuleCall ruleCall in ruleCalls)
                {
                    if (!IsRuleImplementingMatchClass(ruleCall.PackagePrefixedName, matchClassName))
                    {
                        throw new SequenceParserException(matchClassName, ruleCall.PackagePrefixedName, SequenceParserError.MatchClassNotImplementedError);
                    }
                }

                String filterCallName = GetFilterCallName(sequenceFilterCall);

                // Check whether number of filter parameters match
                if (NumFilterFunctionParameters(sequenceFilterCall) != sequenceFilterCall.ArgumentExpressions.Length)
                {
                    throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterParameterError);
                }

                // Check parameter types
                for (int i = 0; i < sequenceFilterCall.ArgumentExpressions.Length; i++)
                {
                    sequenceFilterCall.ArgumentExpressions[i].Check(this);

                    String argumentType = sequenceFilterCall.ArgumentExpressions[i].Type(this);
                    String paramterType = FilterFunctionParameterType(i, sequenceFilterCall);
                    if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                    {
                        throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterParameterError);
                    }
                }
            }
        }
Beispiel #3
0
        private void CheckOutputParametersRuleAll(Invocation invocation, SequenceVariable[] ReturnVars)
        {
            // Check whether number of parameters and return parameters match
            if (ReturnVars.Length != 0 && NumOutputParameters(invocation, null) != ReturnVars.Length)
            {
                throw new SequenceParserException(invocation, ReturnVars.Length, SequenceParserError.BadNumberOfReturnParameters);
            }

            // Check return types
            for (int i = 0; i < ReturnVars.Length; ++i)
            {
                String argumentType = ReturnVars[i].Type;
                String paramterType = OutputParameterType(i, invocation, null);
                if (argumentType == "")
                {
                    continue; // only runtime checks possible
                }
                if (!argumentType.StartsWith("array<"))
                {
                    Console.Error.WriteLine("An all call expects all return parameters T in an array<T>");
                    throw new SequenceParserException(invocation, -1, SequenceParserError.BadReturnParameter, i);
                }
                if (!TypesHelper.IsSameOrSubtype(paramterType, argumentType.Substring(6, ReturnVars[i].Type.Length - 7), Model))
                {
                    Console.Error.WriteLine("The arrays of the all call are inconsemurable in their value types");
                    throw new SequenceParserException(invocation, -1, SequenceParserError.BadReturnParameter, i);
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// Checks whether called filter exists, and type checks the inputs.
        /// </summary>
        private void CheckFilterCalls(String ruleName, List <SequenceFilterCall> sequenceFilterCalls)
        {
            foreach (SequenceFilterCall sequenceFilterCall in sequenceFilterCalls)
            {
                String filterCallName = GetFilterCallName(sequenceFilterCall);

                // Check whether number of filter parameters match
                if (NumFilterFunctionParameters(sequenceFilterCall) != sequenceFilterCall.ArgumentExpressions.Length)
                {
                    throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterParameterError);
                }

                // Check parameter types
                for (int i = 0; i < sequenceFilterCall.ArgumentExpressions.Length; i++)
                {
                    sequenceFilterCall.ArgumentExpressions[i].Check(this);

                    String argumentType = sequenceFilterCall.ArgumentExpressions[i].Type(this);
                    String paramterType = FilterFunctionParameterType(i, sequenceFilterCall);
                    if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                    {
                        throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterParameterError);
                    }
                }
            }
        }
        public override void Check(SequenceCheckingEnvironment env)
        {
            base.Check(env);

            GrGenType nodeOrEdgeType = TypesHelper.GetNodeOrEdgeType(GraphElementVar.Type, env.Model);
            if(GraphElementVar.Type != "" && nodeOrEdgeType == null)
                throw new SequenceParserException(Symbol, "node or edge type", GraphElementVar.Type);
            if(!TypesHelper.IsSameOrSubtype(VisitedFlagExpression.Type(env), "int", env.Model))
                throw new SequenceParserException(Symbol, "int", VisitedFlagExpression.Type(env));
        }
        public override void Check(SequenceCheckingEnvironment env)
        {
            base.Check(env);

            if (DestVar.Type == "")
            {
                return; // we can't gain access to an attribute type if the variable is untyped, only runtime-check possible
            }
            InheritanceType inheritanceType = TypesHelper.GetInheritanceType(DestVar.Type, env.Model);

            if (inheritanceType == null)
            {
                throw new SequenceParserException(Symbol, "node or edge or object or transient object type (class)", DestVar.Type);
            }
            AttributeType attributeType = inheritanceType.GetAttributeType(AttributeName);

            if (attributeType == null)
            {
                throw new SequenceParserException(AttributeName, SequenceParserError.UnknownAttribute);
            }

            string ContainerType = TypesHelper.AttributeTypeToXgrsType(attributeType);

            if (TypesHelper.ExtractSrc(ContainerType) == null ||
                TypesHelper.ExtractDst(ContainerType) == null ||
                TypesHelper.ExtractDst(ContainerType) == "SetValueType")
            {
                throw new SequenceParserException(Symbol, "map<S,T> or array<T> or deque<T>", DestVar.Type);
            }
            if (ContainerType.StartsWith("array"))
            {
                if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), "int", env.Model))
                {
                    throw new SequenceParserException(Symbol, "int", KeyExpression.Type(env));
                }
            }
            else if (ContainerType.StartsWith("deque"))
            {
                if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), "int", env.Model))
                {
                    throw new SequenceParserException(Symbol, "int", KeyExpression.Type(env));
                }
            }
            else
            {
                if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), TypesHelper.ExtractSrc(ContainerType), env.Model))
                {
                    throw new SequenceParserException(Symbol, TypesHelper.ExtractSrc(ContainerType), KeyExpression.Type(env));
                }
            }
        }
Beispiel #7
0
        private void CheckSubgraph(Invocation invocation)
        {
            SequenceVariable subgraph;

            if (invocation is RuleInvocation)
            {
                RuleInvocation ruleInvocation = (RuleInvocation)invocation;
                subgraph = ruleInvocation.Subgraph;
            }
            else
            {
                SequenceInvocation sequenceInvocation = (SequenceInvocation)invocation;
                subgraph = sequenceInvocation.Subgraph;
            }
            if (subgraph != null && !TypesHelper.IsSameOrSubtype("graph", subgraph.Type, Model))
            {
                throw new SequenceParserException(invocation.Name, subgraph.Type, SequenceParserError.SubgraphTypeError);
            }
        }
Beispiel #8
0
        private void CheckOutputParameters(Invocation invocation, SequenceVariable[] ReturnVars, GrGenType ownerType)
        {
            // Check whether number of parameters and return parameters match
            if (ReturnVars.Length != 0 && NumOutputParameters(invocation, ownerType) != ReturnVars.Length)
            {
                throw new SequenceParserException(invocation, ReturnVars.Length, SequenceParserError.BadNumberOfReturnParameters);
            }

            // Check return types
            for (int i = 0; i < ReturnVars.Length; ++i)
            {
                String argumentType = ReturnVars[i].Type;
                String paramterType = OutputParameterType(i, invocation, ownerType);
                if (!TypesHelper.IsSameOrSubtype(paramterType, argumentType, Model))
                {
                    throw new SequenceParserException(invocation, -1, SequenceParserError.BadReturnParameter, i);
                }
            }
        }
Beispiel #9
0
        private void CheckInputParameters(Invocation invocation, SequenceExpression[] ArgumentExpressions, GrGenType ownerType)
        {
            // Check whether number of parameters and return parameters match
            if (NumInputParameters(invocation, ownerType) != ArgumentExpressions.Length)
            {
                throw new SequenceParserException(invocation, ArgumentExpressions.Length, SequenceParserError.BadNumberOfParameters);
            }

            // Check parameter types
            for (int i = 0; i < ArgumentExpressions.Length; i++)
            {
                ArgumentExpressions[i].Check(this);

                String argumentType = ArgumentExpressions[i].Type(this);
                String paramterType = InputParameterType(i, invocation, ownerType);
                if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                {
                    throw new SequenceParserException(invocation, -1, SequenceParserError.BadParameter, i);
                }
            }
        }
Beispiel #10
0
        /// <summary>
        /// Checks whether called match class filter exists, and type checks the inputs.
        /// </summary>
        public void CheckMatchClassFilterCalls(List <SequenceFilterCallBase> sequenceFilterCalls, List <SequenceRuleCall> ruleCalls)
        {
            foreach (SequenceFilterCallBase sequenceFilterCallBase in sequenceFilterCalls)
            {
                String matchClassName = GetMatchClassName(sequenceFilterCallBase);
                foreach (SequenceRuleCall ruleCall in ruleCalls)
                {
                    if (!IsRuleImplementingMatchClass(ruleCall.PackagePrefixedName, matchClassName))
                    {
                        throw new SequenceParserException(matchClassName, ruleCall.PackagePrefixedName, SequenceParserError.MatchClassNotImplementedError);
                    }
                }

                if (sequenceFilterCallBase is SequenceFilterCall)
                {
                    SequenceFilterCall sequenceFilterCall = (SequenceFilterCall)sequenceFilterCallBase;

                    String filterCallName = GetFilterCallName(sequenceFilterCall);

                    // Check whether number of filter parameters match
                    if (NumFilterFunctionParameters(sequenceFilterCall) != sequenceFilterCall.ArgumentExpressions.Length)
                    {
                        throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterParameterError);
                    }

                    // Check parameter types
                    for (int i = 0; i < sequenceFilterCall.ArgumentExpressions.Length; i++)
                    {
                        sequenceFilterCall.ArgumentExpressions[i].Check(this);

                        String argumentType = sequenceFilterCall.ArgumentExpressions[i].Type(this);
                        String paramterType = FilterFunctionParameterType(i, sequenceFilterCall);
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterParameterError);
                        }
                    }
                }
                else
                {
                    SequenceFilterCallLambdaExpression sequenceFilterCallLambdaExpression = (SequenceFilterCallLambdaExpression)sequenceFilterCallBase;

                    String filterCallName = GetFilterCallName(sequenceFilterCallLambdaExpression);

                    FilterCallWithLambdaExpression filterCall = sequenceFilterCallLambdaExpression.FilterCall;

                    if (filterCall.initArrayAccess != null)
                    {
                        String argumentType = filterCall.initArrayAccess.Type;
                        String paramterType = "array<match<class " + matchClassName + ">>";
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }

                    if (filterCall.initExpression != null)
                    {
                        filterCall.initExpression.Check(this);
                    }

                    if (filterCall.arrayAccess != null)
                    {
                        String argumentType = filterCall.arrayAccess.Type;
                        String paramterType = "array<match<class " + matchClassName + ">>";
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }
                    if (filterCall.previousAccumulationAccess != null)
                    {
                        String argumentType = filterCall.previousAccumulationAccess.Type;
                        String paramterType = TypeOfMemberOrAttribute("match<class " + matchClassName + ">", filterCall.Entity);
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }
                    if (filterCall.index != null)
                    {
                        String argumentType = filterCall.index.Type;
                        String paramterType = "int";
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }
                    String elementArgumentType = filterCall.element.Type;
                    String elementParamterType = "match<class " + matchClassName + ">";
                    if (!TypesHelper.IsSameOrSubtype(elementArgumentType, elementParamterType, Model))
                    {
                        throw new SequenceParserException(matchClassName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                    }

                    filterCall.lambdaExpression.Check(this);
                }
            }
        }
Beispiel #11
0
        /// <summary>
        /// Checks whether called filter exists, and type checks the inputs.
        /// </summary>
        private void CheckFilterCalls(String ruleName, List <SequenceFilterCallBase> sequenceFilterCalls)
        {
            foreach (SequenceFilterCallBase sequenceFilterCallBase in sequenceFilterCalls)
            {
                if (sequenceFilterCallBase is SequenceFilterCall)
                {
                    SequenceFilterCall sequenceFilterCall = (SequenceFilterCall)sequenceFilterCallBase;

                    String filterCallName = GetFilterCallName(sequenceFilterCall);

                    // Check whether number of filter parameters match
                    if (NumFilterFunctionParameters(sequenceFilterCall) != sequenceFilterCall.ArgumentExpressions.Length)
                    {
                        throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterParameterError);
                    }

                    // Check parameter types
                    for (int i = 0; i < sequenceFilterCall.ArgumentExpressions.Length; i++)
                    {
                        sequenceFilterCall.ArgumentExpressions[i].Check(this);

                        String argumentType = sequenceFilterCall.ArgumentExpressions[i].Type(this);
                        String paramterType = FilterFunctionParameterType(i, sequenceFilterCall);
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterParameterError);
                        }
                    }
                }
                else
                {
                    SequenceFilterCallLambdaExpression sequenceFilterCallLambdaExpression = (SequenceFilterCallLambdaExpression)sequenceFilterCallBase;

                    String filterCallName = GetFilterCallName(sequenceFilterCallLambdaExpression);

                    FilterCallWithLambdaExpression filterCall = sequenceFilterCallLambdaExpression.FilterCall;

                    if (filterCall.initArrayAccess != null)
                    {
                        String argumentType = filterCall.initArrayAccess.Type;
                        String paramterType = "array<match<" + ruleName + ">>";
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }

                    if (filterCall.initExpression != null)
                    {
                        filterCall.initExpression.Check(this);
                    }

                    if (filterCall.arrayAccess != null)
                    {
                        String argumentType = filterCall.arrayAccess.Type;
                        String paramterType = "array<match<" + ruleName + ">>";
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }
                    if (filterCall.previousAccumulationAccess != null)
                    {
                        String argumentType = filterCall.previousAccumulationAccess.Type;
                        String paramterType = TypeOfTopLevelEntityInRule(ruleName, filterCall.Entity);
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }
                    if (filterCall.index != null)
                    {
                        String argumentType = filterCall.index.Type;
                        String paramterType = "int";
                        if (!TypesHelper.IsSameOrSubtype(argumentType, paramterType, Model))
                        {
                            throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                        }
                    }
                    String elementArgumentType = filterCall.element.Type;
                    String elementParamterType = "match<" + ruleName + ">";
                    if (!TypesHelper.IsSameOrSubtype(elementArgumentType, elementParamterType, Model))
                    {
                        throw new SequenceParserException(ruleName, filterCallName, SequenceParserError.FilterLambdaExpressionError);
                    }

                    filterCall.lambdaExpression.Check(this);
                }
            }
        }