public void Add(object oS, params object[] o2)
        {
            var fixedRules = new SyntaticObject[rules.Length + 1][];

            Array.Copy(rules, 0, fixedRules, 0, rules.Length);
            List <SyntaticObject> list = new List <SyntaticObject>();
            var o = new object[o2.Length + 1];

            o[0] = oS;
            Array.Copy(o2, 0, o, 1, o2.Length);
            foreach (object o1 in o)
            {
                if (o1 is string)
                {
                    list.Add(new Token(o1 as string));
                }
                else if (o1 is SyntaticObject)
                {
                    list.Add(o1 as SyntaticObject);
                }
                else if (o1 is char)
                {
                    list.Add(new Terminal((char)o1));
                }
            }
            fixedRules[fixedRules.Length - 1] = list.ToArray();
            rules = fixedRules;
        }
        public void Add()
        {
            var fixedRules = new SyntaticObject[rules.Length + 1][];

            Array.Copy(rules, 0, fixedRules, 0, rules.Length);
            fixedRules[fixedRules.Length - 1] = new SyntaticObject[0];
            rules = fixedRules;
        }
        public void Add(SyntaticObject o1, params SyntaticObject[] o2)
        {
            var fixedRules = new SyntaticObject[rules.Length + 1][];

            Array.Copy(rules, 0, fixedRules, 0, rules.Length);
            var o = new SyntaticObject[o2.Length + 1];

            o[0] = o1;
            Array.Copy(o2, 0, o, 1, o2.Length);
            fixedRules[fixedRules.Length - 1] = o;
            rules = fixedRules;
        }