public Object parse(Reader in,ContainerFactory containerFactory) throws IOException, ParseException {
  reset(in);
  LinkedList statusStack=new LinkedList();
  LinkedList valueStack=new LinkedList();
  try {
    do {
      nextToken();
switch (status) {
case S_INIT:
switch (token.type) {
case Yytoken.TYPE_VALUE:
          status=S_IN_FINISHED_VALUE;
        statusStack.addFirst(new Integer(status));
      valueStack.addFirst(token.value);
    break;
case Yytoken.TYPE_LEFT_BRACE:
  status=S_IN_OBJECT;
statusStack.addFirst(new Integer(status));
valueStack.addFirst(createObjectContainer(containerFactory));
break;
case Yytoken.TYPE_LEFT_SQUARE:
status=S_IN_ARRAY;
statusStack.addFirst(new Integer(status));
valueStack.addFirst(createArrayContainer(containerFactory));
break;
default :
status=S_IN_ERROR;
}
break;
case S_IN_FINISHED_VALUE:
if (token.type == Yytoken.TYPE_EOF) return valueStack.removeFirst();
 else throw new ParseException(getPosition(),ParseException.ERROR_UNEXPECTED_TOKEN,token);
case S_IN_OBJECT:
switch (token.type) {
case Yytoken.TYPE_COMMA:
break;
case Yytoken.TYPE_VALUE:
if (token.value instanceof String) {
String key=(String)token.value;
valueStack.addFirst(key);
status=S_PASSED_PAIR_KEY;
statusStack.addFirst(new Integer(status));
}
 else {
status=S_IN_ERROR;
}
break;
case Yytoken.TYPE_RIGHT_BRACE:
if (valueStack.size() > 1) {
statusStack.removeFirst();
valueStack.removeFirst();
status=peekStatus(statusStack);
}
 else {
status=S_IN_FINISHED_VALUE;
}
break;
default :
status=S_IN_ERROR;
break;
}
break;
case S_PASSED_PAIR_KEY:
switch (token.type) {
case Yytoken.TYPE_COLON:
break;
case Yytoken.TYPE_VALUE:
statusStack.removeFirst();
String key=(String)valueStack.removeFirst();
Map parent=(Map)valueStack.getFirst();
parent.put(key,token.value);
status=peekStatus(statusStack);
break;
case Yytoken.TYPE_LEFT_SQUARE:
statusStack.removeFirst();
key=(String)valueStack.removeFirst();
parent=(Map)valueStack.getFirst();
List newArray=createArrayContainer(containerFactory);
parent.put(key,newArray);
status=S_IN_ARRAY;
statusStack.addFirst(new Integer(status));
valueStack.addFirst(newArray);
break;
case Yytoken.TYPE_LEFT_BRACE:
statusStack.removeFirst();
key=(String)valueStack.removeFirst();
parent=(Map)valueStack.getFirst();
Map newObject=createObjectContainer(containerFactory);
parent.put(key,newObject);
status=S_IN_OBJECT;
statusStack.addFirst(new Integer(status));
valueStack.addFirst(newObject);
break;
default :
status=S_IN_ERROR;
}
break;
case S_IN_ARRAY:
switch (token.type) {
case Yytoken.TYPE_COMMA:
break;
case Yytoken.TYPE_VALUE:
List val=(List)valueStack.getFirst();
val.add(token.value);
break;
case Yytoken.TYPE_RIGHT_SQUARE:
if (valueStack.size() > 1) {
statusStack.removeFirst();
valueStack.removeFirst();
status=peekStatus(statusStack);
}
 else {
status=S_IN_FINISHED_VALUE;
}
break;
case Yytoken.TYPE_LEFT_BRACE:
val=(List)valueStack.getFirst();
Map newObject=createObjectContainer(containerFactory);
val.add(newObject);
status=S_IN_OBJECT;
statusStack.addFirst(new Integer(status));
valueStack.addFirst(newObject);
break;
case Yytoken.TYPE_LEFT_SQUARE:
val=(List)valueStack.getFirst();
List newArray=createArrayContainer(containerFactory);
val.add(newArray);
status=S_IN_ARRAY;
statusStack.addFirst(new Integer(status));
valueStack.addFirst(newArray);
break;
default :
status=S_IN_ERROR;
}
break;
case S_IN_ERROR:
throw new ParseException(getPosition(),ParseException.ERROR_UNEXPECTED_TOKEN,token);
}
if (status == S_IN_ERROR) {
throw new ParseException(getPosition(),ParseException.ERROR_UNEXPECTED_TOKEN,token);
}
}
 while (token.type != Yytoken.TYPE_EOF);
}
 catch (IOException ie) {
throw ie;
}
throw new ParseException(getPosition(),ParseException.ERROR_UNEXPECTED_TOKEN,token);
}

public Object parse ( Reader in , ContainerFactory containerFactory ) throws IOException , ParseException { reset ( in ) ; LinkedList statusStack = new LinkedList ( ) ; LinkedList valueStack = new LinkedList ( ) ; try { do { nextToken ( ) ; switch ( status ) { case S_INIT : switch ( token . type ) { case Yytoken . TYPE_VALUE : status = S_IN_FINISHED_VALUE ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( token . value ) ; break ; case Yytoken . TYPE_LEFT_BRACE : status = S_IN_OBJECT ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( createObjectContainer ( containerFactory ) ) ; break ; case Yytoken . TYPE_LEFT_SQUARE : status = S_IN_ARRAY ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( createArrayContainer ( containerFactory ) ) ; break ; default : status = S_IN_ERROR ; } break ; case S_IN_FINISHED_VALUE : if ( token . type == Yytoken . TYPE_EOF ) return valueStack . removeFirst ( ) ; else throw new ParseException ( getPosition ( ) , ParseException . ERROR_UNEXPECTED_TOKEN , token ) ; case S_IN_OBJECT : switch ( token . type ) { case Yytoken . TYPE_COMMA : break ; case Yytoken . TYPE_VALUE : if ( token . value instanceof String ) { String key = ( String ) token . value ; valueStack . addFirst ( key ) ; status = S_PASSED_PAIR_KEY ; statusStack . addFirst ( new Integer ( status ) ) ; } else { status = S_IN_ERROR ; } break ; case Yytoken . TYPE_RIGHT_BRACE : if ( valueStack . size ( ) > 1 ) { statusStack . removeFirst ( ) ; valueStack . removeFirst ( ) ; status = peekStatus ( statusStack ) ; } else { status = S_IN_FINISHED_VALUE ; } break ; default : status = S_IN_ERROR ; break ; } break ; case S_PASSED_PAIR_KEY : switch ( token . type ) { case Yytoken . TYPE_COLON : break ; case Yytoken . TYPE_VALUE : statusStack . removeFirst ( ) ; String key = ( String ) valueStack . removeFirst ( ) ; Map parent = ( Map ) valueStack . getFirst ( ) ; parent . put ( key , token . value ) ; status = peekStatus ( statusStack ) ; break ; case Yytoken . TYPE_LEFT_SQUARE : statusStack . removeFirst ( ) ; key = ( String ) valueStack . removeFirst ( ) ; parent = ( Map ) valueStack . getFirst ( ) ; List newArray = createArrayContainer ( containerFactory ) ; parent . put ( key , newArray ) ; status = S_IN_ARRAY ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( newArray ) ; break ; case Yytoken . TYPE_LEFT_BRACE : statusStack . removeFirst ( ) ; key = ( String ) valueStack . removeFirst ( ) ; parent = ( Map ) valueStack . getFirst ( ) ; Map newObject = createObjectContainer ( containerFactory ) ; parent . put ( key , newObject ) ; status = S_IN_OBJECT ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( newObject ) ; break ; default : status = S_IN_ERROR ; } break ; case S_IN_ARRAY : switch ( token . type ) { case Yytoken . TYPE_COMMA : break ; case Yytoken . TYPE_VALUE : List val = ( List ) valueStack . getFirst ( ) ; val . add ( token . value ) ; break ; case Yytoken . TYPE_RIGHT_SQUARE : if ( valueStack . size ( ) > 1 ) { statusStack . removeFirst ( ) ; valueStack . removeFirst ( ) ; status = peekStatus ( statusStack ) ; } else { status = S_IN_FINISHED_VALUE ; } break ; case Yytoken . TYPE_LEFT_BRACE : val = ( List ) valueStack . getFirst ( ) ; Map newObject = createObjectContainer ( containerFactory ) ; val . add ( newObject ) ; status = S_IN_OBJECT ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( newObject ) ; break ; case Yytoken . TYPE_LEFT_SQUARE : val = ( List ) valueStack . getFirst ( ) ; List newArray = createArrayContainer ( containerFactory ) ; val . add ( newArray ) ; status = S_IN_ARRAY ; statusStack . addFirst ( new Integer ( status ) ) ; valueStack . addFirst ( newArray ) ; break ; default : status = S_IN_ERROR ; } break ; case S_IN_ERROR : throw new ParseException ( getPosition ( ) , ParseException . ERROR_UNEXPECTED_TOKEN , token ) ; } if ( status == S_IN_ERROR ) { throw new ParseException ( getPosition ( ) , ParseException . ERROR_UNEXPECTED_TOKEN , token ) ; } } while ( token . type != Yytoken . TYPE_EOF ) ; } catch ( IOException ie ) { throw ie ; } throw new ParseException ( getPosition ( ) , ParseException . ERROR_UNEXPECTED_TOKEN , token ) ; }
parse json text into java object from the input source .
