/// <summary>
        /// Create a rule node, add to current tree, and make it current root
        /// </summary>
        /// <param name="s"></param>
        public override void traceIn(string s)                                  // throws TokenStreamException
        {
            if (inputState.guessing > 0)
            {
                return;
            }
            ParseTreeRule subRoot = new ParseTreeRule(s);

            if (currentParseTreeRoot.Count > 0)
            {
                ParseTreeRule oldRoot = (ParseTreeRule)currentParseTreeRoot.Peek();
                oldRoot.addChild(subRoot);
            }
            currentParseTreeRoot.Push(subRoot);
            numberOfDerivationSteps++;
        }
        /// <summary>
        /// Adds LT(1) to the current parse subtree.
        /// </summary>
        /// <remarks>
        /// <para>
        /// Note that the match() routines add the node before checking for
        /// correct match.  This means that, upon mismatched token, there
        /// will a token node in the tree corresponding to where that token
        /// was expected.  For no viable alternative errors, no node will
        /// be in the tree as nothing was matched() (the lookahead failed
        /// to predict an alternative).
        /// </para>
        /// </remarks>
        protected void addCurrentTokenToParseTree()                     // throws TokenStreamException
        {
            if (inputState.guessing > 0)
            {
                return;
            }
            ParseTreeRule  root      = (ParseTreeRule)currentParseTreeRoot.Peek();
            ParseTreeToken tokenNode = null;

            if (LA(1) == Token.EOF_TYPE)
            {
                tokenNode = new ParseTreeToken(new antlr.CommonToken("EOF"));
            }
            else
            {
                tokenNode = new ParseTreeToken(LT(1));
            }
            root.addChild(tokenNode);
        }