/** <summary>Override this method to change where error messages go</summary> */
 public virtual void EmitErrorMessage(string msg)
 {
     if (TraceDestination != null)
     {
         TraceDestination.WriteLine(msg);
     }
 }
        /** <summary>
         *  Record whether or not this rule parsed the input at this position
         *  successfully.  Use a standard java hashtable for now.
         *  </summary>
         */
        public virtual void Memoize(IIntStream input,
                                    int ruleIndex,
                                    int ruleStartIndex)
        {
            int stopTokenIndex = state.failed ? MemoRuleFailed : input.Index - 1;

            if (state.ruleMemo == null)
            {
                if (TraceDestination != null)
                {
                    TraceDestination.WriteLine("!!!!!!!!! memo array is null for " + GrammarFileName);
                }
            }
            if (ruleIndex >= state.ruleMemo.Length)
            {
                if (TraceDestination != null)
                {
                    TraceDestination.WriteLine("!!!!!!!!! memo size is " + state.ruleMemo.Length + ", but rule index is " + ruleIndex);
                }
            }
            if (state.ruleMemo[ruleIndex] != null)
            {
                state.ruleMemo[ruleIndex][ruleStartIndex] = stopTokenIndex;
            }
        }
        public virtual void TraceIn(string ruleName, int ruleIndex, object inputSymbol)
        {
            if (TraceDestination == null)
            {
                return;
            }

            TraceDestination.Write("enter " + ruleName + " " + inputSymbol);
            if (state.backtracking > 0)
            {
                TraceDestination.Write(" backtracking=" + state.backtracking);
            }
            TraceDestination.WriteLine();
        }
        public virtual void TraceOut(string ruleName, int ruleIndex, object inputSymbol)
        {
            if (TraceDestination == null)
            {
                return;
            }

            TraceDestination.Write("exit " + ruleName + " " + inputSymbol);
            if (state.backtracking > 0)
            {
                TraceDestination.Write(" backtracking=" + state.backtracking);
                if (state.failed)
                {
                    TraceDestination.Write(" failed");
                }
                else
                {
                    TraceDestination.Write(" succeeded");
                }
            }
            TraceDestination.WriteLine();
        }