package commons.script;

import java.util.List;
import commons.application.ctx.Context;
import commons.script.lang.Arguments;
import commons.script.lang.Clause;
import commons.script.lang.operations.CMD;
import commons.script.lang.operations.Call;
import commons.script.lang.operations.Interrupt;
import commons.script.lang.operations.MakroDef;

public class Analyzer
{
@SuppressWarnings("unchecked")
public XNode analyzeSyntax(Context ctx, XNode rroot, TokenizedLines lines)
{
   XNode node = rroot;
   Arguments currentArgs = null;
   for(List<String> tokens : lines)
   for(int k = 0; k < tokens.size(); k += 2)
   {
      String head = tokens.get(k);
      String args = tokens.get(k+1);
      if(head.equals(InputTokenizer.TOKTYPE_IF))
      {
         Clause c = new Clause(args);
         node = node.addChild(c);
      }
      else if(head.equals(InputTokenizer.TOKTYPE_ELSE))
      {
         node.onElse = true;
      }
      else if(head.equals(InputTokenizer.TOKTYPE_WHILE))
      {
         node = node.addChild(new Clause(args));
         node.repeat = true;
      }
      else if(head.equals(InputTokenizer.TOKTYPE_END))
         node = node.getParent();
      else if(head.equals(InputTokenizer.TOKTYPE_ARGS))
      {
         currentArgs = new Arguments(args);
      }
      else if(head.equals(InputTokenizer.TOKTYPE_CMD))
      {
         node.addNode(new CMD(args, currentArgs));
         currentArgs = null;
      }
      else if(head.equals(InputTokenizer.TOKTYPE_CALL))
      {
         node.addNode(new Call(args, currentArgs));
         currentArgs = null;
      }
      else if(head.equals(InputTokenizer.TOKTYPE_MAKRO))
      {
         node.addNode(new MakroDef(args));
         currentArgs = null;
      }
      else if(head.equals(InputTokenizer.TOKTYPE_INTERR))
         node.addNode(new Interrupt(args));
   }
   return node;
}
}
