Exemple #1
0
            //------------------------------------------------------------ 
            // 評価準備。 
            void eventAnalyze(SemanticAnalyzeComponent aComp)
            {
                // 型情報取得
                TypeInfo typeInfo = mSymbol.GetTypeInfo();

                // todo: いろんな型の対応
                // - 現時点はint,boolのみ対応
                if (typeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn ||
                    (typeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 && typeInfo.Symbol.GetBuiltInType() != BuiltInType.Bool)
                    )
                {
                    aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_TYPENAME, typeInfo.Symbol.GetToken());
                }

                // 評価情報作成
                mEvaluateInfo = EvaluateInfo.CreateAsValue(typeInfo);

                // 初期化式があるか
                if (mExpr != null)
                {// 初期化式の結果でロード命令を挟む
                    // 作成
                    mExprNode = mExpr.CreateEvaluateNode();

                    // 評価
                    mExprNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze);
                }
            }
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);

                // 関数シンボルかどうかのチェック
                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 #4
0
            //------------------------------------------------------------ 
            // 評価準備。 
            bool eventAnalyze(SemanticAnalyzeComponent aComp)
            {
                // BuiltInTypeの選択
                BuiltInType builtInType;

                switch (mExpr.mToken.Value)
                {
                case Token.Kind.NumSInt32:
                    builtInType = BuiltInType.SInt32;
                    break;

                case Token.Kind.KeyTrue:
                case Token.Kind.KeyFalse:
                    builtInType = BuiltInType.Bool;
                    break;

                default:
                    // todo: いろんな型の対応
                    aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_EXPRESSION, mExpr.mToken);
                    return(false);
                }

                // EvaluateInfo作成
                TypePath typePath = new TypePath(mExpr.mToken, builtInType);

                mEvaluateInfo = EvaluateInfo.CreateAsValue(
                    aComp.CreateTypeInfo(typePath, true, true)
                    );

                return(true);
            }
Exemple #5
0
            //------------------------------------------------------------ 
            // 評価準備。 
            void eventAnalyze(SemanticAnalyzeComponent aComp)
            {
                // todo:いろいろ対応してません・・・。

                // 型情報取得
                TypeInfo typeInfo = mSymbol.GetTypeInfo();

                // 評価情報作成
                mEvaluateInfo = EvaluateInfo.CreateAsValue(typeInfo);
            }
Exemple #6
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);
            }
Exemple #7
0
        //------------------------------------------------------------
        // シンボルを展開する。
        public void SymbolExpand(SymbolExpandCmdKind aCmdKind)
        {
            if (aCmdKind != SymbolExpandCmdKind.FunctionNodeImpl)
            {// 関数実装以外なら何もしない
                return;
            }

            // BCFunction作成
            mBCFunction = mBCObjectType.GenerateFunction(this);

            // コンポーネント
            SemanticAnalyzeComponent comp = new SemanticAnalyzeComponent(
                mBCFunction
                , mParent
                , this
                );

            // コピーするレジスタの数をメモする変数
            byte copyRegCount = 0;

            {// 関数内部のスコープ
                // スコープ追加
                comp.ScopeEnter();

                // 戻り値対応
                if (mReturnTypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn ||
                    mReturnTypeInfo.Symbol.GetBuiltInType() != BuiltInType.Void
                    )
                {// void以外なら。
                    // todo: いろんな型の対応
                    // 組み込み型のint,boolしか対応していません。
                    if (mReturnTypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn ||
                        (mReturnTypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 && mReturnTypeInfo.Symbol.GetBuiltInType() != BuiltInType.Bool)
                        )
                    {
                        comp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_TYPENAME, mReturnTypeInfo.Symbol.GetToken());
                    }

                    // EI作成
                    var returnEI = EvaluateInfo.CreateAsValue(mReturnTypeInfo);

                    // SRを確保
                    returnEI.SR = comp.SRReserve();

                    // 戻り値として登録 
                    comp.ReturnEvaluateInfoSet(returnEI);

                    // コピーするレジスタカウントアップ
                    ++copyRegCount;
                }

                // this
                if (!mFunctionDecl.IsStatic())
                {
                    // TypeInfo作成
                    var ti = comp.CreateTypeInfo(
                        new TypePath(new IdentPath(mParent))
                        , mFunctionDecl.IsConst()
                        , true
                        );

                    // ダミートークンを作成
                    var token = new Token();
                    token.Value     = Token.Kind.KeyThis;
                    token.pos       = GetIdentifier().Token.pos;
                    token.posColumn = GetIdentifier().Token.posColumn;
                    token.posLine   = GetIdentifier().Token.posLine;

                    // シンボルノードを作成
                    VariableSymbolNode symbolNode = new VariableSymbolNode(
                        comp.PrevSymbolNode()
                        , new Identifier(token)
                        , ti
                        );

                    // ノードを追加
                    comp.AddSymbolNode(symbolNode);

                    // 評価ノードを作成
                    var evaluateNode = new EvaluateNode(symbolNode);

                    // 評価イベント送信
                    evaluateNode.SendEvent(comp, EvaluateNodeEventKind.Analyze);
                    evaluateNode.SendEvent(comp, EvaluateNodeEventKind.Evaluate);

                    // 追加
                    comp.AddEvaluatedSymbolNode(new EvaluatedSymbolNode(symbolNode, evaluateNode));

                    // コピーするレジスタカウントアップ
                    ++copyRegCount;
                }

                // 引数
                foreach (var arg in mArgTypeInfos)
                {
                    // シンボルノードを作成
                    VariableSymbolNode symbolNode = new VariableSymbolNode(
                        comp.PrevSymbolNode()
                        , arg.Ident
                        , arg.TypeInfo
                        );

                    // ノードを追加
                    comp.AddSymbolNode(symbolNode);

                    // 評価ノードを作成
                    var evaluateNode = new EvaluateNode(symbolNode);

                    // 評価イベント送信
                    evaluateNode.SendEvent(comp, EvaluateNodeEventKind.Analyze);
                    evaluateNode.SendEvent(comp, EvaluateNodeEventKind.Evaluate);

                    // 追加
                    comp.AddEvaluatedSymbolNode(new EvaluatedSymbolNode(symbolNode, evaluateNode));

                    // コピーするレジスタカウントアップ
                    ++copyRegCount;
                }

                {// Statement
                    // スコープに入る
                    comp.ScopeEnter();

                    // Returnラベル確保・登録
                    BCLabel labelReturn = comp.BCFunction.LabelCreate();
                    comp.RegisterLabelReturn(labelReturn);

                    // 解析
                    mFunctionDecl.Statement().SemanticAnalyze(comp);

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

                    // Returnラベル挿入
                    comp.BCFunction.LabelInsert(labelReturn);
                }

                // スコープ終了
                comp.ScopeLeave();
            }

            // 関数命令を追加
            // todo: レジスタ使いすぎチェック
            mBCFunction.PushFrontOPCode_CU1_CU1(BCOpCode.OpType.FENTER, (byte)comp.SRPeakCount(), copyRegCount);
            mBCFunction.AddOPCode_CU1(BCOpCode.OpType.FLEAVE, (byte)comp.SRPeakCount());

            // ラベル解決
            mBCFunction.LabelResolve();
        }