001 /**
002 * @author paulk, Jul 21, 2002
003 */
004
005 package toolbus.process;
006
007 import java.util.Stack;
008 import toolbus.AtomList;
009 import toolbus.State;
010 import toolbus.TBTermFactory;
011 import toolbus.environment.Environment;
012 import toolbus.exceptions.ToolBusException;
013 import toolbus.parsercup.PositionInformation;
014 import aterm.ATerm;
015
016 /**
017 * IfElse is the abstract syntax operator for the if-then-else-fi operator in Tscripts. It is
018 * compiled away and does not exist during execution.
019 */
020 public class IfElse extends ProcessExpression{
021 private final ATerm test;
022 private final ProcessExpression left;
023 private final ProcessExpression right;
024 private Environment env;
025
026 public IfElse(ATerm test, ProcessExpression Pthen, ProcessExpression Pelse, TBTermFactory tbfactory, PositionInformation posInfo){
027 super(tbfactory, posInfo);
028 this.test = test;
029 this.left = Pthen;
030 this.right = Pelse;
031 }
032
033 protected ProcessExpression copy(){
034 return new IfElse(test, left.copy(), right.copy(), tbfactory, getPosInfo());
035 }
036
037 protected void computeFirst(){
038 left.computeFirst();
039 right.computeFirst();
040 setFirst(left.getFirst().union(right.getFirst()));
041 }
042
043 protected void replaceFormals(Environment e) throws ToolBusException{
044 env = e;
045 left.replaceFormals(env);
046 right.replaceFormals(env);
047 }
048
049 protected void compile(ProcessInstance P, Stack<String> calls, State follows) throws ToolBusException{
050 left.compile(P, calls, follows);
051 left.getFirst().setTest(test, env);
052 right.compile(P, calls, follows);
053
054 ATerm notTest = test.getFactory().make("not(<term>)", test);
055
056 right.getFirst().setTest(notTest, env);
057
058 setFollow(follows);
059 // System.err.println("rtest = " + rtest);
060 // System.err.println("notTest = " + notTest);
061 // System.err.println("env = " + env);
062 }
063
064 public AtomList getAtoms(){
065 return left.getAtoms().union(right.getAtoms());
066 }
067
068 public String toString(){
069 return "IfElse(" + test + ", " + left + ", " + right + ")";
070 }
071 }