private PropertyTemplate  parse0()
        {
            var parameterNode = new PropertyTemplate();

            parameterNode.IsPropertyTemplates = true;

            parameterNode.Name = parsePropertyName();

            if (_reader.HasNext())
            {
                parameterNode.SubTemplates = parseParameter();
            }

            return(parameterNode);
        }
        private Dictionary <string, PropertyTemplate> parseParameter()
        {
            var dic = new Dictionary <string, PropertyTemplate>();

            while (true)
            {
                var key = parseKey();

                throwIfHasNoNextOrNext();

                if (_reader.Current() == '@' && _reader.HasNext() && _reader.Forwards() == '{')
                {
                    _reader.Next();
                    dic.Add(key, parse());

                    throwIfHasNoNextOrNext();

                    if (_reader.Current() == ']')
                    {
                        return(dic);
                    }
                    else
                    {
                        throwIfNotMatch(',', "require char ','");
                    }
                }
                else
                {
                    _reader.Back();

                    var parameterNode = new PropertyTemplate();

                    parameterNode.Value = parseSegment(',', ']');

                    dic.Add(key, parameterNode);

                    if (_reader.Current() == ']')
                    {
                        return(dic);
                    }
                    else
                    {
                        throwIfNotMatch(',', "require char ','");
                    }
                }
            }
        }