Exemple #1
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);
            }
Exemple #2
0
            //------------------------------------------------------------ 
            // 評価準備。 
            void eventAnalyze(SemanticAnalyzeComponent aComp)
            {
                // 1つめを評価
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);

                // EvaluateInfoの用意
                switch (mExpr.mOpKind)
                {
                case OpKind.Inc:
                case OpKind.Dec:
                case OpKind.Positive:
                    // 式のものをそのまま
                    mEvaluateInfo = mFirstNode.GetEvaluateInfo();
                    break;

                case OpKind.Negative:
                case OpKind.BitwiseNot:
                    // タイプは一緒だけど別のレジスタを使う可能性があるのでEvaluateInfoを作成
                    mEvaluateInfo = EvaluateInfo.CreateAsValue(mFirstNode.GetEvaluateInfo().TypeInfo);
                    break;

                case OpKind.LogicalNot:
                    // boolで
                    mEvaluateInfo = EvaluateInfo.CreateAsValue(new TypeInfo(new TypeInfo.TypeSymbol(mExpr.mOpToken, BuiltInType.Bool), new TypeInfo.TypeAttribute(true, false)));
                    break;

                default:
                    Assert.NotReachHere();
                    break;
                }

                // Holder作成
                mTransferredEIHolder = new TransferredEIHolder(mEvaluateInfo);
            }
Exemple #3
0
            //------------------------------------------------------------ 
            // 評価準備。 
            void eventAnalyze(SemanticAnalyzeComponent aComp)
            {
                // 1つめ
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);

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

                // 評価情報の作成
                TypeInfo ti;

                switch (mExpr.mOpKind)
                {
                case OpKind.RelationalGreater:
                case OpKind.RelationalGreaterEqual:
                case OpKind.RelationalLess:
                case OpKind.RelationalLessEqual:
                case OpKind.EqualityEqual:
                case OpKind.EqualityNotEqual:
                case OpKind.IdentityEqual:
                case OpKind.IdentityNotEqual:
                case OpKind.LogicalAnd:
                case OpKind.LogicalOr:
                    // boolの情報を返す 
                    ti = new TypeInfo(new TypeInfo.TypeSymbol(mExpr.mOpToken, BuiltInType.Bool), new TypeInfo.TypeAttribute(true, false));
                    break;

                default:
                    // 左辺の情報をそのまま返す
                    // todo: 暗黙の変換対応
                    ti = mFirstNode.GetEvaluateInfo().TypeInfo;
                    break;
                }
                mEvaluateInfo = EvaluateInfo.CreateAsValue(ti);

                // Holder作成
                mTransferredEIHolder = new TransferredEIHolder(mEvaluateInfo);
            }