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 }