001         package com.croftsoft.apps.compiler.mini.node;
002    
003         import java.util.*;
004    
005         /*********************************************************************
006         * Parse tree node for the Mini programming language.
007         *
008         * @see
009         *   MiniNode
010         *
011         * @author
012         *   <A HREF="http://www.alumni.caltech.edu/~croft/">David W. Croft</A>
013         * @version
014         *   1999-04-27
015         *********************************************************************/
016    
017         public class  ProcedureDeclarationMiniNode extends AbstractMiniNode
018           implements DeclarationMiniNode
019         //////////////////////////////////////////////////////////////////////
020         //////////////////////////////////////////////////////////////////////
021         {
022    
023         protected NameMiniNode               nameMiniNode;
024         protected ParameterSequenceMiniNode  parameterSequenceMiniNode;
025         protected BlockMiniNode              blockMiniNode;
026    
027         protected Boolean                    containsNested;
028    
029         //////////////////////////////////////////////////////////////////////
030         //////////////////////////////////////////////////////////////////////
031    
032         public  ProcedureDeclarationMiniNode (
033           NameMiniNode               nameMiniNode,
034           ParameterSequenceMiniNode  parameterSequenceMiniNode,
035           BlockMiniNode              blockMiniNode )
036         //////////////////////////////////////////////////////////////////////
037         {
038           this.nameMiniNode              = nameMiniNode;
039           this.parameterSequenceMiniNode = parameterSequenceMiniNode;
040           this.blockMiniNode             = blockMiniNode;
041         }
042    
043         //////////////////////////////////////////////////////////////////////
044         // Access methods
045         //////////////////////////////////////////////////////////////////////
046    
047         public NameMiniNode  getNameMiniNode ( ) { return nameMiniNode; }
048    
049         public ParameterSequenceMiniNode  getParameterSequenceMiniNode ( )
050         //////////////////////////////////////////////////////////////////////
051         {
052           return parameterSequenceMiniNode;
053         }
054    
055         public BlockMiniNode  getBlockMiniNode ( ) { return blockMiniNode; }
056    
057         public Boolean  containsNested ( ) { return containsNested; }
058    
059         public NameSequenceMiniNode  getNameSequenceMiniNode ( )
060         //////////////////////////////////////////////////////////////////////
061         {
062           return new NameSequenceMiniNode ( nameMiniNode );
063         }
064    
065         //////////////////////////////////////////////////////////////////////
066         // MiniNode interface methods
067         //////////////////////////////////////////////////////////////////////
068    
069         public void  generate ( MiniNodeCodeVisitor  miniNodeCodeVisitor )
070         //////////////////////////////////////////////////////////////////////
071         {
072           miniNodeCodeVisitor.generateProcedureDeclaration ( this );
073         }
074         
075         public void  checkSemantics ( Stack  parentMiniNodeStack )
076           throws SemanticErrorException
077         //////////////////////////////////////////////////////////////////////
078         {
079           DeclarationSequenceMiniNode  declarationSequenceMiniNode
080             = blockMiniNode.getDeclarationSequenceMiniNode ( );
081    
082           boolean  containsNested = false;
083    
084           if ( declarationSequenceMiniNode != null )
085           {
086             List  declarationMiniNodeList
087               = declarationSequenceMiniNode.getDeclarationMiniNodeList ( );
088    
089             Iterator  i = declarationMiniNodeList.iterator ( );
090    
091             while ( i.hasNext ( ) )
092             {
093               if ( i.next ( ) instanceof ProcedureDeclarationMiniNode )
094               {
095                 containsNested = true;
096                 break;
097               }
098             }
099           }
100    
101           this.containsNested = new Boolean ( containsNested );
102    
103           parentMiniNodeStack.push ( this );
104    
105           if ( blockMiniNode != null )
106           {
107             blockMiniNode.checkSemantics ( parentMiniNodeStack );
108           }
109    
110           parentMiniNodeStack.pop ( );
111         }
112    
113         //////////////////////////////////////////////////////////////////////
114         //////////////////////////////////////////////////////////////////////
115         }