Beispiel #1
0
        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'.");
            }
        }
Beispiel #2
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        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;
        }
Beispiel #3
0
 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);
 }