Esempio n. 1
0
 //------------------------------------------------------------
 // コンストラクタ。
 public BCFunction(BCModule aBCModule, FunctionSymbolNode aFunctionSymbolNode)
 {
     mBCModule             = aBCModule;
     mFunctionSymbolNode   = aFunctionSymbolNode;
     mBCOpCodeList         = new List <BCOpCode>();
     mBCLabelReferenceList = new List <BCLabelReference>();
 }
Esempio n. 2
0
            //------------------------------------------------------------ 
            // 評価準備。 
            void eventAnalyze(SemanticAnalyzeComponent aComp)
            {
                // 1つめを評価
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);

                // 関数シンボルかどうかのチェック
                if (mFirstNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.StaticSymbol ||
                    mFirstNode.GetEvaluateInfo().Symbol.GetNodeKind() != SymbolNodeKind.Function
                    )
                {// エラー
                    aComp.ThrowErrorException(SymbolTree.ErrorKind.FUNCTION_SYMBOL_EXPECTED, mFirstExpr.GetToken());
                }

                // 引数ありの対応
                if (mSeqNode != null)
                {
                    mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);
                }

                // シンボルの取得
                FunctionSymbolNode funcSymbol = (FunctionSymbolNode)mFirstNode.GetEvaluateInfo().Symbol;

                // 評価情報を作成
                mEvaluateInfo = EvaluateInfo.CreateAsValue(funcSymbol.ReturnTypeInfo());

                // 伝搬情報ホルダーの作成
                mTransferredEI = new TransferredEIHolder(mEvaluateInfo);
            }
Esempio n. 3
0
            //------------------------------------------------------------ 
            // 評価実行。 
            void eventEvaluate(SemanticAnalyzeComponent aComp)
            {
                // レジスタの確保
                if (mEvaluateInfo.TypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn || // 組み込み型じゃない
                    mEvaluateInfo.TypeInfo.Symbol.GetBuiltInType() != BuiltInType.Void // voidじゃない
                    )
                {                                                                      // レジスタが必要
                    // 伝搬情報を取得してみる
                    mTransferredEI.ReceiveAndSetSR(aComp);
                }

                // 1つめを評価
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);

                // シンボルの取得
                FunctionSymbolNode funcSymbol = (FunctionSymbolNode)mFirstNode.GetEvaluateInfo().Symbol;

                // 引数の対応
                if (mSeqNode != null)
                {
                    // まず評価設定
                    mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);

                    // 関数情報設定
                    aComp.FunctionCallTargetSet(funcSymbol);

                    // 戻り値用のFRを確保
                    if (mEvaluateInfo.SR.IsValid)
                    {
                        aComp.FunctionCallFRNextIndex();
                    }

                    // 引数のFRを確保
                    mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.SetupFR);

                    // 関数情報リセット
                    aComp.FunctionCallTargetReset();
                }

                // 関数コール命令
                aComp.BCFunction.AddOPCode_SymbolTableIndex(
                    BCOpCode.OpType.CALL
                    , funcSymbol
                    );

                // 関数の結果を受け取る
                if (mEvaluateInfo.SR.IsValid)
                {
                    aComp.BCFunction.AddOPCode_SReg(
                        BCOpCode.OpType.LDSRFZ
                        , mEvaluateInfo.SR
                        );
                }

                // 評価終了イベント送信
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
            }
Esempio n. 4
0
        //------------------------------------------------------------
        // 関数を生成する。
        public BCFunction GenerateFunction(FunctionSymbolNode aFunctionSymbolNode)
        {
            // 作成
            var func = new BCFunction(mBCModule, aFunctionSymbolNode);

            // 追加
            mFunctionList.Add(func);

            // 返す
            return(func);
        }
Esempio n. 5
0
        //------------------------------------------------------------
        // FunctionNode宣言展開。
        private void expandFunctionNodeDecl()
        {
            // まず子ノード
            expandChilds(SymbolExpandCmdKind.FunctionNodeDecl);

            // シンボル走査
            foreach (SymbolDef symbol in mStaticTypeDef.SymbolDefList)
            {
                if (symbol.MemberFunctionDecl != null)
                {
                    // 重複チェック
                    checkIdentDuplication(symbol.MemberFunctionDecl.Ident);

                    // ノード作成
                    var newNode = new FunctionSymbolNode(this, mBCObjectType, symbol.MemberFunctionDecl);

                    // 更に展開
                    newNode.SymbolExpand(SymbolExpandCmdKind.FunctionNodeDecl);

                    // 追加
                    addNode(newNode);
                }
            }
        }