Example #1
0
            //------------------------------------------------------------
            // LogicalNot用評価関数。
            void evaluateLogicalNot(SemanticAnalyzeComponent aComp)
            {
                // boolしか対応しない
                StatementUtil.CheckBoolExpression(aComp, mFirstNode, mExpr.mExpr);

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

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

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

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

                // 命令追加
                aComp.BCFunction.AddOPCode_SReg1_SReg2(
                    BCOpCode.OpType.NTBOOL
                    , mEvaluateInfo.SR
                    , mFirstNode.GetEvaluateInfo().SR
                    );

                // イベント送信
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
            }
Example #2
0
        //------------------------------------------------------------
        // 意味解析。
        public void SemanticAnalyze(SemanticAnalyzeComponent aComp)
        {
            // ラベル作成
            BCLabel labelContinue = aComp.BCFunction.LabelCreate();
            BCLabel labelBreak    = aComp.BCFunction.LabelCreate();

            // 式の意味解析
            var exprEvaluateNode = mExpression.CreateEvaluateNode();

            exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);

            // boolチェック
            StatementUtil.CheckBoolExpression(aComp, exprEvaluateNode, mExpression);

            // continueラベル挿入
            aComp.BCFunction.LabelInsert(labelContinue);

            // 式の評価
            exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);
            exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Release);

            // 分岐
            aComp.BCFunction.AddOPCode_SReg_Label(
                BCOpCode.OpType.JMPNEG
                , exprEvaluateNode.GetEvaluateInfo().SR
                , labelBreak
                );

            // スコープに入る
            aComp.ScopeEnter();

            // ラベルの登録
            aComp.RegisterLabelContinue(labelContinue);
            aComp.RegisterLabelBreak(labelBreak);

            // 文の解析
            mStatement.SemanticAnalyze(aComp);

            // スコープから出る
            aComp.ScopeLeave();

            // continueする
            aComp.BCFunction.AddOPCode_Label(
                BCOpCode.OpType.JMP
                , labelContinue
                );

            // breakラベル挿入
            aComp.BCFunction.LabelInsert(labelBreak);
        }
Example #3
0
        //------------------------------------------------------------
        // 意味解析。
        public void SemanticAnalyze(SemanticAnalyzeComponent aComp)
        {
            // ラベル作成
            BCLabel labelElse = aComp.BCFunction.LabelCreate();
            BCLabel labelEnd  = aComp.BCFunction.LabelCreate();

            // 式の意味解析
            var exprEvaluateNode = mExpression.CreateEvaluateNode();

            exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);

            // boolチェック
            StatementUtil.CheckBoolExpression(aComp, exprEvaluateNode, mExpression);

            // 式の評価
            exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);
            exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Release);

            // 式がfalseならelseに飛ぶ
            aComp.BCFunction.AddOPCode_SReg_Label(
                BCOpCode.OpType.JMPNEG
                , exprEvaluateNode.GetEvaluateInfo().SR
                , labelElse
                );

            // Thenの解析
            {
                // スコープに入る
                aComp.ScopeEnter();

                // Thenの解析
                mThenStatement.SemanticAnalyze(aComp);

                // スコープから出る
                aComp.ScopeLeave();

                // endに飛ぶ
                if (mElseStatement != null)
                {// elseがあるときだけでよい
                    aComp.BCFunction.AddOPCode_Label(
                        BCOpCode.OpType.JMP
                        , labelEnd
                        );
                }
            }

            // elseラベル挿入
            aComp.BCFunction.LabelInsert(labelElse);

            // Elseの解析
            if (mElseStatement != null)
            {
                // スコープに入る
                aComp.ScopeEnter();

                // Thenの解析
                mElseStatement.SemanticAnalyze(aComp);

                // スコープから出る
                aComp.ScopeLeave();
            }

            // endラベル挿入
            aComp.BCFunction.LabelInsert(labelEnd);
        }