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 }