Beispiel #1
0
        internal static string CalcExpressionString(Dsl.ISyntaxComponent comp, FunctionOptions funcOpts, DslExpression.DslCalculator calculator)
        {
            StringBuilder sb = new StringBuilder();

            GenerateSyntaxComponent(comp, sb, 0, false, funcOpts, calculator);
            return(sb.ToString());
        }
Beispiel #2
0
 internal static void ParseFunctionOptions(Dsl.FunctionData opts, FunctionOptions funcOpts)
 {
     foreach (var opt in opts.Params)
     {
         var optFd = opt as Dsl.FunctionData;
         if (null != optFd)
         {
             if (optFd.GetId() == "needfuncinfo")
             {
                 funcOpts.NeedFuncInfo = optFd.GetParamId(0) == "true";
             }
             else if (optFd.GetId() == "rettype")
             {
                 var tn       = optFd.GetParamId(0);
                 var orit     = optFd.GetParam(1);
                 var oritk    = optFd.GetParam(2);
                 var t        = CalcTypeString(orit);
                 var tk       = CalcTypeString(oritk);
                 var ro       = int.Parse(optFd.GetParamId(3));
                 var isExtern = optFd.GetParamId(4) == "true";
                 funcOpts.RetTypes.Add(new TypeInfo {
                     Name = tn, Type = t, TypeKind = tk, RefOrOut = ro, IsExtern = isExtern, OriType = orit, OriTypeKind = oritk
                 });
             }
             else if (optFd.GetId() == "paramtype")
             {
                 var tn       = optFd.GetParamId(0);
                 var orit     = optFd.GetParam(1);
                 var oritk    = optFd.GetParam(2);
                 var t        = CalcTypeString(orit);
                 var tk       = CalcTypeString(oritk);
                 var ro       = int.Parse(optFd.GetParamId(3));
                 var isExtern = optFd.GetParamId(4) == "true";
                 funcOpts.ParamTypes.Add(new TypeInfo {
                     Name = tn, Type = t, TypeKind = tk, RefOrOut = ro, IsExtern = isExtern, OriType = orit, OriTypeKind = oritk
                 });
             }
             else if (optFd.GetId() == "parambecaptured")
             {
                 var tn       = optFd.GetParamId(0);
                 var orit     = optFd.GetParam(1);
                 var t        = CalcTypeString(orit);
                 var isExtern = optFd.GetParamId(2) == "true";
                 funcOpts.ParamBeCaptureds.Add(new CapturedInfo {
                     Name = tn, Type = t, IsExtern = isExtern, OriType = orit
                 });
             }
             else if (optFd.GetId() == "localbecaptured")
             {
                 var tn       = optFd.GetParamId(0);
                 var orit     = optFd.GetParam(1);
                 var t        = CalcTypeString(orit);
                 var isExtern = optFd.GetParamId(2) == "true";
                 funcOpts.LocalBeCaptureds.Add(new CapturedInfo {
                     Name = tn, Type = t, IsExtern = isExtern, OriType = orit
                 });
             }
         }
     }
 }
Beispiel #3
0
 internal static void ParseFunctionOptions(Dsl.FunctionData opts, FunctionOptions funcOpts)
 {
     foreach (var opt in opts.Params)
     {
         var optFd = opt as Dsl.FunctionData;
         if (null != optFd)
         {
             if (optFd.GetId() == "needfuncinfo")
             {
                 funcOpts.NeedFuncInfo = optFd.GetParamId(0) == "true";
             }
             else if (optFd.GetId() == "rettype")
             {
                 var t  = CalcTypeString(optFd.GetParam(0));
                 var tk = CalcTypeString(optFd.GetParam(1));
                 funcOpts.RetType = new TypeInfo {
                     Type = t, TypeKind = tk
                 };
             }
             else if (optFd.GetId() == "paramtype")
             {
                 var tn = optFd.GetParamId(0);
                 var t  = CalcTypeString(optFd.GetParam(1));
                 var tk = CalcTypeString(optFd.GetParam(2));
                 funcOpts.ParamTypes.Add(tn, new TypeInfo {
                     Type = t, TypeKind = tk
                 });
             }
         }
     }
 }
        private async void ReadFiles(object sender, RoutedEventArgs e)
        {
            Model.DisableOptions();
            Model.DisableButtons();

            Logger.Clear();
            FunctionOptions options = new FunctionOptions()
            {
                SkipFunctionOnError = Model.SkipFunctionOnError,
                ShowCommandErrors   = Model.ShowCommandErrors,
                ShowEmptyFunctions  = Model.ShowEmptyFunctions,
                CommandSortType     = Model.CommandSortTypes[Model.CommandSortTypesSelectedIndex].Value
            };
            await Task.Run(() => Reader.Analyse(Model.FolderPath, Model.Versions[Model.VersionsSelectedIndex].GetCommandName(), options));

            Model.EnableOptions();
            Model.EnableButtons();
        }
Beispiel #5
0
        /// <summary>
        /// Generates the appropriate class given some options.
        /// </summary>
        /// <param name="options">The options.</param>
        /// <param name="classOptions">The options for classes.</param>
        /// <param name="functionOptions">The options for functions.</param>
        /// <returns>
        /// A <see cref="KeyValuePair"/> where the first element is the source
        /// string and the second element is the set of attributes.
        /// </returns>
        ///
        /// TODO: Abstract with a wrapper type wrapping around KeyValuePair.
        public static KeyValuePair <string, IReadOnlyDictionary <string, string> > Generate(
            SourceOptions options           = SourceOptions.None,
            ClassOptions classOptions       = ClassOptions.None,
            FunctionOptions functionOptions = FunctionOptions.None)
        {
            ClassGenerator classes = new ClassGenerator()
            {
                Name = Name
            };

            // Class with many interfaces
            if (options.HasFlag(SourceOptions.ImplementsInterfaces) &&
                options.HasFlag(SourceOptions.BaseListMany))
            {
                classes.Interface1Name = Interface1Name;
                classes.Interface2Name = Interface2Name;
                classes.Interface3Name = Interface3Name;
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.ClassWithManyInterfaces, classes.ClassWithManyInterfacesAttributes));
            }

            // Class with interface
            if (options.HasFlag(SourceOptions.ImplementsInterfaces))
            {
                classes.Interface1Name = Interface1Name;
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.ClassWith1Interface, classes.ClassWith1InterfaceAttributes));
            }

            // Class with base class
            if (options.HasFlag(SourceOptions.HasInheritance))
            {
                classes.BaseClassName = BaseName;
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.ClassWithBaseClass, classes.ClassWithBaseClassAttributes));
            }

            // Empty elements
            if (options.HasFlag(SourceOptions.EmptyElements))
            {
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.VerySimpleClassWithEmptyMethods, classes.VerySimpleClassWithEmptyMethodsAttributes));
            }

            // Namespace
            if (options.HasFlag(SourceOptions.HasNamespace))
            {
                classes.NamespaceName = NamespaceName;
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.VerySimpleClassInNamespace, classes.VerySimpleClassInNamespaceAttributes));
            }

            // Class with expressions
            if (classOptions.HasFlag(ClassOptions.HasContent) && functionOptions.HasFlag(FunctionOptions.HasExpressions))
            {
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.ClassWithMethodArithmeticExpressions, classes.ClassWithMethodArithmeticExpressionsAttributes));
            }

            // Class with statements
            if (classOptions.HasFlag(ClassOptions.HasContent) && functionOptions.HasFlag(FunctionOptions.HasStatements))
            {
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.ClassWithIfStatements, classes.ClassWithIfStatementsAttributes));
            }

            // Simple class
            if (classOptions.HasFlag(ClassOptions.HasContent))
            {
                return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                           classes.SimpleClass, classes.SimpleClassAttributes));
            }

            return(new KeyValuePair <string, IReadOnlyDictionary <string, string> >(
                       classes.VerySimpleClass, classes.VerySimpleClassAttributes));
        }
Beispiel #6
0
        internal static void GenerateArguments(Dsl.FunctionData data, StringBuilder sb, int indent, int start, FunctionOptions funcOpts, DslExpression.DslCalculator calculator)
        {
            s_CurSyntax = data;
            string prestr = string.Empty;

            for (int ix = start; ix < data.Params.Count; ++ix)
            {
                var param = data.Params[ix];
                sb.Append(prestr);
                string paramId = param.GetId();
                if (param.GetIdType() == (int)Dsl.ValueData.ID_TOKEN && paramId == "...")
                {
                    sb.Append("...");
                    continue;
                }
                GenerateSyntaxComponent(param, sb, indent, false, funcOpts, calculator);
                prestr = ", ";
            }
        }
Beispiel #7
0
        private static void GeneratePrefixPostfixOperator(Dsl.FunctionData data, StringBuilder sb, bool forSplit, FunctionOptions funcOpts, DslExpression.DslCalculator calculator)
        {
            string id = data.GetId();

            if (id == "prefixoperator")
            {
                var fullCode = data.GetParamId(0) == "true";
                var varExp   = data.GetParam(1);
                var opExp    = data.GetParam(2);
                if (forSplit)
                {
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append(" = ");
                    GenerateSyntaxComponent(opExp, sb, 0, false, funcOpts, calculator);
                }
                else if (fullCode)
                {
                    sb.Append("(function() ");
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append(" = ");
                    GenerateSyntaxComponent(opExp, sb, 0, false, funcOpts, calculator);
                    sb.Append("; return ");
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append("; end)()");
                }
                else
                {
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                }
            }
            else if (id == "postfixoperator")
            {
                var fullCode = data.GetParamId(0) == "true";
                var oldVal   = data.GetParamId(1);
                var varExp   = data.GetParam(2);
                var opExp    = data.GetParam(3);
                if (forSplit)
                {
                    sb.Append("local ");
                    sb.Append(oldVal);
                    sb.Append(" = ");
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append("; ");
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append(" = ");
                    GenerateSyntaxComponent(opExp, sb, 0, false, funcOpts, calculator);
                }
                else if (fullCode)
                {
                    sb.Append("(function() local ");
                    sb.Append(oldVal);
                    sb.Append(" = ");
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append("; ");
                    GenerateSyntaxComponent(varExp, sb, 0, false, funcOpts, calculator);
                    sb.Append(" = ");
                    GenerateSyntaxComponent(opExp, sb, 0, false, funcOpts, calculator);
                    sb.Append("; return ");
                    sb.Append(oldVal);
                    sb.Append("; end)()");
                }
                else
                {
                    sb.Append(oldVal);
                }
            }
        }
Beispiel #8
0
        private static void GenerateClosure(Dsl.FunctionData data, StringBuilder sb, int indent, bool forRemove, FunctionOptions funcOpts, DslExpression.DslCalculator calculator)
        {
            var    fcall     = data.LowerOrderFunction;
            bool   fullCode  = fcall.GetParamId(0) == "true";
            string localName = fcall.GetParamId(1);
            bool   needDecl  = (bool)Convert.ChangeType(fcall.GetParamId(2), typeof(bool));

            if (forRemove)
            {
                if (needDecl)
                {
                    sb.AppendFormatLine("{0}local {1};", GetIndentString(indent), localName);
                }
                GenerateStatements(data, sb, indent, funcOpts, calculator);
            }
            else if (fullCode)
            {
                sb.AppendLine("(function() ");
                if (data.HaveStatement())
                {
                    ++indent;
                    if (needDecl)
                    {
                        sb.AppendFormatLine("{0}local {1};", GetIndentString(indent), localName);
                    }
                    GenerateStatements(data, sb, indent, funcOpts, calculator);
                    sb.AppendFormatLine("{0}return {1};", GetIndentString(indent), localName);
                    --indent;
                }
                sb.AppendFormat("{0}end)()", GetIndentString(indent));
            }
            else
            {
                sb.Append(localName);
            }
        }
Beispiel #9
0
 public bool Has(FunctionOptions f)
 {
     return(FunctionOptions.HasFlag(f));
 }
Beispiel #10
0
        /// <summary>
        /// This function is called whenever the user selects a different demo function to plot.
        /// </summary>
        private void FunctionSelectionWasChanged(object sender, RoutedEventArgs e)
        {
            FunctionOptions currentOption = FunctionOptions.Simple;
            Func <double, double, double> function;

            if (functionSelectorComboBox.SelectedItem == null)
            {
                Console.WriteLine("No function selected");
            }
            else
            {
                currentOption = (FunctionOptions)functionSelectorComboBox.SelectedItem;
            }

            switch (currentOption)
            {
            case FunctionOptions.Gaussian:
                function = (x, y) => 5 * Math.Exp(-1 * Math.Pow(x, 2) / 4 - Math.Pow(y, 2) / 4) / (Math.Sqrt(2 * Math.PI));
                viewModel.PlotFunction(function, -5, 5, 200);
                break;

            case FunctionOptions.Sinc:
                function = (x, y) => 10 * Math.Sin(Math.Sqrt(x * x + y * y)) / Math.Sqrt(x * x + y * y);
                viewModel.PlotFunction(function, -10, 10);
                break;

            case FunctionOptions.Funnel:
                function = (x, y) => - 1 / (x * x + y * y);
                viewModel.PlotFunction(function, -1, 1);
                break;

            case FunctionOptions.Origami:
                function = (x, y) => Math.Cos(Math.Abs(x) + Math.Abs(y)) * (Math.Abs(x) + Math.Abs(y));
                viewModel.PlotFunction(function, -1, 1);
                break;

            case FunctionOptions.Simple:
                function = (x, y) => x * y;
                viewModel.PlotFunction(function, -1, 1);
                break;

            case FunctionOptions.Ripple:
                function = (x, y) => 0.25 * Math.Sin(Math.PI * Math.PI * x * y);
                viewModel.PlotFunction(function, 0, 2, 300);
                break;

            case FunctionOptions.DataPlot:
                double[,] arrayOfPoints = new double[10, 15];
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 15; j++)
                    {
                        arrayOfPoints[i, j] = 10 * Math.Sin(Math.Sqrt(i * i + j * j)) / Math.Sqrt(i * i + j * j + 0.0001);
                    }
                }
                viewModel.PlotData(arrayOfPoints);
                break;

            default:
                function = (x, y) => 0;
                viewModel.PlotFunction(function, -1, 1);
                break;
            }
        }
Beispiel #11
0
        /// <summary>
        /// Generates the appropriate class given some options.
        /// </summary>
        /// <param name="options">The options.</param>
        /// <param name="classOptions">The options for classes.</param>
        /// <param name="functionOptions">The options for functions.</param>
        /// <returns>
        /// A <see cref="KeyValuePair"/> where the first element is the source 
        /// string and the second element is the set of attributes.
        /// </returns>
        /// 
        /// TODO: Abstract with a wrapper type wrapping around KeyValuePair.
        public static KeyValuePair<string, IReadOnlyDictionary<string, string>> Generate(
            SourceOptions options = SourceOptions.None, 
            ClassOptions classOptions = ClassOptions.None,
            FunctionOptions functionOptions = FunctionOptions.None)
        {
            ClassGenerator classes = new ClassGenerator()
            {
                Name = Name
            };

            // Class with many interfaces
            if (options.HasFlag(SourceOptions.ImplementsInterfaces) &&
                options.HasFlag(SourceOptions.BaseListMany))
            {
                classes.Interface1Name = Interface1Name;
                classes.Interface2Name = Interface2Name;
                classes.Interface3Name = Interface3Name;
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                    classes.ClassWithManyInterfaces, classes.ClassWithManyInterfacesAttributes);
            }

            // Class with interface
            if (options.HasFlag(SourceOptions.ImplementsInterfaces))
            {
                classes.Interface1Name = Interface1Name;
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                    classes.ClassWith1Interface, classes.ClassWith1InterfaceAttributes);
            }

            // Class with base class
            if (options.HasFlag(SourceOptions.HasInheritance))
            {
                classes.BaseClassName = BaseName;
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                    classes.ClassWithBaseClass, classes.ClassWithBaseClassAttributes);
            }

            // Empty elements
            if (options.HasFlag(SourceOptions.EmptyElements))
            {
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                    classes.VerySimpleClassWithEmptyMethods, classes.VerySimpleClassWithEmptyMethodsAttributes);
            }

            // Namespace
            if (options.HasFlag(SourceOptions.HasNamespace))
            {
                classes.NamespaceName = NamespaceName;
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                    classes.VerySimpleClassInNamespace, classes.VerySimpleClassInNamespaceAttributes);
            }

            // Class with expressions
            if (classOptions.HasFlag(ClassOptions.HasContent) && functionOptions.HasFlag(FunctionOptions.HasExpressions))
            {
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                classes.ClassWithMethodArithmeticExpressions, classes.ClassWithMethodArithmeticExpressionsAttributes);
            }

            // Class with statements
            if (classOptions.HasFlag(ClassOptions.HasContent) && functionOptions.HasFlag(FunctionOptions.HasStatements))
            {
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                classes.ClassWithIfStatements, classes.ClassWithIfStatementsAttributes);
            }

            // Simple class
            if (classOptions.HasFlag(ClassOptions.HasContent))
            {
                return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                classes.SimpleClass, classes.SimpleClassAttributes);
            }

            return new KeyValuePair<string, IReadOnlyDictionary<string, string>>(
                classes.VerySimpleClass, classes.VerySimpleClassAttributes);
        }