public Token deserialize(
                JsonElement src, 
                java.lang.reflect.Type type, 
                JsonDeserializationContext context) throws JsonParseException {
            
            JsonObject object = src.getAsJsonObject();
            
            Type t = Type.values()[
                (Integer)context.deserialize(object.get("type"), Integer.class)];
            
            Fragment coordinates = 
                (Fragment)context.deserialize(
                    object.get("coordinates"), 
                    Fragment.class
                );
            
            switch(t) {
                case CONST_INT:
                {
                    int value = 
                        (Integer)context.deserialize(
                            object.get("value"), 
                            Integer.class
                        );
                    return new IntegerConstantToken(coordinates, value);
                }
                case CONST_DOUBLE:
                {
                    double value = 
                        (Double)context.deserialize(
                            object.get("value"), 
                            Double.class
                        );
                    return new DoubleConstantToken(coordinates, value);
                }
                case CONST_CHAR:
                {
                    int value = 
                        (Integer)context.deserialize(
                            object.get("value"), 
                            Integer.class
                        );
                    return new CharConstantToken(coordinates, value);
                }
                case IDENTIFIER:
                {
                    String name = 
                        (String)context.deserialize(
                            object.get("name"), 
                            String.class
                        );
                    return new IdentifierToken(coordinates, name);
                }
                default:
                    return new SpecialToken(coordinates, t);
            }
        }