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-25
015 *********************************************************************/
016
017 public class NameMiniNode
018 extends AbstractMiniNode implements ElementMiniNode
019 //////////////////////////////////////////////////////////////////////
020 //////////////////////////////////////////////////////////////////////
021 {
022
023 protected String name;
024
025 //////////////////////////////////////////////////////////////////////
026 //////////////////////////////////////////////////////////////////////
027
028 public NameMiniNode ( String name )
029 //////////////////////////////////////////////////////////////////////
030 {
031 this.name = name;
032 }
033
034 //////////////////////////////////////////////////////////////////////
035 //////////////////////////////////////////////////////////////////////
036
037 public String getName ( ) { return name; }
038
039 //////////////////////////////////////////////////////////////////////
040 // MiniNode interface methods
041 //////////////////////////////////////////////////////////////////////
042
043 public void generate ( MiniNodeCodeVisitor miniNodeCodeVisitor )
044 //////////////////////////////////////////////////////////////////////
045 {
046 miniNodeCodeVisitor.generateName ( this );
047 }
048
049 public void checkSemantics ( Stack parentMiniNodeStack )
050 throws SemanticErrorException
051 //////////////////////////////////////////////////////////////////////
052 {
053 int size = parentMiniNodeStack.size ( );
054
055 boolean wasDeclared = false;
056
057 for ( int i = size - 1; i >= 0; i-- )
058 {
059 MiniNode miniNode = ( MiniNode ) parentMiniNodeStack.get ( i );
060
061 if ( miniNode instanceof BlockMiniNode )
062 {
063 DeclarationSequenceMiniNode declarationSequenceMiniNode
064 = ( ( BlockMiniNode ) miniNode
065 ).getDeclarationSequenceMiniNode ( );
066
067 if ( ( declarationSequenceMiniNode != null )
068 && declarationSequenceMiniNode.declares ( this ) )
069 {
070 wasDeclared = true;
071 break;
072 }
073 }
074 else if ( miniNode instanceof ProcedureDeclarationMiniNode )
075 {
076 ParameterSequenceMiniNode parameterSequenceMiniNode
077 = ( ( ProcedureDeclarationMiniNode ) miniNode
078 ).getParameterSequenceMiniNode ( );
079
080 if ( ( parameterSequenceMiniNode != null )
081 && parameterSequenceMiniNode.declares ( this ) )
082 {
083 wasDeclared = true;
084 break;
085 }
086 }
087 }
088
089 if ( !wasDeclared )
090 {
091 throw new SemanticErrorException ( "undeclared name" );
092 }
093 }
094
095 //////////////////////////////////////////////////////////////////////
096 //////////////////////////////////////////////////////////////////////
097
098 public boolean equals ( Object other )
099 //////////////////////////////////////////////////////////////////////
100 {
101 if ( other == null ) return false;
102
103 if ( !getClass ( ).equals ( other.getClass ( ) ) ) return false;
104
105 return name.equals ( ( ( NameMiniNode ) other ).name );
106 }
107
108 public int hashCode ( )
109 //////////////////////////////////////////////////////////////////////
110 {
111 return name.hashCode ( );
112 }
113
114 //////////////////////////////////////////////////////////////////////
115 //////////////////////////////////////////////////////////////////////
116 }