/**
  * Reads one statement from the parser, executes it, and prints the result. Returns false if there
  * was nothing else to run.
  */
 public boolean runOne(Parser parser, Handler handler) {
   handler.beforeParse();
   OJStatement.Argument[] arguments =
       (OJStatement.Argument[]) argumentList.toArray(new OJStatement.Argument[0]);
   OJStatement statement = new OJStatement(connection);
   ClassDeclaration classDecl = statement.init(arguments);
   Environment env = statement.getEnvironment();
   ParseTree parseTree = null;
   try {
     parseTree = parser.InteractiveStatement(env);
     if (parseTree == null) {
       return false;
     }
   } catch (ParseException e) {
     handler.onParseException(e);
     return parser.getNextToken().kind != Parser.EOF;
   }
   handler.beforeExecute(parseTree);
   OJQueryExpander queryExpander = new OJQueryExpander(env, connection);
   parseTree = statement.validate(parseTree, queryExpander);
   OJClass clazz = null;
   if (parseTree instanceof Expression) {
     Expression expression = (Expression) parseTree;
     clazz = Util.getType(env, expression);
   }
   Object o = statement.evaluate(classDecl, parseTree, arguments);
   handler.afterExecute(clazz, o);
   if (o instanceof VarDecl[]) {
     VarDecl[] decls = (VarDecl[]) o;
     for (int i = 0; i < decls.length; i++) {
       VarDecl decl = decls[i];
       argumentList.add(new OJStatement.Argument(decl.name, decl.clazz, decl.value));
     }
   }
   return true;
 }