import java.io.*;
import java.util.*;
//import Tape;
//import Machine;

/**
 *  
 *  trys to implement the parse script language
 *
 *  @author http://bumble.sf.net
 */
 
  
public class Script extends Object
{
  //--------------------------------------------
  private static String NEWLINE = System.getProperty("line.separator");
  //--------------------------------------------

  //--------------------------------------------
  public Script()
  {
  }




  //--------------------------------------------
  /** a main method for testing */
  public static void main(String[] args) throws Exception
  {
    
    StringBuffer sbUsageMessage = new StringBuffer("");
    sbUsageMessage.append("test usage: java Script ");
    sbUsageMessage.append(NEWLINE);

    StringBuffer sbMessage = new StringBuffer("");

    /*
    if (args.length > 2)
    {	    
      System.out.println(sbUsageMessage);
      System.exit(-1);
    }

    String sText = args[0];
    char cChar = args[1].charAt(0);
    */

    //-- a machine to parse the script
    Machine pp = new Machine();
    Machine ss = new Machine();
    
    String sText = new String(
      "/letter|colon/" +
      "{" +
      "  add 'word'; print; clear; push; " +
      " /here/{push; clear;}" +
      "}" +
      "/letter|colon/" +
      "{" +
      "  add 'word'; print; clear; push; " +
      " /here/{push; clear;}" +
      "}" +
      "/letter|colon/" +
      "{" +
      "  add 'word'; print; clear; push; " +
      "  add 'word'; print; clear; push; " +
      "  add 'word'; print; clear; push; " +
      " /here/{push; clear;}" +
      "}" +
      "");

    char cCurrent;
    for (int ii = 0; ii < sText.length(); ii++)
    {             
       cCurrent = sText.charAt(ii); 
       pp.add(new Character(cCurrent).toString());

       System.out.println("character:" + cCurrent);


       if (pp.matches("/"))
       {
         pp.clear();
         pp.put();
         pp.add("slash");
         pp.push();
       }

       if (pp.matches("{"))
       {
         pp.clear();
         pp.put();
         pp.add("open-brace");
         pp.push();
       }

       if (pp.matches("}"))
       {
         pp.clear();
         pp.put();
         pp.add("close-brace");
         pp.push();
       }

       if (pp.matches(";"))
       {
         pp.clear();
         pp.put();
         pp.add("semi-colon");
         pp.push();
       }

       if (pp.matches(" "))
       {
         pp.clear();
         pp.put();
         pp.add("space");
         pp.push();
       }

       if (pp.matches("'"))
       {
         pp.clear();
         pp.put();
         pp.add("quote");
         pp.push();
       }

       if (pp.workspace().length() > 0)
       {
         pp.put();
         pp.clear();
         pp.add("character");
         pp.push();
       }


       
       System.out.println(pp.printState());

       pp.pop();
       pp.pop();
       System.out.println(pp.printState());

       //-------------------------------------------
       //-- 
       if (pp.workspace().equals("start-test|slash|"))
       {
         pp.clear();
         pp.add("if workspace is (");
         pp.get();
         pp.add(") then");
         pp.put();
         pp.clear();
         pp.add("test|");
         pp.push();
       }

       if (pp.workspace().equals("start-test|character|"))
       {
         pp.clear();
         pp.get();
         pp.incrementTape();
         pp.get();
         pp.decrementTape();
         pp.put();
         pp.clear();
         pp.add("start-test|");
         pp.push();
       }

       if (pp.workspace().equals("start-test|space|"))
       {
         pp.clear();
         pp.get();
         pp.add(" ");
         pp.put();
         pp.clear();
         pp.add("start-test|");
         pp.push();
       }

       if (pp.workspace().equals("slash|character|"))
       {
         pp.clear();
         pp.incrementTape();
         pp.get();
         pp.decrementTape();
         pp.put();
         pp.clear();
         pp.add("start-test|");
         pp.push();
       }

       if (pp.workspace().equals("slash|space|"))
       {
         pp.clear();
         pp.add(" ");
         pp.put();
         pp.clear();
         pp.add("start-test|");
         pp.push();
       }

       //------------------------------------------
       //--
       if (pp.workspace().equals("start-quote|quote|"))
       {
         pp.clear();
         pp.add("quote(");
         pp.get();
         pp.add(")");
         pp.put();
         pp.clear();
         pp.add("quoted-text|");
         pp.push();
       }

       if (pp.workspace().equals("start-quote|character|"))
       {
         pp.clear();
         pp.get();
         pp.incrementTape();
         pp.get();
         pp.decrementTape();
         pp.put();
         pp.clear();
         pp.add("start-quote|");
         pp.push();
       }

       if (pp.workspace().equals("start-quote|space|"))
       {
         pp.clear();
         pp.get();
         pp.add(" ");
         pp.put();
         pp.clear();
         pp.add("start-quote|");
         pp.push();
       }

       if (pp.workspace().equals("quote|character|"))
       {
         pp.clear();
         pp.incrementTape();
         pp.get();
         pp.decrementTape();
         pp.put();
         pp.clear();
         pp.add("start-quote|");
         pp.push();
       }

       if (pp.workspace().equals("quote|space|"))
       {
         pp.clear();
         pp.add(" ");
         pp.put();
         pp.clear();
         pp.add("start-quote|");
         pp.push();
       }
       //------------------------------------------


       if (pp.workspace().equals("word|character|"))
       {
         pp.clear();
         pp.get();
         pp.incrementTape();
         pp.get();
         pp.decrementTape();
         pp.put();
         pp.clear();
         pp.add("word|");
         pp.push();
       }

       if (pp.workspace().equals("character|character|"))
       {
         pp.clear();
         pp.get();
         pp.incrementTape();
         pp.get();
         pp.decrementTape();
         pp.put();
         pp.clear();
         pp.add("word|");
         pp.push();
       }


       pp.push();
       pp.push();
       System.out.println(pp.printState());

       boolean bReduction = true;
       while (bReduction)
       {

        bReduction = false;

        //------------------------------------
        //-- ignore irrelevant spaces
        pp.pop();

        if (pp.workspace().equals("space|"))
        {
          pp.clear();
        }

        pp.pop();


        if (pp.workspace().equals("command-set|command|"))
        {
          pp.clear();
          pp.get();
          pp.incrementTape();
          pp.get();
          pp.decrementTape();
          pp.put();
          pp.clear();
          pp.add("command-set|");
          pp.push();
          bReduction = true;
        }

        if (pp.workspace().equals("command|command|"))
        {
          pp.clear();
          pp.get();
          pp.incrementTape();
          pp.get();
          pp.decrementTape();
          pp.put();
          pp.clear();
          pp.add("command-set|");
          pp.push();
          bReduction = true;
        }

        if (pp.workspace().equals("word|semi-colon|"))
        {
          pp.clear();
          pp.get();
          pp.put();
          pp.clear();
          pp.add("command|");
          pp.push();
          bReduction = true;
        }

        pp.pop();

        if (pp.workspace().equals("word|quoted-text|semi-colon|"))
        {
          pp.clear();
          pp.get();
          pp.add(" ");
          pp.incrementTape();
          pp.get();
          pp.decrementTape();
          pp.put();
          pp.clear();
          pp.add("command|");
          pp.push();
          bReduction = true;
        }

        pp.pop();

        if (pp.workspace().equals("test|open-brace|command|close-brace|"))
        {
          pp.clear();
          pp.get();
          pp.add(" ");
          pp.incrementTape();
          pp.incrementTape();
          pp.get();
          pp.decrementTape();
          pp.decrementTape();
          pp.put();
          pp.clear();
          pp.add("command|");
          pp.push();
          bReduction = true;
        }

        if (pp.workspace().equals("test|open-brace|command-set|close-brace|"))
        {
          pp.clear();
          pp.get();
          pp.add(" ");
          pp.incrementTape();
          pp.incrementTape();
          pp.get();
          pp.decrementTape();
          pp.decrementTape();
          pp.put();
          pp.clear();
          pp.add("command|");
          pp.push();
          bReduction = true;
        }

        pp.push();
        pp.push();
        pp.push();
        pp.push();


        System.out.println(pp.printState());


       } //-- while a reduction

    } //-- for 

    

  } //-- main()
  
} //-- Script class
