Log in Help
Print
HomegatepluginsParser_SUPPLEprolog-implsplcafesrcshefnlpsuppleprolog 〉 PrologCafe.java
 
package shef.nlp.supple.prolog;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import shef.nlp.supple.prolog.cafe.PRED_parse_3;
import shef.nlp.supple.prolog.cafe.PRED_best_parse_cats_2;

import gate.creole.ExecutionException;

import jp.ac.kobe_u.cs.prolog.builtin.PRED_consult_1;
import jp.ac.kobe_u.cs.prolog.lang.JavaObjectTerm;
import jp.ac.kobe_u.cs.prolog.lang.ListTerm;
import jp.ac.kobe_u.cs.prolog.lang.Predicate;
import jp.ac.kobe_u.cs.prolog.lang.PrologControl;
import jp.ac.kobe_u.cs.prolog.lang.SymbolTerm;
import jp.ac.kobe_u.cs.prolog.lang.Term;

/**
 * Prolog wrapper for SUPPLE running on PrologCafe.
 */
public class PrologCafe extends Prolog
{
   private Hashtable database = null;

   public boolean init(File f)
   {
      try
      {
         database = new Hashtable();

         ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));

         int numKeys = in.readInt();

         while (database.keySet().size() < numKeys)
         {
            Term key = (Term)in.readObject();

            database.put(key,readTerm(in));
         }

         in.close();

      }
      catch (Exception e)
      {
         database = null;
      }

      return database != null;

   }

   public void parse(File in, File out, boolean debugMode)
                   throws ExecutionException {
      PrologControl p = new PrologControl();

      Term t = SymbolTerm.makeSymbol("[]");
      t = new ListTerm(SymbolTerm.makeSymbol(in.getAbsolutePath()),t);

      Predicate code = new PRED_parse_3();

      //Predicate test = new PRED_best_parse_cats_2();

      Term hash = new JavaObjectTerm(database);

      boolean success = false;

      try {
         PrintWriter pout = new PrintWriter(new FileWriter(out));

         Term writeOut = new JavaObjectTerm(pout);

         success = p.execute(code,new Term[]{writeOut,hash,t});

         pout.flush();
         pout.close();

      }
      catch(Exception e) {
         throw new ExecutionException(e);
      }
      if(!success) {
        throw new ExecutionException("PrologCafe execution failed");
      }
   }

   public static void main(String args[]) throws Exception
   {
      PrologControl p = new PrologControl();

      Predicate consult = new PRED_consult_1();
      Term f = SymbolTerm.makeSymbol(args[0]);

      p.setPredicate(consult,new Term[]{f});

      System.out.println("Consulting completed: " + p.call());

      Hashtable database = p.engine.getDynamicHash();

      Set keys = database.keySet();

      Iterator it = keys.iterator();

      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(args[1]));

      out.writeInt(keys.size());

      while (it.hasNext())
      {
         Term k = (Term)it.next();

         out.writeObject(k.dereference());

         Term v = (Term)database.get(k);

         writeTerm(out,v);
      }

      out.flush();
      out.close();

      System.exit(0);
   }

   private static void writeTerm(ObjectOutputStream out, Term t) throws Exception
   {
      if (t instanceof ListTerm)
      {
         ListTerm lt = (ListTerm)t;

         out.writeInt(lt.length());

         boolean working = true;

         while (working)
         {
            Term ct = lt.car().dereference();
            writeTerm(out,ct);

            if (lt.cdr().dereference() instanceof ListTerm)
               lt = (ListTerm)lt.cdr().dereference();
            else
               working = false;
         }
      }
      else
      {
         out.writeInt(-1);
         out.writeObject(t.dereference());
      }
   }

   private static Term readTerm(ObjectInputStream in) throws Exception
   {
      int length = in.readInt();

      if (length != -1)
      {
         List terms = new ArrayList();

         for (int i = 0 ; i < length ; ++i)
         {
            terms.add(readTerm(in));
         }

         Term t = SymbolTerm.makeSymbol("[]");

         for (int i = terms.size() -1; i>=0 ; --i)
         {
            t = new ListTerm((Term)terms.get(i),t);
         }

         return t;
      }
      else
      {
         Term t = (Term)in.readObject();

         return t;
      }
   }
}