import java.util.*;
import java.io.*;
public class UmodSmExt {
public void compose( AstNode etree ) {
// Step 1: do standard checking. etree is of type UmodSmExt
// and remember the names of the base and extension
// and that we're starting with an extension.
if ( ! ( etree instanceof UmodSmExt ) )
AstNode.fatalError( tok[0], "Extension of state machine is not of type UmodSmExt" );
UmodSmExt e = ( UmodSmExt ) etree;
kernelConstants.globals().compclass.isBaseAClass = false;
String bname = UmodSmDecl.bname = arg[0].tok[0].tokenName();
String ename = UmodSmDecl.ename = e.arg[0].tok[0].tokenName();
if ( !bname.equals( ename ) )
AstNode.fatalError( tok[0], "trying to compose state machines with different names: "
+ bname + " " + ename );
// Step 2: Make sure that there is no root clause in either tree
if ( arg[2].arg[0].arg[0] != null )
AstNode.error( tok[0], "state machine extension " + bname + " in " +
getSource() + " should not have " +
"Delivery_parameters and Unrecognizable_states clauses" );
if ( e.arg[2].arg[0].arg[0] != null )
AstNode.error( tok[0], "state machine extension " + ename +
" in " + e.getSource() + " should not have " +
"Delivery_parameters and Unrecognizable_states clauses" );
// Step 3: now compose implements clause, and then class body
arg[1].compose( e.arg[1] );
arg[2].compose( e.arg[2] );
}
}