/**
 * @(#)Grammar.java	17.03.2004
 * 
 * @author kst
 */
package commons.chartparser;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
/**
 * Created on 17.03.2004
 * @author kst Das ist ein Lexikon, Eintraege werden aus einer Datei gelesen.
 * Lexfile-Format: "beendet VORGANG VT beenden 3s.p"
 */
@SuppressWarnings("unchecked")
public class Lex
{

HashVector vollformen = null;
HashVector semanteme  = null;
HashVector klassen    = null;
HashVector lexeme     = null;

// private String cat = "UNDEF";
//
// private List list = null;
//
// private int index = 0; // counter for iterator
//
// private int size = 0; // size for list (for iterator)
public Lex(String lexfile)
{
   vollformen = new HashVector();
   klassen = new HashVector();
   lexeme = new HashVector();
   semanteme = new HashVector();
   readFromFile(lexfile);
}

public static String getCat (String symbol)
{
   String[] cat_kgr = symbol.split(":");
   return cat_kgr.length > 0 ? cat_kgr[0] : null;
}

public static String getKgr (String symbol)
{
   String[] cat_kgr = symbol.split(":");
   return cat_kgr.length > 1 ? cat_kgr[1] : null;
}

private void readFromFile (String filename)
{
   if (new File(filename).exists())
   {
      BufferedReader reader = null;
      try
      {
         reader = new BufferedReader(new FileReader(filename));
         String nextLine = null;
         while (null != (nextLine = reader.readLine()))
         {
            if (!nextLine.startsWith("#"))
            {
               new Word(this, nextLine);
            }
         }
      }
      catch (IOException e)
      {
         Main.debug(e.toString());
      }
      finally
      {
         try
         {
            reader.close();
         }
         catch (Exception e)
         {}
      }
   }
   else
   {
      Main.debug("Nicht gefunden: '" + filename + "'");
   }
}

/**
 * Liefert einen Iterator, der alle w�rter einer CAT enthaelt, die ggf. einer Kongruenz entsprechen
 * muessen.
 */
public Iterator expand (String cat, String kgr)
{
   Iterator I = klassen.iterator(cat); // alle woerter einer CAT
   if (I != null)
   {
      if (kgr != null) // kgr filtern wenn kgr gesetzt
      {
         ArrayList list = new ArrayList();
         while (I.hasNext())
         {
            Word w = (Word) I.next();
            if (Unify.flection(kgr, w.kgr))
            {
               list.add(w);
            }
         }
         I = list.iterator();
      }
   }
   return I;
}

/**
 * Liefert einen Iterator, der alle zu einer Vollform passenden CAT enthaelt. Die Methode verhindert
 * doppelte Eintraege der gleichen CAT. Die Iterator-Objekte sind Strings.
 */
public Iterator reduceToCAT (String form)
{
   Iterator I = vollformen.iterator(form);
   if (I != null)
   {
      ArrayList list = new ArrayList();
      while (I.hasNext())
      {
         String cat = ((Word) I.next()).cat;
         if (!list.contains(cat))
         {
            list.add(cat);
         }
      }
      I = list.iterator();
   }
   return I;
}

/**
 * Liefert einen Iterator, der alle zu einer Vollform passenden Word Objekte enthaelt. Die
 * Iterator-Objekte sind Words.
 */
public Iterator reduceToWord (String form)
{
   Iterator I = vollformen.iterator(form);
   if (I != null)
   {
      ArrayList list = new ArrayList();
      while (I.hasNext())
      {
         Word w = (Word) I.next();
         if (!list.contains(w))
         {
            list.add(w);
         }
      }
      I = list.iterator();
   }
   return I;
}

public int size ()
{
   return (vollformen == null ? -1 : vollformen.size());
}
}