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); } }
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; } }