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.ATermList;
015    
016    public class LetDefinition extends ProcessExpression{
017            private final ATermList locals;
018            private final ProcessExpression PEinit;
019            private final ProcessExpression PE;
020            private Environment env;
021            
022            public LetDefinition(ATermList locals, ProcessExpression PE, TBTermFactory tbfactory, PositionInformation posInfo){
023                    super(tbfactory, posInfo);
024                    this.locals = locals;
025                    PEinit = PE;
026                    this.PE = PE;
027            }
028            
029            protected ProcessExpression copy(){
030                    return new LetDefinition(locals, PEinit.copy(), tbfactory, getPosInfo());
031            }
032            
033            protected void computeFirst(){
034                    PE.computeFirst();
035            }
036            
037            protected void replaceFormals(Environment e) throws ToolBusException{
038                    env = e.copy();
039                    env.introduceVars(locals);
040                    PE.replaceFormals(env);
041                    // env.removeBindings(formals);
042            }
043            
044            protected void compile(ProcessInstance P, Stack<String> calls, State follows) throws ToolBusException{
045                    // System.err.println("LetDef.compile: " + env);
046                    env.introduceVars(locals);
047                    PE.compile(P, calls, follows);
048                    env.removeBindings(locals);
049                    // System.err.println("LetDef resulting env: " + env);
050            }
051            
052            public State getFirst(){
053                    return PE.getFirst();
054            }
055            
056            public State getFollow(){
057                    return PE.getFollow();
058            }
059            
060            public AtomList getAtoms(){
061                    return PE.getAtoms();
062            }
063            
064            public String toString(){
065                    return "LetDefinition(" + locals + ", " + PE + ")";
066            }
067    }