Beispiel #1
0
        public void Execute(string[] args)
        {
            HideAfterExecuting = false;

            var Calc    = new CalculatorManager();
            var command = $"Calc.Value = {Calc.CorrectedExpression(GetStringByTokens(args))};";

            using (var sandBox = new Sandbox())
            {
                var d = CodeGenerator.CreateCode <double>
                            (sandBox,
                            CS.Compiler,
                            command, null, null,
                            CodeParameter.Create("Calc", Calc
                                                 ));

                d.Execute(Calc);
            }

            var result = $" = {Calc.FinalCorrection(Calc.Value.ToString())}";

            Intermediary.MustBeHidden       = HideAfterExecuting;
            Intermediary.CommandTextChanged = true;

            Intermediary.CommandText = result;
            Intermediary.CaretOffset = result.Length;
        }
        internal EnvDTE.CodeParameter AddParameter(EnvDTE.CodeElement parent, SyntaxNode containerNode, string name, object type, object position)
        {
            var typeSymbol = CodeModelService.GetTypeSymbol(type, this.GetSemanticModel(), containerNode.SpanStart);
            var typeName   = typeSymbol.GetEscapedFullName();

            var parameterNode  = CodeModelService.CreateParameterNode(CodeModelService.GetUnescapedName(name), typeName);
            var insertionIndex = CodeModelService.PositionVariantToParameterInsertionIndex(position, containerNode, fileCodeModel: this);

            var newNode = InsertParameter(containerNode, parameterNode, insertionIndex);

            // Since parameters form part of the NodeKey for functions, delegates, and indexers,
            // creating a CodeParameter hooked up to the correct parent is a little tricky. After
            // the call to InsertParameter, the syntax tree has been updated, but not the NodeKey
            // map or the NodeKey in the parent CodeParameter. If we delegate the creation of the
            // CodeParameter to CodeModelService.CreateInternalCodeElement, it will attempt to
            // look up an element in the NodeKey map based on the new syntax tree. This will fail,
            // causing it to create a new, duplicate element for the parent. Later, when we
            // reacquire the NodeKeys, the original element will get the proper NodeKey, while the
            // duplicate will be updated to a meaningless NodeKey. Since the duplicate is the one
            // being used by the CodeParameter, most operations on it will then fail.
            // Instead, we need to have the parent passed in to us.
            var parentObj = ComAggregate.GetManagedObject <AbstractCodeMember>(parent);

            return(CodeParameter.Create(this.State, parentObj, CodeModelService.GetParameterName(newNode)));
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            LS = new OxyPlot.Series.LineSeries();
            double Xmin = Convert.ToDouble(rangeA.Text), Xmax = Convert.ToDouble(rangeB.Text);

            var Calc            = new CalculatorManager();
            var InputExpression = Calc.CorrectedExpression(formulaTextBox.Text);

            InputExpression = $"Calc.Value = {InputExpression};";
            using (var sndBox = new Sandbox())
            {
                var d = CodeGenerator.CreateCode <double>(sndBox,
                                                          CS.Compiler,
                                                          InputExpression, null, null,
                                                          CodeParameter.Create("Calc", Calc),
                                                          new CodeParameter("x", typeof(double)));

                const double delta = 0.01d;
                for (double i = Xmin; i < Xmax; i += delta)
                {
                    d.Execute(Calc, i);
                    LS.Points.Add(new DataPoint(i, Calc.Value));
                }
            }

            Grapher.Model.Series.Clear();
            Grapher.Model.Series.Add(LS);
        }
Beispiel #4
0
        private EnvDTE.CodeElement CreateCodeParameter(SyntaxNode node)
        {
            Debug.Assert(_parentElement is AbstractCodeMember, "Parameters should always have an associated member!");

            var name = this.CodeModelService.GetParameterName(node);

            return((EnvDTE.CodeElement)CodeParameter.Create(_state, (AbstractCodeMember)_parentElement, name));
        }
Beispiel #5
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var parameters = this.ParentElement.GetParameters();

            if (index < parameters.Length)
            {
                var parameter = parameters[index];
                element = (EnvDTE.CodeElement)CodeParameter.Create(this.State, this.ParentElement, parameter.Name);
                return(true);
            }

            element = null;
            return(false);
        }
Beispiel #6
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            foreach (var parameter in this.ParentElement.GetParameters())
            {
                var childName = parameter.Name;
                if (childName == name)
                {
                    element = (EnvDTE.CodeElement)CodeParameter.Create(this.State, this.ParentElement, parameter.Name);
                    return(true);
                }
            }

            element = null;
            return(false);
        }
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var parentNode = this.ParentElement.LookupNode();

            if (parentNode != null)
            {
                if (CodeModelService.TryGetParameterNode(parentNode, name, out _))
                {
                    // The name of the CodeElement should be just the identifier name associated with the element
                    // devoid of the type characters hence we use the just identifier name for both creation and
                    // later searches
                    element = (EnvDTE.CodeElement)CodeParameter.Create(this.State, this.ParentElement, name);
                    return(true);
                }
            }

            element = null;
            return(false);
        }
        private EnvDTE.CodeElement GetParameterElementForCodeModelEvent(CodeModelEvent codeModelEvent, EnvDTE.CodeElements parentParameters, object parentElement)
        {
            if (parentParameters == null)
            {
                return(null);
            }

            var parameterName = this.CodeModelService.GetName(codeModelEvent.Node);

            if (codeModelEvent.Type == CodeModelEventType.Remove)
            {
                var parentCodeElement = ComAggregate.TryGetManagedObject <AbstractCodeMember>(parentElement);
                if (parentCodeElement != null)
                {
                    return((EnvDTE.CodeElement)CodeParameter.Create(this.State, parentCodeElement, parameterName));
                }
            }
            else
            {
                return(parentParameters.Item(parameterName));
            }

            return(null);
        }
Beispiel #9
0
 private double f(double x)
 {
     return(CodeGenerator.ExecuteCode <double>(s, CodeParameter.Create("x", x)));
 }
Beispiel #10
0
 private void Button_Click_18(object sender, RoutedEventArgs e)
 {
     Output.Background = Brushes.White;
     string[] tmp = Input.Text.Split('=');
     try
     {
         if (tmp[1] != "0")
         {
             throw new Exception();
         }
         s = tmp[0];
         if (s.Contains("^") || s.Contains("√"))
         {
             while (s.Contains("^"))
             {
                 int    x   = s.IndexOf("^");
                 string str = "";
                 string col = "";
                 for (int i = x; i < s.Length; i++)
                 {
                     if (s[i] == '*' || s[i] == '/' || s[i] == '+' || s[i] == '-' || s[i] == ' ' || s[i] == '=')
                     {
                         col = s.Substring(x + 1, i - x - 1);
                         break;
                     }
                     if (i == s.Length - 1)
                     {
                         col = s.Substring(x + 1, i - x); break;
                     }
                 }
                 for (int i = x; i >= 0; i--)
                 {
                     if (s[i] == '*' || s[i] == '/' || s[i] == '+' || s[i] == '-' || s[i] == ' ' || s[i] == '=' || s[i] == '(')
                     {
                         str = s.Substring(i + 1, x - i - 1);
                         break;
                     }
                     if (i == 0)
                     {
                         str = s.Substring(i, x - i);
                         break;
                     }
                 }
                 string o = "";
                 for (int i = 0; i < int.Parse(col); i++)
                 {
                     o += str + "*";
                 }
                 o = o.Remove(o.Length - 1);
                 s = s.Replace(str + "^" + col, o);
             }
             while (s.Contains("√"))
             {
                 int    x   = s.IndexOf("√");
                 string col = "";
                 for (int i = x; i < s.Length; i++)
                 {
                     if (s[i] == '*' || s[i] == '/' || s[i] == '+' || s[i] == '-' || s[i] == ' ' || s[i] == '=')
                     {
                         col = s.Substring(x + 1, i - x - 1);
                         break;
                     }
                     if (i == s.Length - 1)
                     {
                         col = s.Substring(x + 1, i - x); break;
                     }
                 }
                 s = s.Remove(x, col.Length + 1);
                 s = s.Insert(x, "Math.Sqrt(" + col + ")");
             }
         }
         string proisv = FindProisv(s, 0);
         s = s.Insert(0, "return ");
         s = s.Insert(s.Length, " ;");
         CodeGenerator.ExecuteCode <double>(s, CodeParameter.Create("x", 8));
         StartObr(proisv);
     }
     catch { Output.Content = "Неверный формат!"; }
 }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var Calc = new CalculatorManager();

            var inputCode    = CodeTextBox.Text;
            var lines        = inputCode.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
            var names        = new List <string>();
            var additionCode = "";
            int idx          = -1;

            for (int i = 0; i < lines.Length; i++)
            {
                var regex = Regex.Match(lines[i], "^\\s*>\\s*(.*?)\\s*=");
                if (regex.Success)
                {
                    names.Add($"{Regex.Replace(regex.Groups[1].Value, "[[][]]\\s+", "")}"); idx++;
                    additionCode += "\n" + $"Calc.AddNewValue({names[idx]});";
                }
            }

            inputCode = Regex.Replace(inputCode, "out:", "Calc.StringAdd:");
            var worker = new CodeWorker(inputCode + "\n");

            worker.AddNewRule("^\\s*>", "double");
            worker.AddNewRule("//.*?$", "");
            worker.AddNewRule("while ", "while (");
            worker.AddNewRule("for ", "for (");
            worker.AddNewRule("if ", "if (");
            worker.AddNewRule(":\\s*$", ") {");
            worker.AddNewRule(";\\s*$", "}");
            worker.AddNewRule("exit|quit|stop", "goto end");
            worker.AddNewRule("for [(]\\s*", "for (int ");

            foreach (Match m in Regex.Matches(inputCode, "^.*?([<].*?[>]).*?$", RegexOptions.Multiline))
            {
                var arrayItems = m.Groups[1].Value;
                worker.AddNewRule(new ArrayQuotesWorker()
                {
                    InputString = arrayItems
                });
            }

            foreach (Match m in Regex.Matches(inputCode, "^\\s*(Calc.StringAdd:.*?)\\s*.\\s*$", RegexOptions.Multiline))
            {
                var outItems = m.Groups[1].Value;
                worker.AddNewRule(new OutFunctionWorker()
                {
                    InputString = outItems
                });
            }

            worker.AddNewRule("\n+", ";\n");
            worker.AddNewRule("{;", "{");
            worker.AddNewRule("};", ";}");

            worker.ProcessString();
            inputCode = worker.WorkingString;
            inputCode = Regex.Replace(inputCode, "[)][.]|[.][)]", ")");
            inputCode = Regex.Replace(inputCode, "[)]\\s*}", ");}");
            inputCode = Regex.Replace(inputCode, "\\s*}", ";}");

            inputCode = $"Calc.Value = 1; {Calc.CorrectedExpression(inputCode)}" + additionCode;

            try
            {
                using (var sandBox = new Sandbox())
                {
                    var d = CodeGenerator.CreateCode <double>
                                (sandBox,
                                CS.Compiler,
                                inputCode, null, null,
                                CodeParameter.Create("Calc", Calc
                                                     ));

                    d.Execute(Calc);
                }
                OutputTextBox.Text = Calc.StringValue;

                var values = Calc.Values;
                for (int i = 0; i < names.Count; i++)
                {
                    Calc.AddVariable(names[i], values[i]);
                }

                Vars.ItemsSource = Calc.Variables;
            }
            catch
            {
                MessageBox.Show(inputCode);
            }
        }