//

import java.util.*; // defines StringTokenizer

public class Script
{
   public final static int CAMERA   = -1;
   public final static int EVERYONE = -2;
   public final static int NEAREST  = -3;
   public final static int NOTHING  = -4;
   public final static int NARRATOR = -5;

   static int nActions;
   static Action actions[];
   static StringTokenizer st;
   static Action action() { return actions[nActions-1]; }

   public static Action[] parse(String script) {
      script = removeComments(script);
      actions = new Action[1000];
      nActions = 0;
      st = new StringTokenizer(script);
      while (st.hasMoreTokens()) {
         String t = st.nextToken();
         if      (t.equals("actor"))     { add(Action.ACTOR)     ; vector(); }
         else if (t.equals("begin"))     { add(Action.BEGIN)     ; no_arg(); }
         else if (t.equals("cameraTo"))  { add(Action.CAMERA_TO) ; vector(); }
         else if (t.equals("end"))       { add(Action.END)       ; no_arg(); }
         else if (t.equals("everyone"))  { add(Action.ACTOR)     ; vector(EVERYONE); }
         else if (t.equals("faces"))     { add(Action.FACE)      ; vector(); }
         else if (t.equals("leftArm"))   { add(Action.LEFT_ARM)  ; vector(); }
         else if (t.equals("looksAt"))   { add(Action.LOOK_AT)   ; vector(); }
         else if (t.equals("movesBy"))   { add(Action.MOVE_BY)   ; vector(); }
         else if (t.equals("movesTo"))   { add(Action.MOVE_TO)   ; vector(); }
         else if (t.equals("narrator"))  { add(Action.ACTOR)     ; vector(NARRATOR); }
         else if (t.equals("pauses"))    { add(Action.PAUSE)     ; vector(); }
         else if (t.equals("rightArm"))  { add(Action.RIGHT_ARM) ; vector(); }
         else if (t.equals("says"))      { add(Action.SAY)       ; string(); }
         else if (t.equals("then"))      { add(Action.SYNC)      ; no_arg(); }
         else if (t.equals("thinks"))    { add(Action.THINK)     ; string(); }
      }
      add(Action.SYNC);
      return actions;
   }

   static String removeComments(String str) {
      String s = "";
      for (int i = 0 ; i < str.length() ; i++)
         if (! pattern2(str, i, '/', '*'))
	    s += (char)str.charAt(i);
         else
	    for (i++ ; i < str.length() ; i++)
	       if (pattern2(str, i-1, '*', '/'))
		  break;
      return s;
   }

   static boolean pattern2(String str, int i, char a, char b) {
      return i < str.length()-1 && str.charAt(i) == a && str.charAt(i+1) == b;
   }

   static Action add(int type) {
      return actions[nActions++] = new Action(type);
   }

   static void no_arg() {
      action().argType = Action.HAS_NO_ARG;
   }

   static void vector(double a) {
      action().argType = Action.VECTOR_ARG;
      action().s = "" + a;
   }

   static void vector() {
      action().argType = Action.VECTOR_ARG;
      action().s = st.nextToken();
   }

   public static double number(String t) {
      if (t.equals("camera" )) return CAMERA;
      if (t.equals("nothing")) return NOTHING;
      if (t.equals("nearest")) return NEAREST;
      return (new Double(t)).doubleValue();
   }

   static void string() {
      action().argType = Action.STRING_ARG;
      String str = "";
      for (int i = 0 ; st.hasMoreTokens() ; i++) {
         String t = st.nextToken();
         if (i==0)
	    if (t.equals("nothing"))
	       break;
	    else if (! t.substring(0,2).equals("``"))
               System.err.println("string not starting with '``' at " + t);
         str += i==0 ? t.substring(2,t.length()) : " " + t;
	 int len = str.length();
         if (len >= 2 && str.substring(len-2,len).equals("''")) {
            str = str.substring(0, str.length()-2);
            break;
         }
      }
      action().s = str;
   }
}