public static GonObject LoadFromBuffer(string buffer)
        {
            string        str    = "{" + buffer + "}";
            List <string> Tokens = Tokenize(str);

            GonTokenStream ts = new GonTokenStream();

            ts.current = 0;
            ts.Tokens  = Tokens;

            return(LoadFromTokens(ts));
        }
        static GonObject LoadFromTokens(GonTokenStream Tokens)
        {
            GonObject ret = new GonObject();

            if (Tokens.Peek() == "{")
            {         //read object
                ret.Type = FieldType.OBJECT;

                Tokens.Consume(); //consume '{'
                while (Tokens.Peek() != "}")
                {
                    string name = Tokens.Read();

                    ret.Children_Array.Add(LoadFromTokens(Tokens));
                    ret.Children_Map[name] = (int)ret.Children_Array.Count() - 1;
                    ret.Children_Array[ret.Children_Array.Count() - 1].Name = name;

                    if (Tokens.error)
                    {
                        throw new GonException("GON ERROR: missing a '}' somewhere");
                    }
                }
                Tokens.Consume(); //consume '}'

                return(ret);
            }
            else if (Tokens.Peek() == "[")
            {  //read array
                ret.Type = FieldType.ARRAY;

                Tokens.Consume(); //consume '['
                while (Tokens.Peek() != "]")
                {
                    ret.Children_Array.Add(LoadFromTokens(Tokens));

                    if (Tokens.error)
                    {
                        throw new GonException("GON ERROR: missing a ']' somewhere");
                        return(null);
                    }
                }
                Tokens.Consume(); //consume ']'

                return(ret);
            }
            else
            {
                //read data value
                ret.Type        = FieldType.STRING;
                ret.String_Data = Tokens.Read();

                //if string data can be converted to a number, do so
                if (ret.String_Data.All(Char.IsDigit))
                {
                    ret.Int_Data = Convert.ToInt32(ret.String_Data);
                    ret.Type     = FieldType.NUMBER;
                }

                /*char* endptr;
                 * ret.int_data = strtol(ret.string_data.c_str(), &endptr, 0);
                 * if (*endptr == 0)
                 * {
                 *  ret.type = FieldType.NUMBER;
                 * }*/

                if (IsStringFloat(ret.String_Data))
                {
                    ret.Float_Data = Convert.ToDouble(ret.String_Data);
                    ret.Type       = FieldType.NUMBER;
                }

                /*ret.float_data = strtod(ret.string_data.c_str(), &endptr);
                 * if (*endptr == 0)
                 * {
                 *  ret.type = FieldType.NUMBER;
                 * }*/

                //if string data can be converted to a bool or null, convert
                if (ret.String_Data == "null")
                {
                    ret.Type = FieldType.NULLGON;
                }
                if (ret.String_Data == "true")
                {
                    ret.Type      = FieldType.BOOL;
                    ret.Bool_Data = true;
                }
                if (ret.String_Data == "false")
                {
                    ret.Type      = FieldType.BOOL;
                    ret.Bool_Data = false;
                }

                return(ret);
            }
        }