private bool GetSelectedData(out Variable var, out Macro macro) { if (lstData.SelectedItems.Count != 1) { _selectTag = ""; var = null; macro = null; return false; } _selectTag = lstData.SelectedItems[0].Tag.ToString(); if (_selectTag.Length < 2) throw new Exception("Item tag text is too short."); string name = _selectTag.Substring(1); switch (_selectTag[0]) { case 'v': var = Data.GetVariable(name); macro = null; return true; case 'm': macro = Data.GetMacro(name); var = null; return true; default: throw new Exception("Item tag does not being with 'v' or 'm'."); } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static bool ProcessPossibleMacro(Token tokenGroup, string source) { // Macro definitions take the form: // macroName(param1, param2, etc.)=<equation> List<Token> group = tokenGroup.Group; if (group.Count <= 3) return false; // First token must be the name if (group[0].Type != TokenType.Variable && group[0].Type != TokenType.Macro) return false; string macroName = group[0].Text; //if (Data.IsVariable(macroName)) return false; // Cannot have a macro that is the same name as a variable. // Next token must be a set of brackets if (group[1].Type != TokenType.Group) return false; // Next token must be '=' if (group[2].Type != TokenType.Operator || group[2].Operator != OperatorType.Assign) return false; // Check that arguments have correct form (arg, comma, arg, comma, ...) List<string> argNames = new List<string>(); bool lookingForArg = true; bool gotAToken = false; foreach (Token argToken in group[1].Group) { if (lookingForArg) { switch (argToken.Type) { case TokenType.Variable: case TokenType.Function: case TokenType.Macro: break; default: throw new Exception("Expected macro argument name."); } // Check for duplicate argument name foreach (string argName in argNames) { if (argName.ToLower() == argToken.Text.ToLower()) throw new Exception("Duplicate macro argument '" + argToken.Text + "'."); } argNames.Add(argToken.Text.ToLower()); } else // looking for comma { if (argToken.Type != TokenType.Operator || argToken.Operator != OperatorType.Comma) throw new Exception("Expected comma after argument."); } gotAToken = true; lookingForArg = !lookingForArg; } if (lookingForArg && gotAToken) return false; // Create a new group containing only the equation List<Token> eqGroup = new List<Token>(); int eqGroupIndex = 0; foreach (Token tok in group) { if (eqGroupIndex++ >= 3) eqGroup.Add(tok.Clone()); } PrepareMacroEquation(argNames, eqGroup); Macro macro = new Macro(macroName, argNames.ToArray(), eqGroup, source); if (Data.IsMacro(macroName)) { Data.DeleteMacro(macroName); Data.AddMacro(macro); //_macros[macroName.ToLower()] = macro; if (!Globals.silentMode) Globals.form.WriteLine(HistoryType.Info, "Replaced macro '" + macroName + "'."); } else { Data.AddMacro(macro); //_macros.Add(macroName.ToLower(), macro); if (!Globals.silentMode) Globals.form.WriteLine(HistoryType.Info, "Created macro '" + macroName + "'."); } return true; }
public static void AddMacro(Macro macro) { string macroNameLower = macro.Name.ToLower(); if (_macros.ContainsKey(macroNameLower)) throw new Exception("Internal: Macro '" + macro.Name + "' cannot be added because it already exists."); _macros.Add(macroNameLower, macro); }