public override void VisitLeave(Optional expression)
		{
			IsMatchPredicate local = _matchStack.Pop();
			_matchStack.Push(
				delegate(IInputIterator iterator)
				{
					Int32 savePosition = iterator.Index;
					if (local(iterator))
					{
						savePosition = iterator.Index;
					}
					else
					{
						iterator.Index = savePosition;
					}

					return true;
				}
				);
		}
		public override void VisitEnter(Optional expression)
		{
		}
		public override void VisitExecute(Optional expression)
		{
		}
		public override void VisitLeave(Optional expression)
		{
			terminal.Peek().Append(")?");
		}
		public override void VisitEnter(Optional expression)
		{
			terminal.Peek().Append("(");
		}
 public abstract void VisitEnter(Optional expression);
 public abstract void VisitLeave(Optional expression);
 public abstract void VisitExecute(Optional expression);