示例#1
0
 protected override string FilterFunctionParameterType(int i, FilterCall filterCall, SequenceRuleCall seq)
 {
     if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst")
         return "int";
     if(filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction")
         return "double";
     if(filterCall.Name == "keepLast" || filterCall.Name == "removeLast")
         return "int";
     if(filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
         return "double";
     foreach(IFilter filter in seq.ParamBindings.Action.RulePattern.Filters)
     {
         if(filter is IFilterFunction)
         {
             IFilterFunction filterFunction = (IFilterFunction)filter;
             if(filterCall.PackagePrefixedName == filterFunction.PackagePrefixedName)
                 return TypesHelper.DotNetTypeToXgrsType(filterFunction.Inputs[i]);
         }
     }
     throw new Exception("Internal error");
 }
示例#2
0
 protected override bool IsFilterExisting(FilterCall filterCall, SequenceRuleCall seq)
 {
     if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst"
         || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction"
         || filterCall.Name == "keepLast" || filterCall.Name == "removeLast"
         || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
     {
         filterCall.Package = null;
         filterCall.PackagePrefixedName = filterCall.Name;
         return true;
     }
     filterCall.Package = filterCall.PrePackage;
     filterCall.PackagePrefixedName = filterCall.Package != null ? filterCall.Package + "::" + filterCall.Name : filterCall.Name;
     if(filterCall.IsContainedIn(seq.ParamBindings.Action.RulePattern.Filters))
         return true;
     if(filterCall.IsAutoGenerated && seq.ParamBindings.Package != null)
     {
         filterCall.Package = seq.ParamBindings.Package;
         filterCall.PackagePrefixedName = seq.ParamBindings.Package + "::" + filterCall.Name;
         return filterCall.IsContainedIn(seq.ParamBindings.Action.RulePattern.Filters);
     }
     return false;
 }
示例#3
0
 protected override int NumFilterFunctionParameters(FilterCall filterCall, SequenceRuleCall seq)
 {
     if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst"
         || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction"
         || filterCall.Name == "keepLast" || filterCall.Name == "removeLast"
         || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
     {
         return 1;
     }
     foreach(IFilter filter in seq.ParamBindings.Action.RulePattern.Filters)
     {
         if(filter is IFilterFunction)
         {
             IFilterFunction filterFunction = (IFilterFunction)filter;
             if(filterCall.PackagePrefixedName == filterFunction.PackagePrefixedName)
                 return filterFunction.Inputs.Length;
         }
     }
     return 0; // auto-generated
 }
示例#4
0
 protected abstract int NumFilterFunctionParameters(FilterCall filterCall, SequenceRuleCall seq);
示例#5
0
 protected abstract string FilterFunctionParameterType(int i, FilterCall filterCall, SequenceRuleCall seq);
示例#6
0
 protected override string FilterFunctionParameterType(int i, FilterCall filterCall, SequenceRuleCall seq)
 {
     if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst")
         return "int";
     if(filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction")
         return "double";
     if(filterCall.Name == "keepLast" || filterCall.Name == "removeLast")
         return "int";
     if(filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
         return "double";
     return filterFunctionsToInputTypes[filterCall.PackagePrefixedName][i];
 }
示例#7
0
 protected abstract bool IsFilterExisting(FilterCall filterCall, SequenceRuleCall seq);
示例#8
0
 protected override int NumFilterFunctionParameters(FilterCall filterCall, SequenceRuleCall seq)
 {
     if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst"
         || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction"
         || filterCall.Name == "keepLast" || filterCall.Name == "removeLast"
         || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
     {
         return 1;
     }
     if(filterFunctionsToInputTypes.ContainsKey(filterCall.PackagePrefixedName))
         return filterFunctionsToInputTypes[filterCall.PackagePrefixedName].Count;
     else
         return 0; // auto-supplied
 }
示例#9
0
        protected override bool IsFilterExisting(FilterCall filterCall, SequenceRuleCall seq)
        {
            if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst"
                || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction"
                || filterCall.Name == "keepLast" || filterCall.Name == "removeLast"
                || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
            {
                filterCall.Package = null;
                filterCall.PackagePrefixedName = filterCall.Name;
                return true;
            }

            if(filterCall.PrePackage != null)
            {
                filterCall.Package = filterCall.PrePackage;
                filterCall.PackagePrefixedName = filterCall.PrePackage + "::" + filterCall.Name;
                return filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName]);
            }
            else
            {
                filterCall.Package = null;
                filterCall.PackagePrefixedName = filterCall.Name;
                if(filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName]))
                    return true;
                if(filterCall.PrePackageContext != null)
                {
                    filterCall.Package = filterCall.PrePackageContext;
                    filterCall.PackagePrefixedName = filterCall.PrePackageContext + "::" + filterCall.Name;
                    if(filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName]))
                        return true;
                }
                if(filterCall.IsAutoGenerated && seq.ParamBindings.Package != null)
                {
                    filterCall.Package = seq.ParamBindings.Package;
                    filterCall.PackagePrefixedName = seq.ParamBindings.Package + "::" + filterCall.Name;
                    return filterCall.IsContainedIn(rulesToFilters[seq.ParamBindings.PackagePrefixedName]);
                }
                return false;
            }
        }
示例#10
0
 void EmitFilterCall(SourceBuilder source, FilterCall filterCall, string patternName, string matchesName)
 {
     if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst"
         || filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction"
         || filterCall.Name == "keepLast" || filterCall.Name == "removeLast"
         || filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
     {
         switch(filterCall.Name)
         {
             case "keepFirst":
                 source.AppendFrontFormat("{0}.FilterKeepFirst((int)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "keepLast":
                 source.AppendFrontFormat("{0}.FilterKeepLast((int)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "keepFirstFraction":
                 source.AppendFrontFormat("{0}.FilterKeepFirstFraction((double)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "keepLastFraction":
                 source.AppendFrontFormat("{0}.FilterKeepLastFraction((double)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "removeFirst":
                 source.AppendFrontFormat("{0}.FilterRemoveFirst((int)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "removeLast":
                 source.AppendFrontFormat("{0}.FilterRemoveLast((int)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "removeFirstFraction":
                 source.AppendFrontFormat("{0}.FilterRemoveFirstFraction((double)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
             case "removeLastFraction":
                 source.AppendFrontFormat("{0}.FilterRemoveLastFraction((double)({1}));\n",
                     matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
                 break;
         }
     }
     else
     {
         if(filterCall.IsAutoGenerated && filterCall.Name == "auto")
             source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}_{2}(procEnv, {3});\n",
                 TypesHelper.GetPackagePrefixDot(filterCall.Package), patternName, filterCall.Name, matchesName);
         else if(filterCall.IsAutoGenerated)
             source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}_{2}_{3}(procEnv, {4});\n",
                 TypesHelper.GetPackagePrefixDot(filterCall.Package), patternName, filterCall.Name, filterCall.Entity, matchesName);
         else
         {
             source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}(procEnv, {2}",
                 TypesHelper.GetPackagePrefixDot(filterCall.Package), filterCall.Name, matchesName);
             for(int i = 0; i < filterCall.ArgumentExpressions.Length; ++i)
             {
                 source.AppendFormat(", ({0})({1})",
                     TypesHelper.XgrsTypeToCSharpType(filterFunctionsToInputTypes[filterCall.Name][i], model),
                     GetSequenceExpression(filterCall.ArgumentExpressions[i], source));
             } 
             source.Append(");\n");
         }
     }
 }
示例#11
0
        void GRGEN_LIBGR.IAction.Filter(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, GRGEN_LIBGR.IMatches matches, GRGEN_LIBGR.FilterCall filter)
        {
            if (filter.IsAutoSupplied)
            {
                switch (filter.Name)
                {
                case "keepFirst": matches.FilterKeepFirst((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "keepLast": matches.FilterKeepLast((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "keepFirstFraction": matches.FilterKeepFirstFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "keepLastFraction": matches.FilterKeepLastFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "removeFirst": matches.FilterRemoveFirst((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "removeLast": matches.FilterRemoveLast((int)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "removeFirstFraction": matches.FilterRemoveFirstFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                case "removeLastFraction": matches.FilterRemoveLastFraction((double)(filter.ArgumentExpressions[0] != null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;

                default: throw new Exception("Unknown auto supplied filter name!");
                }
                return;
            }
            switch (filter.FullName)
            {
            default: throw new Exception("Unknown filter name!");
            }
        }
示例#12
0
 /// <summary>
 /// Filters the matches of a multi rule all call or multi rule backtracking construct
 /// (i.e. matches obtained from different rules, that implement a match class).
 /// </summary>
 /// <param name="actionEnv">The action execution environment, required by the filter implementation.</param>
 /// <param name="matches">The combined list of all matches of all rules (implementing the same match class; to inspect and filter)</param>
 /// <param name="filter">The filter to apply</param>
 public abstract void Filter(IActionExecutionEnvironment actionEnv, IList <IMatch> matches, FilterCall filter);