public void parseText(string text, IParseVisitor visitor)
        {
            int startIndex = 0;

            while (startIndex < text.Length)
            {
                int endIndex = getToken(text, startIndex);
                handleToken(text, startIndex, endIndex, visitor);
                startIndex = endIndex + 1;
            }
        }
        private void handleToken(string text, int startIndex, int endIndex, IParseVisitor visitor)
        {
            string token = text.Substring(startIndex, endIndex - startIndex + 1);

            if (token[0] == '$')
            {
                switch (token)
                {
                case "$name$": visitor.Name(); break;

                case "$type$": visitor.Type(); break;

                case "$version$": visitor.Version(); break;

                case "$primary$": visitor.Primary(); break;

                case "$beginbold$": visitor.BeginBold(); break;

                case "$endbold$": visitor.EndBold(); break;

                case "$beginitalic$": visitor.BeginItalic(); break;

                case "$enditalic$": visitor.EndItalic(); break;

                case "$ip$": visitor.IP(); break;

                case "$$": visitor.Text("$"); break;

                default:
                    throw new SyntaxErrorException("Invalid token: " + token + ".", startIndex);
                }
            }
            else
            {
                visitor.Text(token);
            }
        }