import java.util.Hashtable;
import java.util.Vector;
import Jakarta.util.FixDosOutputStream;
import java.io.*;
// stateInfo is instantiated once per state declaration
class stateInfo extends contInfo {
public String name; // name of state
public boolean nested_state; // is state nested?
public String nested_var; // nested variable name
public AST_Stmt exit_action_ast; // exit action
public AST_Stmt enter_action_ast; // enter action
public AST_Stmt prepare_action_ast; // prepare action
public String branches_mth_name; // branches method name
public String delivery_action; // delivery action
public AST_Stmt otherwise_action_ast; // ast of action
public AstNode alloc_expr_ast; // for nested SMs
public stateInfo( String name, boolean nested ) {
inherited = false;
this.name = name;
nested_state = nested;
nested_var = "nested_" + name;
String nested_stuff = nested ?
nested_var + ".delivery(" + kernelConstants.globals().sm4vars.Sm.argdecl +
"); if (!" + nested_var + ".atStop()) return; "
: "";
branches_mth_name = name + "_branches";
exit_action_ast = AST_Stmt.MakeAST( ";" );
enter_action_ast = AST_Stmt.MakeAST( ";" );
prepare_action_ast = AST_Stmt.MakeAST( ";" );
delivery_action = "\n" +
" if (current_state == " + name + ") { " + nested_stuff +
name + "_prepare(" + kernelConstants.globals().sm4vars.Sm.argdecl + "); " +
branches_mth_name + "(" + kernelConstants.globals().sm4vars.Sm.argdecl + "); return; }";
otherwise_action_ast = AST_Stmt.MakeAST( "otherwise_Default(" + kernelConstants.globals().sm4vars.Sm.argdecl +
");" );
alloc_expr_ast = null;
}
// used for serialization - throw away anything that is not needed.
// this object is serialized, and is read in during the processing
// of parent state machines in inheritance hierarchies. Not all
// information is needed -- most is thrown away.
// REMEMBER: if an AST is to be saved/serialized, it must be
// Detached from the tree
public void truncate() {
inherited = true;
// leave name
exit_action_ast = null;
enter_action_ast = null;
prepare_action_ast = null;
// leave branches_mth_name
// leave delivery_action
otherwise_action_ast = null;
alloc_expr_ast = null;
// leave nested_state
// leave nested_var
}
public boolean equals( Object x ) {
if ( x instanceof stateInfo )
return ( ( stateInfo ) x ).name.equals( name );
return false;
}
static stateInfo verifyStateName( String sname, String which,
AstTokenInterface t ) {
stateInfo s;
SmIterator i = kernelConstants.globals().sm4vars.Sm.StateCont.iterator();
for ( s = ( stateInfo ) i.firstObj();
s != null;
s = ( stateInfo ) i.nextObj() ) {
if ( s.name.equals( sname ) )
return s;
}
AstNode.fatalError( t, Utility.SourceName()+
"Unrecognized state " + sname + " in " + which );
return /* should never get here */ null;
}
// only for debugging
public void print() {
System.out.println( " inherited: " + inherited );
System.out.println( " State Name " + name + " ast: " + name );
System.out.println( " Exit action: " + exit_action_ast );
System.out.println( " Enter action: " + enter_action_ast );
System.out.println( " Prepare action: " + prepare_action_ast );
System.out.println( " Branches method name " + branches_mth_name );
System.out.println( " delivery action: " + delivery_action );
System.out.println( " otherwise action: " + otherwise_action_ast );
System.out.println( " allocation expr: " + alloc_expr_ast );
System.out.println( " nested_state: " + nested_state );
System.out.println( " nested_var: " + nested_var );
System.out.println();
}
public String branches_method() {
transInfo e;
String result = "";
String s = "";
String terminate = "";
SmIterator i = kernelConstants.globals().sm4vars.Sm.TransCont.iterator();
for ( e = ( transInfo ) i.firstObj();
e != null;
e = ( transInfo ) i.nextObj() ) {
// if an transition begins at the given state...
if ( e.start.equals( name ) && e.branches!=null )
s = s + e.branches;
}
String args = kernelConstants.globals().sm4vars.Sm.argdecl;
if ( kernelConstants.globals().sm4vars.Sm.superSm_name == null || !inherited )
terminate = "if (starBranches( " + args + " ) ) " +
name + "_otherwise( " + args + " );";
else
terminate = "super." + branches_mth_name +
"( " + args + ");";
// return null if the state isn't new (i.e., it is inherited)
// and no new branches have been defined
if ( inherited && s.equals( "" ) )
return "";
return
"\n\n // methods for state " + name + "\n\n" +
" void " + branches_mth_name + "( " + kernelConstants.globals().sm4vars.Sm.pardecl + " ) {\n" + s +
" " + terminate + "\n" +
" }";
}
}