public class UmodSmExt {
// refines statemachine qname implements smbody reduces to
// statemachine qname extends stub.qname implements smbody
public void reduce2java( AstProperties props ) {
// Step 1: before we reduce a UmodSmExt, we have to make sure
// that there is a DelivClause present -- otherwise
// we can't proceed with the reduction.
// arg[2] -- SmClassBody
// arg[0].arg[0] -- RootClause
if (arg[2].arg[0].arg[0] == null)
AstNode.fatalError( "Refinement of State Machine missing "
+ "Delivery_parameters declaration" );
// Step 2: get the name of the state machine
String name = arg[0].tok[0].tokenName();
String decl = "State_machine " + name +
" extends " + kernelConstants.stub + "." + name +
" {} ";
// Step 3: now manufacture a parse tree for the above
// declaration, remembering that the root of the
// tree is really a list. the first element on
// the list is of type UmodSmDecl
// c.arg[0].arg[0] is of type ModTypeDecl
// " ".arg[1] is of type UmodSmDecl
AST_Class c = AST_Class.MakeAST( decl );
UmodSmDecl umsd = (UmodSmDecl) c.arg[0].arg[0].arg[1];
// Step 4: finish constructing the tree and reduce it
umsd.arg[2] = arg[1]; // implements clause
umsd.arg[3] = arg[2]; // SmClassBody
umsd.reduce2java( props );
}
}