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 ProcedureDeclarationMiniNode extends AbstractMiniNode
018 implements DeclarationMiniNode
019 //////////////////////////////////////////////////////////////////////
020 //////////////////////////////////////////////////////////////////////
021 {
022
023 protected NameMiniNode nameMiniNode;
024 protected ParameterSequenceMiniNode parameterSequenceMiniNode;
025 protected BlockMiniNode blockMiniNode;
026
027 protected Boolean containsNested;
028
029 //////////////////////////////////////////////////////////////////////
030 //////////////////////////////////////////////////////////////////////
031
032 public ProcedureDeclarationMiniNode (
033 NameMiniNode nameMiniNode,
034 ParameterSequenceMiniNode parameterSequenceMiniNode,
035 BlockMiniNode blockMiniNode )
036 //////////////////////////////////////////////////////////////////////
037 {
038 this.nameMiniNode = nameMiniNode;
039 this.parameterSequenceMiniNode = parameterSequenceMiniNode;
040 this.blockMiniNode = blockMiniNode;
041 }
042
043 //////////////////////////////////////////////////////////////////////
044 // Access methods
045 //////////////////////////////////////////////////////////////////////
046
047 public NameMiniNode getNameMiniNode ( ) { return nameMiniNode; }
048
049 public ParameterSequenceMiniNode getParameterSequenceMiniNode ( )
050 //////////////////////////////////////////////////////////////////////
051 {
052 return parameterSequenceMiniNode;
053 }
054
055 public BlockMiniNode getBlockMiniNode ( ) { return blockMiniNode; }
056
057 public Boolean containsNested ( ) { return containsNested; }
058
059 public NameSequenceMiniNode getNameSequenceMiniNode ( )
060 //////////////////////////////////////////////////////////////////////
061 {
062 return new NameSequenceMiniNode ( nameMiniNode );
063 }
064
065 //////////////////////////////////////////////////////////////////////
066 // MiniNode interface methods
067 //////////////////////////////////////////////////////////////////////
068
069 public void generate ( MiniNodeCodeVisitor miniNodeCodeVisitor )
070 //////////////////////////////////////////////////////////////////////
071 {
072 miniNodeCodeVisitor.generateProcedureDeclaration ( this );
073 }
074
075 public void checkSemantics ( Stack parentMiniNodeStack )
076 throws SemanticErrorException
077 //////////////////////////////////////////////////////////////////////
078 {
079 DeclarationSequenceMiniNode declarationSequenceMiniNode
080 = blockMiniNode.getDeclarationSequenceMiniNode ( );
081
082 boolean containsNested = false;
083
084 if ( declarationSequenceMiniNode != null )
085 {
086 List declarationMiniNodeList
087 = declarationSequenceMiniNode.getDeclarationMiniNodeList ( );
088
089 Iterator i = declarationMiniNodeList.iterator ( );
090
091 while ( i.hasNext ( ) )
092 {
093 if ( i.next ( ) instanceof ProcedureDeclarationMiniNode )
094 {
095 containsNested = true;
096 break;
097 }
098 }
099 }
100
101 this.containsNested = new Boolean ( containsNested );
102
103 parentMiniNodeStack.push ( this );
104
105 if ( blockMiniNode != null )
106 {
107 blockMiniNode.checkSemantics ( parentMiniNodeStack );
108 }
109
110 parentMiniNodeStack.pop ( );
111 }
112
113 //////////////////////////////////////////////////////////////////////
114 //////////////////////////////////////////////////////////////////////
115 }