import java.io.StreamTokenizer;
import java.io.*;
import java.util.Hashtable;
import java.net.URL;

public class Parser {

    Hashtable ht;
    Hashtable aht;
    TextInput caller;

    public void start(TextInput pcaller) {
        ht = new Hashtable(30);
	  aht = new Hashtable(70);
        caller = pcaller;

        // open file
	  try {
            URL inputFile = new URL("http://acg.media.mit.edu/mas962/ps1/code.txt");
		StreamTokenizer st = new StreamTokenizer(inputFile.openStream());
		int ttt = st.nextToken();

		st.toString();
		String key = st.sval;

            ttt = st.nextToken();
		st.toString();
            String object = st.sval;
	      System.err.println(key+" : "+object);


           // get first pair
 	     while(ttt != st.TT_EOF){
               ht.put(key, object);
               // get next pair
  	         ttt = st.nextToken();
               st.toString();
	         key = st.sval;
               ttt = st.nextToken();
               st.toString();
               object = st.sval;
      	   System.err.println(key+" : "+object);

            }
        } catch (Exception e) {
            System.err.println("mari ex!: " + e);
        }

    }

    public void addExtraChars() {
        // put in numbers
        String type = new String("number");        
        int count = 0;
	  
        while(count < 10) {
	      Integer i = new Integer(count);
            aht.put(new String(i.toString()), i); 
            count = count + 1;
        }

        // put in a space
        aht.put(new String(" "), new Integer(10));

        aht.put(new String(">"), new Integer(11));  // indent
        aht.put(new String("<"), new Integer(12));  // deindent
        aht.put(new String("-"), new Integer(13));  // uppercase
        aht.put(new String("+"), new Integer(14));  // lowercase
        aht.put(new String("\\"), new Integer(15)); // tab in
        aht.put(new String("/"), new Integer(16));  // tab out
        aht.put(new String("["), new Integer(17));  // + ispace
        aht.put(new String("]"), new Integer(18));  // - ispace
        aht.put(new String("("), new Integer(19));  // + bspace
        aht.put(new String(")"), new Integer(20));  // - bspace
        aht.put(new String("{"), new Integer(21));  // crack on
        aht.put(new String("}"), new Integer(22));  // crack off

        aht.put(new String("|"), new Integer(28));  // |
        aht.put(new String("$"), new Integer(29));  // tab
        aht.put(new String("#"), new Integer(30));  // newline
        
    }

    public String p2Parse(String key) {

	  String obj = (String)ht.get(key);   
	  return obj;

    }

    public String p3Parse(String key) {

	  String obj = (String)ht.get(key);
   
	  if(obj == null) {
            Integer aobj = (Integer)aht.get(key);

            if(aobj == null) return obj;

 		switch(aobj.intValue()) {
                case 0: 
                    return aobj.toString();
// 			  break;
                case 1: 
                    return aobj.toString();
// 			  break;
                case 2: 
                    return aobj.toString();
// 			  break;
                case 3: 
                    return aobj.toString();
// 			  break;
                case 4: 
                    return aobj.toString();
// 			  break;
                case 5: 
                    return aobj.toString();
// 			  break;
                case 6: 
                    return aobj.toString();
// 			  break;
                case 7: 
                    return aobj.toString();
// 			  break;
                case 8: 
                    return aobj.toString();
// 			  break;
                case 9: 
                    return aobj.toString();
// 			  break;
                case 10: 
                    return aobj.toString();
// 			  break;
                case 11: 
                    caller.leftin = caller.leftin + 1;
 			  break;
                case 12: 
                    caller.leftin = caller.leftin - 1;
 			  break;
                case 13: 
                    caller.lc = caller.lc + 1;
 			  break;
                case 14: 
                    caller.uc = caller.uc + 1;
                    break;
                case 21: 
                    caller.tab = caller.tab + 1;
			  break;
                case 22: 
                    caller.tab = caller.tab - 1;
                    break;
                case 17: 
                    caller.space = caller.space + 1;
	 	        break;
                case 18: 
                    caller.space = caller.space - 1;
	 	        break;

                case 19: 
                    caller.bspace = caller.bspace + 1;
	 	        break;
                case 20: 
                    caller.bspace = caller.bspace - 1;
	 	        break;

                case 15: 
 			  if(caller.stepsUp == true)
			      caller.stepsUp = false;
			  else
				caller.stepsUp = true;
			  break;

                case 16: 
 			  if(caller.stepsDown == true)
			      caller.stepsDown = false;
			  else
				caller.stepsDown = true;
			  break;

                case 29: 
 			  caller.remainingSpace = caller.remainingSpace - 72;
                    return new String("\t");

                case 30: 
 			  caller.remainingSpace = caller.taWidth;
                    return new String("\n");


		    default:
                    break;
            }
            return obj;
        }
        else
            return obj;
     }
}


