Example #1
0
        private void makeKeyValue(JsonValue current, JsonToken lookahead)
        {
            JsonValue sep = (JsonValue)stack.Pop();

            //이전걸 꺼내서 봤는데 헐 key/value pair의 구분자네?
            if (sep.Type == JsonToken.Token.SEPRATION_KEY_VALUE)
            {
                JsonKeyValue kv = new JsonKeyValue();
                kv.Key   = ((JsonToken)stack.Pop()).data;
                kv.Value = current;
                stack.Push(kv);
            }
            else
            {
                stack.Push(sep);
                stack.Push(current);
            }
        }
Example #2
0
        void ShiftReduce(JsonToken current, JsonToken lookahead)
        {
            switch (current.token)
            {
            case JsonToken.Token.OPEN_OBJECT:
                stack.Push(current);
                break;

            case JsonToken.Token.OPEN_ARRAY:
                stack.Push(current);
                break;

            case JsonToken.Token.CLOSE_OBJECT:
                JsonValue  t          = stack.Pop();
                JsonObject jsonobject = new JsonObject();
                while (t.Type != JsonToken.Token.OPEN_OBJECT)
                {
                    JsonKeyValue tmp = t as JsonKeyValue;
                    jsonobject.Add(tmp.Key, tmp.Value);
                    t = stack.Pop();
                }
                if (lookahead != null &&
                    (lookahead.token == JsonToken.Token.COMMA ||
                     lookahead.token == JsonToken.Token.CLOSE_OBJECT))
                {
                    makeKeyValue(jsonobject, lookahead);
                }
                else
                {
                    stack.Push(jsonobject);
                }
                break;

            case JsonToken.Token.CLOSE_ARRAY:
                JsonValue u         = stack.Pop();
                JsonArray jsonarray = new JsonArray();
                while (u.Type != JsonToken.Token.OPEN_ARRAY)
                {
                    jsonarray.Add(u);
                    u = stack.Pop();
                }
                jsonarray.Reverse();
                if (lookahead != null &&
                    (lookahead.token == JsonToken.Token.COMMA ||
                     lookahead.token == JsonToken.Token.CLOSE_OBJECT))
                {
                    makeKeyValue(jsonarray, lookahead);
                }
                else
                {
                    stack.Push(jsonarray);
                }
                break;

            case JsonToken.Token.NULL:
            case JsonToken.Token.BOOLEAN:
            case JsonToken.Token.NUMBER:
                if (lookahead != null &&
                    (lookahead.token == JsonToken.Token.COMMA ||
                     lookahead.token == JsonToken.Token.CLOSE_OBJECT))
                {
                    makeKeyValue(current, lookahead);
                }
                else
                {
                    stack.Push(current);
                }
                break;

            case JsonToken.Token.STRING:

                current.data = current.data.Substring(1, current.data.Length - 2);
                if (lookahead != null &&
                    (lookahead.token == JsonToken.Token.COMMA ||
                     lookahead.token == JsonToken.Token.CLOSE_OBJECT))
                {
                    makeKeyValue(current, lookahead);
                }
                else
                {
                    stack.Push(current);
                }

                break;

            case JsonToken.Token.SEPRATION_KEY_VALUE:
                stack.Push(current);
                break;
            }
        }