예제 #1
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);
        }