001    /**
002     * @author paulk, Jul 20, 2002
003     */
004    package toolbus.atom;
005    
006    import java.util.Stack;
007    
008    import toolbus.Functions;
009    import toolbus.State;
010    import toolbus.TBTermFactory;
011    import toolbus.TBTermVar;
012    import toolbus.environment.Environment;
013    import toolbus.exceptions.ToolBusException;
014    import toolbus.exceptions.ToolBusExecutionException;
015    import toolbus.parsercup.PositionInformation;
016    import toolbus.process.ProcessExpression;
017    import toolbus.process.ProcessInstance;
018    import aterm.ATerm;
019    
020    public class Assign extends Atom{
021            private final Ref var;
022            private final Ref exp;
023            
024            public Assign(ATerm v, ATerm e, TBTermFactory tbfactory, PositionInformation posInfo){
025                    super(tbfactory, posInfo);
026                    
027                    var = new Ref(v);
028                    exp = new Ref(e);
029                    setAtomArgs(new Ref[]{var, exp});
030            }
031            
032            public ProcessExpression copy(){
033                    Atom a = new Assign(var.value, exp.value, tbfactory, getPosInfo());
034                    a.copyAtomAttributes(this);
035                    return a;
036            }
037            
038            public void replaceFormals(Environment env) throws ToolBusException{
039                    // env = env.copy();
040                    setEnv(env);
041                    // System.err.println("Assign.replaceformals: " + var.value + "; " + exp.value);
042                    // System.err.println("env = " + env);
043                    env.setAssignable((TBTermVar) var.value);
044                    
045                    // System.err.println("Assign.replaceformals: " + var.value);
046                    var.value = tbfactory.replaceAssignableVar((TBTermVar) var.value, env);
047                    
048                    exp.value = tbfactory.replaceFormals(exp.value, env);
049                    // System.err.println("Assign.replaceformals: => " + var.value + "; " + exp.value);
050                    // System.err.println("Assign.replaceformals: env = "+env);;
051            }
052            
053            public void compile(ProcessInstance P, Stack<String> calls, State follow) throws ToolBusException{
054                    super.compile(P, calls, follow);
055                    // System.err.println("Assign.compile: " + this + " env = " + getEnv());
056                    if(!tbfactory.isAnyVar(var.value)) throw new ToolBusExecutionException("Left-hand side of := should be a variable.", getPosInfo());
057                    ATerm vartype = ((TBTermVar) var.value).getVarType();
058                    
059                    // System.err.println(this + "; var = " + var +"; vartype = " + vartype);
060                    
061                    // System.err.println("Assign: " + env);
062                    ATerm exptype = Functions.checkType(exp.value, getEnv(), false);
063                    // System.err.println(this + "; exp = " + exp.value + "; exptype = " + exptype);
064                    
065                    if(!Functions.compatibleTypes(vartype, exptype)){// lhs = term!
066                            throw new ToolBusExecutionException("Wrong types in assignment "+this+"; "+vartype+" := "+exptype, getPosInfo());
067                    }
068            }
069            
070            public boolean execute() throws ToolBusException{
071                    if(!isEnabled()) return false;
072                    ProcessInstance p = getProcess();
073                    Environment env = getEnv();
074                    // System.err.println("Atom.execute: "+ this);
075                    // System.err.println("Assign: " + env);
076                    
077                    ATerm newval = Functions.eval(exp.value, p, env);
078                    
079                    // System.err.println("Assign.execute: " + exp.value + "; " + newval);
080                    env.assignVar((TBTermVar) var.value, newval);
081                    // System.err.println("Assign: " + env);
082                    // System.err.println("Assign: " + getFollow());
083                    return true;
084            }
085    }