001 package toolbus.process; 002 003 /** 004 * @author paulk 005 */ 006 import java.util.Stack; 007 import toolbus.AtomList; 008 import toolbus.State; 009 import toolbus.TBTermFactory; 010 import toolbus.environment.Environment; 011 import toolbus.exceptions.ToolBusException; 012 import toolbus.parsercup.PositionInformation; 013 014 /** 015 * Iteration implements the process expression P1 * P2. The current implementation does not handle 016 * the following case correctly: if Test1 then P1 * if Test2 then A . B . C fi else ... fi Problem: 017 * Test1 will be attached to A, but the first iteration of P1 may have modified local variables in 018 * such a way that Test1 has become false. We solve this in TscriptParser by prefixing every 019 * iteration with an extra tau so the test is always executed in an unmodified environment. So the 020 * above example becomes: if Test1 then tau. P1 * if Test2 then A . B . C fi else ... fi and Test1 021 * will be attached to tau (and is guaranteed to be still true when this branch is taken). 022 */ 023 public class Iteration extends ProcessExpression{ 024 private final ProcessExpression left; 025 private final ProcessExpression right; 026 027 public Iteration(ProcessExpression left, ProcessExpression right, TBTermFactory tbfactory, PositionInformation posInfo){ 028 super(tbfactory, posInfo); 029 this.left = left; 030 this.right = right; 031 } 032 033 protected ProcessExpression copy(){ 034 return new Iteration(left.copy(), right.copy(), tbfactory, getPosInfo()); 035 } 036 037 public String toString(){ 038 return "Iter(" + left.toString() + ", " + right.toString() + ")"; 039 } 040 041 protected void computeFirst(){ 042 left.computeFirst(); 043 right.computeFirst(); 044 setFirst(left.getFirst().union(right.getFirst())); 045 } 046 047 protected void compile(ProcessInstance P, Stack<String> calls, State follow) throws ToolBusException{ 048 left.compile(P, calls, getFirst()); 049 right.compile(P, calls, follow); 050 setFollow(follow); 051 } 052 053 protected void replaceFormals(Environment env) throws ToolBusException{ 054 left.replaceFormals(env); 055 right.replaceFormals(env); 056 } 057 058 public AtomList getAtoms(){ 059 return left.getAtoms().union(right.getAtoms()); 060 } 061 }