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-26
015         *********************************************************************/
016    
017         public class  ParameterSequenceMiniNode extends AbstractMiniNode
018         //////////////////////////////////////////////////////////////////////
019         //////////////////////////////////////////////////////////////////////
020         {
021    
022         protected NameSequenceMiniNode  nameSequenceMiniNode;
023    
024         //////////////////////////////////////////////////////////////////////
025         //////////////////////////////////////////////////////////////////////
026    
027         /*********************************************************************
028         * @throws  SemanticErrorException
029         *   If there are duplicate parameter names.
030         *********************************************************************/
031         public  ParameterSequenceMiniNode (
032           NameSequenceMiniNode  nameSequenceMiniNode )
033           throws SemanticErrorException
034         //////////////////////////////////////////////////////////////////////
035         {
036           this.nameSequenceMiniNode = nameSequenceMiniNode;
037    
038           List  nameMiniNodeList
039             = nameSequenceMiniNode.getNameMiniNodeList ( );
040    
041           boolean  hasDuplicates = false;
042    
043           Set  nameSet = new HashSet ( );
044    
045           Iterator  i = nameMiniNodeList.iterator ( );
046           while ( i.hasNext ( ) )
047           {
048             NameMiniNode  nameMiniNode = ( NameMiniNode ) i.next ( );
049    
050             String  name = nameMiniNode.getName ( );
051    
052             if ( nameSet.contains ( name ) )
053             {
054               hasDuplicates = true;
055               break;
056             }
057             else
058             {
059               nameSet.add ( name );
060             }
061           }
062    
063           if ( hasDuplicates )
064           {
065             throw new SemanticErrorException (
066               "duplicated parameter names" );
067           }
068         }
069    
070         //////////////////////////////////////////////////////////////////////
071         // Access methods
072         //////////////////////////////////////////////////////////////////////
073    
074         public NameSequenceMiniNode  getNameSequenceMiniNode ( )
075         //////////////////////////////////////////////////////////////////////
076         {
077           return nameSequenceMiniNode;
078         }
079    
080         public boolean  declares ( NameMiniNode  nameMiniNode )
081         //////////////////////////////////////////////////////////////////////
082         {
083           return nameSequenceMiniNode.contains ( nameMiniNode );
084         }
085    
086         public int  size ( )
087         //////////////////////////////////////////////////////////////////////
088         {
089           return nameSequenceMiniNode.size ( );
090         }
091    
092         //////////////////////////////////////////////////////////////////////
093         // MiniNode interface methods
094         //////////////////////////////////////////////////////////////////////
095    
096         public void  generate ( MiniNodeCodeVisitor  miniNodeCodeVisitor )
097         //////////////////////////////////////////////////////////////////////
098         {
099           miniNodeCodeVisitor.generateParameterSequence ( this );
100         }
101         
102         public void  checkSemantics ( Stack  parentMiniNodeStack )
103           throws SemanticErrorException
104         //////////////////////////////////////////////////////////////////////
105         {
106           parentMiniNodeStack.push ( this );
107    
108           nameSequenceMiniNode.checkSemantics ( parentMiniNodeStack );
109    
110           parentMiniNodeStack.pop ( );
111         }
112    
113         //////////////////////////////////////////////////////////////////////
114         //////////////////////////////////////////////////////////////////////
115         }