public GrammarNodeD AddAfter(NonterminalHeadD nonterminalHeadD, GrammarNodeV target, VADG.Global.SymbolType symbolType)
        {
            GrammarNodeDAddAfterVisitor visitor = new GrammarNodeDAddAfterVisitor();
            visitor.Target = target.getReference();
            visitor.SymbolType = symbolType;

            visitor.visit(nonterminalHeadD);

            return visitor.Item;
        }
        public GrammarNodeD AddBefore(NonterminalHeadD nonterminalHeadD, GrammarNodeV grammarNodeV, VADG.Global.SymbolType symbolType)
        {
            GrammarNodeDAddBeforeVisitor visitor = new GrammarNodeDAddBeforeVisitor();
            visitor.Target = grammarNodeV.getReference();
            visitor.SymbolType = symbolType;

            visitor.visit(nonterminalHeadD);

            return visitor.Item;
        }
        public GrammarNodeD Replace(GrammarNodeD itemToReplace, VADG.Global.SymbolType symbolType, string name)
        {
            OperationD parent = itemToReplace.Parent as OperationD;
            if (parent == null)
                throw new Exception("The item to replace does not have an operation D as a parent, fail.");

            // the rule we are editing
            NonterminalHeadD rule = itemToReplace.getMyRule();
            if (rule == null)
                throw new Exception("The item to replace could not find a nonterminalhead D associated with it.");

            // remove old item
            int index = parent.Children.IndexOf(itemToReplace);
            parent.Children.Remove(itemToReplace);
            itemToReplace.Dispose();

            // create new item to add
            GrammarNodeD newItem;
            if (symbolType == VADG.Global.SymbolType.Terminal)
            {
                // create new Terminal
                newItem = new TerminalD(name, parent);
            }
            else
            {
                // If the nont head doesn't exist, create and add to grammar
                NonterminalHeadD nontHead = model.DefinitiveGrammar.getNonterminal(name);

                if (nontHead == null)
                    nontHead = CreateNewNonterminal(name);

                newItem = nontHead.CreateNonterminalTailD(parent);
            }

            // insert new item into parent
            parent.insertChild(index, newItem);
            return newItem;
        }