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 DeclarationSequenceMiniNode extends AbstractMiniNode
018 //////////////////////////////////////////////////////////////////////
019 //////////////////////////////////////////////////////////////////////
020 {
021
022 protected List declarationMiniNodeList;
023
024 //////////////////////////////////////////////////////////////////////
025 //////////////////////////////////////////////////////////////////////
026
027 /*********************************************************************
028 * @throws SemanticErrorException
029 * If there duplicate names are declared.
030 *********************************************************************/
031 public DeclarationSequenceMiniNode (
032 DeclarationSequenceMiniNode declarationSequenceMiniNode,
033 DeclarationMiniNode declarationMiniNode )
034 throws SemanticErrorException
035 //////////////////////////////////////////////////////////////////////
036 {
037 if ( declarationSequenceMiniNode != null )
038 {
039 declarationMiniNodeList
040 = declarationSequenceMiniNode.declarationMiniNodeList;
041 }
042 else
043 {
044 declarationMiniNodeList = new LinkedList ( );
045 }
046
047 declarationMiniNodeList.add ( declarationMiniNode );
048
049 checkDuplicates ( );
050
051 }
052
053 /*********************************************************************
054 * @throws SemanticErrorException
055 * If there duplicate names are declared.
056 *********************************************************************/
057 public DeclarationSequenceMiniNode (
058 DeclarationMiniNode declarationMiniNode )
059 throws SemanticErrorException
060 //////////////////////////////////////////////////////////////////////
061 {
062 this ( null, declarationMiniNode );
063 }
064
065 /*********************************************************************
066 * @throws SemanticErrorException
067 * If there duplicate names are declared.
068 *********************************************************************/
069 protected void checkDuplicates ( ) throws SemanticErrorException
070 //////////////////////////////////////////////////////////////////////
071 {
072 boolean hasDuplicates = false;
073
074 Set nameSet = new HashSet ( );
075
076 Iterator i = declarationMiniNodeList.iterator ( );
077 while ( i.hasNext ( ) )
078 {
079 NameSequenceMiniNode nameSequenceMiniNode
080 = ( ( DeclarationMiniNode ) i.next ( )
081 ).getNameSequenceMiniNode ( );
082
083 Iterator j
084 = nameSequenceMiniNode.getNameMiniNodeList ( ).iterator ( );
085
086 while ( j.hasNext ( ) )
087 {
088 NameMiniNode nameMiniNode = ( NameMiniNode ) j.next ( );
089
090 String name = nameMiniNode.getName ( );
091
092 if ( nameSet.contains ( name ) )
093 {
094 hasDuplicates = true;
095 break;
096 }
097 else
098 {
099 nameSet.add ( name );
100 }
101 }
102 }
103
104 if ( hasDuplicates )
105 {
106 throw new IllegalArgumentException (
107 "duplicate names declared" );
108 }
109 }
110
111 //////////////////////////////////////////////////////////////////////
112 // Access methods
113 //////////////////////////////////////////////////////////////////////
114
115 public List getDeclarationMiniNodeList ( )
116 //////////////////////////////////////////////////////////////////////
117 {
118 return declarationMiniNodeList;
119 }
120
121 public boolean declares ( NameMiniNode nameMiniNode )
122 //////////////////////////////////////////////////////////////////////
123 {
124 Iterator i = declarationMiniNodeList.iterator ( );
125
126 while ( i.hasNext ( ) )
127 {
128 DeclarationMiniNode declarationMiniNode
129 = ( DeclarationMiniNode ) i.next ( );
130
131 Iterator j = declarationMiniNode.getNameSequenceMiniNode (
132 ).getNameMiniNodeList ( ).iterator ( );
133
134 while ( j.hasNext ( ) )
135 {
136 if ( nameMiniNode.equals ( j.next ( ) ) )
137 {
138 return true;
139 }
140 }
141 }
142
143 return false;
144 }
145
146 //////////////////////////////////////////////////////////////////////
147 // MiniNode interface methods
148 //////////////////////////////////////////////////////////////////////
149
150 public void generate ( MiniNodeCodeVisitor miniNodeCodeVisitor )
151 //////////////////////////////////////////////////////////////////////
152 {
153 miniNodeCodeVisitor.generateDeclarationSequence ( this );
154 }
155
156 public void checkSemantics ( Stack parentMiniNodeStack )
157 throws SemanticErrorException
158 //////////////////////////////////////////////////////////////////////
159 {
160 parentMiniNodeStack.push ( this );
161
162 MiniNodeLib.checkSemantics (
163 declarationMiniNodeList, parentMiniNodeStack );
164
165 parentMiniNodeStack.pop ( );
166 }
167
168 //////////////////////////////////////////////////////////////////////
169 //////////////////////////////////////////////////////////////////////
170 }