001 /** 002 * @author paulk, Jul 21, 2002 003 */ 004 005 package toolbus.process; 006 007 import toolbus.Functions; 008 import toolbus.TBTermFactory; 009 import toolbus.TBTermVar; 010 import toolbus.exceptions.ToolBusError; 011 import toolbus.parsercup.PositionInformation; 012 import aterm.ATerm; 013 import aterm.ATermList; 014 015 /** 016 * ProcessDefinition describes the name, formal parameters and body of a defined process. 017 */ 018 public class ProcessDefinition{ 019 private final String name; 020 private final ATermList formals; 021 private final ProcessExpression PE; 022 private final TBTermFactory tbfactory; 023 private final PositionInformation posInfo; 024 025 public ProcessDefinition(String name, ATermList formals, ProcessExpression PE, TBTermFactory tbfactory, PositionInformation posInfo){ 026 this.name = name; 027 this.formals = formals; 028 this.PE = PE; 029 this.tbfactory = tbfactory; 030 this.posInfo = posInfo; 031 } 032 033 public PositionInformation getPosInfo(){ 034 return posInfo; 035 } 036 037 public String getName(){ 038 return name; 039 } 040 041 public ATermList getFormals(){ 042 return formals; 043 } 044 045 public int getNumberOfFormals(){ 046 return formals.getLength(); 047 } 048 049 public ProcessExpression getOriginalProcessExpression(){ 050 return PE; 051 } 052 053 public ProcessExpression getProcessExpression(ATermList actuals) throws ToolBusError{ 054 if(actuals.getLength() != formals.getLength()) throw new ToolBusError("process " + name + ": mismatch between formals " + formals + " and actuals " + actuals); 055 056 for(int i = 0; i < actuals.getLength(); i++){ 057 TBTermVar formal = (TBTermVar) formals.getChildAt(i); 058 ATerm actual = (ATerm) actuals.getChildAt(i); 059 if(tbfactory.isResultVar(formal) && !tbfactory.isResultVar(actual)) throw new ToolBusError("process " + name + ": mismatch between formal " + formal + " and actual " + actual); 060 061 if(!Functions.compatibleTypes(formal, actual)) throw new ToolBusError("argument #" + (i + 1) + " of process " + name + " should have type " + formal.getVarType() + " instead of " + actual); 062 } 063 return PE.copy(); 064 } 065 066 public String toString(){ 067 return "ProcessDefinition(" + name + ", " + formals + ", " + PE + ")"; 068 } 069 }