import java.util.Hashtable; import java.util.Vector; import Jakarta.util.FixDosOutputStream; import java.io.*; // transInfo is instantiated per transition declaration. class transInfo extends contInfo { public String name; // name of transition public String start; // name of start state public String end; // name of end state public AST_Exp condition_ast; // transition condition public AST_Stmt action_ast; // transition action public String branches; // branch code public boolean defined_in_file; // trans decl in current file? public transInfo( String name, String startName, String endName ) { this.name = name; start = startName; end = endName; condition_ast = null; action_ast = null; String whichExit = startName.equals( "*" ) ? "dispatch.exit(" : startName+"_exit("; String whichReturn = (startName.equals( "*" )? "return false; " : "return; ") + "}\n"; branches = " if ( " + name + "_test(" + kernelConstants.globals().sm4vars.Sm.argdecl + ") )" + " { " + whichExit + kernelConstants.globals().sm4vars.Sm.argdecl + "); " + name + "_action(" + kernelConstants.globals().sm4vars.Sm.argdecl + "); " + endName + "_enter(" + kernelConstants.globals().sm4vars.Sm.argdecl + "); " + whichReturn; inherited = false; defined_in_file= true; } // 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 // leave start // leave end condition_ast = null; action_ast = null; // leave action_method_name if ( !start.equals( "*" ) ) // leave branches as is if from * branches = null; defined_in_file = false; } // only for debugging public void print() { System.out.println( " Transition name : " + name + " ast " + name ); System.out.println( " start("+start+") end("+end+")" ); System.out.println( " Condition: "+condition_ast ); System.out.println( " Action: "+action_ast ); System.out.println( " Branches: "+branches ); System.out.println( " Inherited: " + inherited ); System.out.println( " Defined-in-file: " + defined_in_file ); System.out.println(); } public boolean equals( Object x ) { if ( x instanceof transInfo ) return ( ( transInfo ) x ).name.equals( name ); return false; } static transInfo verifyTransName( String ename, String which, AstTokenInterface t ) { transInfo e; SmIterator i = kernelConstants.globals().sm4vars.Sm.TransCont.iterator(); for ( e = ( transInfo ) i.firstObj(); e != null; e = ( transInfo ) i.nextObj() ) { if ( e.name.equals( ename ) ) return e; } AstNode.fatalError( t, Utility.SourceName()+ "Unrecognized transition " + ename + " in " + which ); return /* should never get here */ null; } }