Exemplo n.º 1
0
            //------------------------------------------------------------
            // Negative,BitwiseNot用評価関数。
            void evaluateNegativeBitwiseNot(SemanticAnalyzeComponent aComp, bool aIsNegative)
            {
                // todo:
                // 暗黙の変換の対応
                // 今はintしか対応しない
                if (mFirstNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value ||
                    mFirstNode.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32
                    )
                {
                    aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_EXPRESSION, mExpr.mOpToken);
                }

                // SR設定
                mTransferredEIHolder.ReceiveAndSetSR(aComp);

                // 伝達できるなら伝達する
                mTransferredEIHolder.TransferIfPossible(aComp);

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

                // 伝達情報リセット
                aComp.TransferredEvaluateInfoReset();

                // 命令追加
                aComp.BCFunction.AddOPCode_SReg1_SReg2(
                    aIsNegative ? BCOpCode.OpType.NEGS32 : BCOpCode.OpType.NTI32
                    , mEvaluateInfo.SR
                    , mFirstNode.GetEvaluateInfo().SR
                    );

                // イベント送信
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
            }
Exemplo n.º 2
0
            //------------------------------------------------------------
            // 同じ数値の演算しか許さないタイプの演算。
            void evaluateNumberType(
                SemanticAnalyzeComponent aComp
                , BCOpCode.OpType aOpType
                , bool aSwapLR // trueなら左辺と右辺を逆転させる。
                )
            {
                // レジスタ設定
                mTransferredEIHolder.ReceiveAndSetSR(aComp);

                // 伝達設定
                mTransferredEIHolder.TransferIfPossible(aComp);

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

                // 伝達リセット
                aComp.TransferredEvaluateInfoReset();

                // 可能なら2つめに伝達する
                if (!mFirstNode.GetEvaluateInfo().SR.IsSame(mEvaluateInfo.SR))
                {
                    mTransferredEIHolder.TransferIfPossible(aComp);
                }

                // 2つめ
                mSecondNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);

                // 伝達リセット
                aComp.TransferredEvaluateInfoReset();

                // todo:
                // 暗黙の変換の対応
                // 今はintしか対応しない
                if (mFirstNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value ||
                    mFirstNode.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 ||
                    mSecondNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value ||
                    mSecondNode.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32
                    )
                {
                    aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_EXPRESSION, mExpr.mOpToken);
                }

                // 演算
                StackRegister leftSR  = mFirstNode.GetEvaluateInfo().SR;
                StackRegister rightSR = mSecondNode.GetEvaluateInfo().SR;

                aComp.BCFunction.AddOPCode_SReg1_SReg2_SReg3(
                    aOpType
                    , mEvaluateInfo.SR
                    , aSwapLR ? rightSR : leftSR
                    , aSwapLR ? leftSR : rightSR
                    );

                // 通知
                mSecondNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
            }
Exemplo 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);
            }