001    package toolbus.process;
002    
003    import java.util.Iterator;
004    import java.util.Stack;
005    import toolbus.AtomList;
006    import toolbus.State;
007    import toolbus.TBTermFactory;
008    import toolbus.atom.Atom;
009    import toolbus.environment.Environment;
010    import toolbus.exceptions.ToolBusException;
011    import toolbus.parsercup.PositionInformation;
012    
013    /**
014     * Disrupt is the abstract syntax operator for the disrupt operator (>>) in Tscripts. It is compiled
015     * away and does not exist during execution.
016     */
017    public class Disrupt extends ProcessExpression{
018            private ProcessExpression left;
019            private ProcessExpression right;
020            
021            public Disrupt(ProcessExpression left, ProcessExpression right, TBTermFactory tbfactory, PositionInformation posInfo){
022                    super(tbfactory, posInfo);
023                    this.left = left;
024                    this.right = right;
025            }
026            
027            protected ProcessExpression copy(){
028                    return new Disrupt(left, right, tbfactory, getPosInfo());
029            }
030            
031            protected void computeFirst(){
032                    left.computeFirst();
033                    right.computeFirst();
034                    setFirst(left.getFirst().union(right.getFirst()));
035            }
036            
037            protected void replaceFormals(Environment env) throws ToolBusException{
038                    left.replaceFormals(env);
039                    right.replaceFormals(env);
040            }
041            
042            protected void compile(ProcessInstance P, Stack<String> calls, State follow) throws ToolBusException{
043                    left.compile(P, calls, follow);
044                    right.compile(P, calls, follow);
045                    State rightFirst = right.getFirst();
046                    setFollow(follow);
047                    
048                    Iterator<Atom> atomSetIterator = left.getAtoms().iterator();
049                    while(atomSetIterator.hasNext()){
050                            Atom at = atomSetIterator.next();
051                            
052                            if(at.getFollow().size() != 0){
053                                    at.addToFollow(rightFirst);
054                            }
055                    }
056            }
057            
058            public AtomList getAtoms(){
059                    return left.getAtoms().union(right.getAtoms());
060            }
061    }