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()); }
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 }); } } } }
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(); }
/// <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)); }
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 = ", "; } }
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); } } }
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); } }
public bool Has(FunctionOptions f) { return(FunctionOptions.HasFlag(f)); }
/// <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; } }
/// <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); }