import java.util.*; import Jakarta.util.FixDosOutputStream; import java.io.*; // ------------------ TypeName List Composition --------------- /** production: AST_TypeNameList<br> : TName ( "," TName )*<br> ;<br> TName<br> : AST_TypeName::TNClass<br> ;<br> <p> TypeNameList is a fairly involved production, much more complicated than previous productions. The idea is to assign a method called GetName to TName instances. We will follow the standard algorithm of walking the extension list and seeing if a TName instance belongs to the base list. If so, we remove the TName instance from the base list. When all is done, we concatenate what remains of the extension list to the base list.</p> <p> Now the complication comes when implementing the GetName method of TName objects, because GetName calls must be propagated through AST_Type name (which could be an AST_QualifiedName or PrimitiveType). Yuck.</p> <p> Note: eventually, the semantics of GetName will be GetQualifiedName where we take into account the full path name of an identifier. Right now, we're fudging this.</p> * @layer<preprocess> */ public class AST_TypeNameList { // this method is called only on base nodes. // returns true if TName x is on the given typename list private boolean findTName( TName x ) { AstCursor c = new AstCursor(); String xName = x.GetName(); for ( c.FirstElement( this ); c.MoreElement(); c.NextElement() ) { if ( ( ( TName ) ( c.node ) ).GetName().equals( xName ) ) return true; } return false; } /** compose base AST_TypeNameList with extension AST_TypeNameList * @layer<preprocess> */ public void compose( AstNode etree ) { AST_TypeNameList x = ( AST_TypeNameList ) etree; // Step 1: foreach element e of extension TypeNameList // see if e is already present on base TypeNameList list. // if so, delete it from the extension list AstCursor c = new AstCursor(); for ( c.FirstElement( x ); c.MoreElement(); c.NextElement() ) { if ( findTName( ( TName ) c.node ) ) c.Delete(); } // Step 2: now add the truncated TypeNameList to the base list this.add( x, "," ); } /** returns signature of AST_TypeNameList. format "type,type,type," * @layer<preprocess> */ public String signature() { String result = ""; AstCursor c = new AstCursor(); for ( c.FirstElement( this ); c.MoreElement(); c.NextElement() ) { result = result + ( ( TName ) c.node ).GetName() + ","; } return result; } }