⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 procedurecallstatementmininode.java

📁 CroftSoft Code Library是一个开源的可移植的纯Java游戏库
💻 JAVA
字号:
     package com.croftsoft.apps.compiler.mini.node;

     import java.util.*;

     /*********************************************************************
     * Parse tree node for the Mini programming language.
     *
     * @see
     *   MiniNode
     *
     * @author
     *   <A HREF="http://www.alumni.caltech.edu/~croft/">David W. Croft</A>
     * @version
     *   1999-04-26
     *********************************************************************/

     public class  ProcedureCallStatementMiniNode extends AbstractMiniNode
       implements StatementMiniNode
     //////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////
     {

     protected NameMiniNode                nameMiniNode;
     protected ExpressionSequenceMiniNode  expressionSequenceMiniNode;

     protected Boolean                     callsNested;

     //////////////////////////////////////////////////////////////////////
     // Constructor methods
     //////////////////////////////////////////////////////////////////////

     public  ProcedureCallStatementMiniNode (
       NameMiniNode                nameMiniNode,
       ExpressionSequenceMiniNode  expressionSequenceMiniNode )
     //////////////////////////////////////////////////////////////////////
     {
       this.nameMiniNode               = nameMiniNode;
       this.expressionSequenceMiniNode = expressionSequenceMiniNode;
     }

     public  ProcedureCallStatementMiniNode ( NameMiniNode  nameMiniNode )
     //////////////////////////////////////////////////////////////////////
     {
       this ( nameMiniNode, null );
     }

     //////////////////////////////////////////////////////////////////////
     // Access methods
     //////////////////////////////////////////////////////////////////////

     public NameMiniNode  getNameMiniNode ( ) { return nameMiniNode; }

     public ExpressionSequenceMiniNode  getExpressionSequenceMiniNode ( )
     //////////////////////////////////////////////////////////////////////
     {
       return expressionSequenceMiniNode;
     }

     public Boolean  callsNested ( ) { return callsNested; }

     //////////////////////////////////////////////////////////////////////
     // MiniNode interface methods
     //////////////////////////////////////////////////////////////////////

     public void  generate ( MiniNodeCodeVisitor  miniNodeCodeVisitor )
     //////////////////////////////////////////////////////////////////////
     {
       miniNodeCodeVisitor.generateProcedureCallStatement ( this );
     }
     
     public void  checkSemantics ( Stack  parentMiniNodeStack )
       throws SemanticErrorException
     //////////////////////////////////////////////////////////////////////
     {
       parentMiniNodeStack.push ( this );

       if ( expressionSequenceMiniNode != null )
       {
         expressionSequenceMiniNode.checkSemantics ( parentMiniNodeStack );
       }

       int  size = parentMiniNodeStack.size ( );

       boolean  wasDeclared = false;

       outerLoop:
       for ( int  i = size - 2; i >= 0; i-- )
       {
         MiniNode  miniNode = ( MiniNode ) parentMiniNodeStack.get ( i );

         if ( !( miniNode instanceof BlockMiniNode ) ) continue;

         DeclarationSequenceMiniNode  declarationSequenceMiniNode
           = ( ( BlockMiniNode ) miniNode
           ).getDeclarationSequenceMiniNode ( );

         if ( declarationSequenceMiniNode == null ) continue;

         List  declarationMiniNodeList
           = declarationSequenceMiniNode.getDeclarationMiniNodeList ( );

         Iterator  j = declarationMiniNodeList.iterator ( );

         while ( j.hasNext ( ) )
         {
           DeclarationMiniNode  declarationMiniNode
             = ( DeclarationMiniNode ) j.next ( );

           if ( !( declarationMiniNode instanceof
             ProcedureDeclarationMiniNode ) ) continue;

           ProcedureDeclarationMiniNode  procedureDeclarationMiniNode
             = ( ProcedureDeclarationMiniNode ) declarationMiniNode;

           ParameterSequenceMiniNode  parameterSequenceMiniNode
             = procedureDeclarationMiniNode.getParameterSequenceMiniNode (
             );

           if ( nameMiniNode.equals (
             procedureDeclarationMiniNode.getNameMiniNode ( ) )
             && ( expressionSequenceMiniNode.size ( )
                == parameterSequenceMiniNode.size ( ) ) )
           {
             callsNested = procedureDeclarationMiniNode.containsNested ( );
             wasDeclared = true;
             break outerLoop;
           }
         }
       }

       if ( !wasDeclared )
       {
         throw new SemanticErrorException ( "procedure undeclared" );
       }

       parentMiniNodeStack.pop ( );
     }

     //////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////
     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -