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); }
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)); }
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); }
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); }
private double f(double x) { return(CodeGenerator.ExecuteCode <double>(s, CodeParameter.Create("x", x))); }
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); } }