public string Parse(string text, GetValueForKeyFunc getValueForKeyFunc)
        {
            using (var reader = new StringReader(text))
            {
                var parser = new NamedFieldParser(getValueForKeyFunc);

                do
                {
                    parser.Current = reader.Read();

                    switch (parser.State)
                    {
                        case ParsingState.Text:
                            HandleRegularCharacter(parser);
                            break;
                        case ParsingState.StartOfExpression:
                            HandleStartOfExpression(parser);
                            break;
                        case ParsingState.Expression:
                            HandleFieldExpression(parser);
                            break;
                        case ParsingState.EndOfExpression:
                            HandleEndOfExpression(parser);
                            break;
                    }
                } while (parser.State != ParsingState.EndOfFile);

                return parser.FormattedText.ToString();
            }
        }
        public string Parse(string text, GetValueForKeyFunc getValueForKeyFunc)
        {
            using (var reader = new StringReader(text))
            {
                var parser = new NamedFieldParser(getValueForKeyFunc);

                do
                {
                    parser.Current = reader.Read();

                    switch (parser.State)
                    {
                    case ParsingState.Text:
                        HandleRegularCharacter(parser);
                        break;

                    case ParsingState.StartOfExpression:
                        HandleStartOfExpression(parser);
                        break;

                    case ParsingState.Expression:
                        HandleFieldExpression(parser);
                        break;

                    case ParsingState.EndOfExpression:
                        HandleEndOfExpression(parser);
                        break;
                    }
                } while (parser.State != ParsingState.EndOfFile);

                return(parser.FormattedText.ToString());
            }
        }
        private static void HandleEndOfExpression(NamedFieldParser parser)
        {
            if (parser.Current != CloseBrace)
            {
                throw new FormatException("Unescaped closing brace found at position " + parser.Position + ".");
            }

            parser.FormattedText.Append((char)CloseBrace);
            parser.State = ParsingState.Text;
        }
        private static void HandleFieldExpression(NamedFieldParser parser)
        {
            switch (parser.Current)
            {
            case NoMoreText:
                throw new FormatException("Opening brace with field expression '" + parser.FieldExpression +
                                          "' has no closing brace at position " + parser.Position + ".");

            case CloseBrace:
                InsertValueForPlaceholder(parser);
                parser.State = ParsingState.Text;
                break;

            default:
                parser.FieldExpression.Append((char)parser.Current);
                break;
            }
        }
        private static void HandleStartOfExpression(NamedFieldParser parser)
        {
            switch (parser.Current)
            {
            case NoMoreText:
            case CloseBrace:
                throw new FormatException("Opening brace with no field name specified at position " + parser.Position + ".");

            case OpenBrace:
                parser.FormattedText.Append((char)OpenBrace);
                parser.State = ParsingState.Text;
                break;

            default:
                parser.FieldExpression.Append((char)parser.Current);
                parser.State = ParsingState.Expression;
                break;
            }
        }
        private static void HandleRegularCharacter(NamedFieldParser parser)
        {
            switch (parser.Current)
            {
            case NoMoreText:
                parser.State = ParsingState.EndOfFile;
                break;

            case OpenBrace:
                parser.State = ParsingState.StartOfExpression;
                break;

            case CloseBrace:
                parser.State = ParsingState.EndOfExpression;
                break;

            default:
                parser.FormattedText.Append((char)parser.Current);
                break;
            }
        }
 private static void HandleFieldExpression(NamedFieldParser parser)
 {
     switch (parser.Current)
     {
         case NoMoreText:
             throw new FormatException("Opening brace with field expression '" + parser.FieldExpression +
                                       "' has no closing brace at position " + parser.Position + ".");
         case CloseBrace:
             InsertValueForPlaceholder(parser);
             parser.State = ParsingState.Text;
             break;
         default:
             parser.FieldExpression.Append((char) parser.Current);
             break;
     }
 }
        private static void HandleEndOfExpression(NamedFieldParser parser)
        {
            if (parser.Current != CloseBrace)
                throw new FormatException("Unescaped closing brace found at position " + parser.Position + ".");

            parser.FormattedText.Append((char) CloseBrace);
            parser.State = ParsingState.Text;
        }
 private static void InsertValueForPlaceholder(NamedFieldParser parser)
 {
     parser.FormattedText.Append(parser.GetValueForKeyFunc(parser.FieldExpression.ToString()));
     parser.FieldExpression.Clear();
 }
 private static void HandleStartOfExpression(NamedFieldParser parser)
 {
     switch (parser.Current)
     {
         case NoMoreText:
         case CloseBrace:
             throw new FormatException("Opening brace with no field name specified at position " + parser.Position + ".");
         case OpenBrace:
             parser.FormattedText.Append((char) OpenBrace);
             parser.State = ParsingState.Text;
             break;
         default:
             parser.FieldExpression.Append((char)parser.Current);
             parser.State = ParsingState.Expression;
             break;
     }
 }
 private static void HandleRegularCharacter(NamedFieldParser parser)
 {
     switch (parser.Current)
     {
         case NoMoreText:
             parser.State = ParsingState.EndOfFile;
             break;
         case OpenBrace:
             parser.State = ParsingState.StartOfExpression;
             break;
         case CloseBrace:
             parser.State = ParsingState.EndOfExpression;
             break;
         default:
             parser.FormattedText.Append((char) parser.Current);
             break;
     }
 }
 private static void InsertValueForPlaceholder(NamedFieldParser parser)
 {
     parser.FormattedText.Append(parser.GetValueForKeyFunc(parser.FieldExpression.ToString()));
     parser.FieldExpression.Clear();
 }