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  ConditionalStatementMiniNode extends AbstractMiniNode
018           implements StatementMiniNode
019         //////////////////////////////////////////////////////////////////////
020         //////////////////////////////////////////////////////////////////////
021         {
022    
023         protected ComparisonMiniNode         comparisonMiniNode;
024         protected StatementSequenceMiniNode  thenStatementSequenceMiniNode;
025         protected StatementSequenceMiniNode  elseStatementSequenceMiniNode;
026    
027         //////////////////////////////////////////////////////////////////////
028         //////////////////////////////////////////////////////////////////////
029    
030         public  ConditionalStatementMiniNode (
031           ComparisonMiniNode         comparisonMiniNode,
032           StatementSequenceMiniNode  thenStatementSequenceMiniNode,
033           StatementSequenceMiniNode  elseStatementSequenceMiniNode )
034         //////////////////////////////////////////////////////////////////////
035         {
036           this.comparisonMiniNode            = comparisonMiniNode;
037           this.thenStatementSequenceMiniNode = thenStatementSequenceMiniNode;
038           this.elseStatementSequenceMiniNode = elseStatementSequenceMiniNode;
039         }
040    
041         public  ConditionalStatementMiniNode (
042           ComparisonMiniNode         comparisonMiniNode,
043           StatementSequenceMiniNode  thenStatementSequenceMiniNode )
044         //////////////////////////////////////////////////////////////////////
045         {
046           this ( comparisonMiniNode, thenStatementSequenceMiniNode, null );
047         }
048    
049         //////////////////////////////////////////////////////////////////////
050         //////////////////////////////////////////////////////////////////////
051    
052         public ComparisonMiniNode  getComparisonMiniNode ( )
053         //////////////////////////////////////////////////////////////////////
054         {
055           return comparisonMiniNode;
056         }
057    
058         public StatementSequenceMiniNode  getThenStatementSequenceMiniNode ( )
059         //////////////////////////////////////////////////////////////////////
060         {
061           return thenStatementSequenceMiniNode;
062         }
063    
064         public StatementSequenceMiniNode  getElseStatementSequenceMiniNode ( )
065         //////////////////////////////////////////////////////////////////////
066         {
067           return elseStatementSequenceMiniNode;
068         }
069    
070         //////////////////////////////////////////////////////////////////////
071         // MiniNode interface methods
072         //////////////////////////////////////////////////////////////////////
073    
074         public void  generate ( MiniNodeCodeVisitor  miniNodeCodeVisitor )
075         //////////////////////////////////////////////////////////////////////
076         {
077           miniNodeCodeVisitor.generateConditionalStatement ( this );
078         }
079         
080         public void  checkSemantics ( Stack  parentMiniNodeStack )
081           throws SemanticErrorException
082         //////////////////////////////////////////////////////////////////////
083         {
084           parentMiniNodeStack.push ( this );
085    
086           comparisonMiniNode.checkSemantics ( parentMiniNodeStack );
087    
088           if ( thenStatementSequenceMiniNode != null )
089           {
090             thenStatementSequenceMiniNode.checkSemantics (
091               parentMiniNodeStack );
092           }
093    
094           if ( elseStatementSequenceMiniNode != null )
095           {
096             elseStatementSequenceMiniNode.checkSemantics (
097               parentMiniNodeStack );
098           }
099    
100           parentMiniNodeStack.pop ( );
101         }
102    
103         //////////////////////////////////////////////////////////////////////
104         //////////////////////////////////////////////////////////////////////
105         }