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 }