Ejemplo n.º 1
0
            //------------------------------------------------------------ 
            // 評価実行。 
            void eventEvaluate(SemanticAnalyzeComponent aComp)
            {
                // レジスタ確保 
                mEvaluateInfo.SR = aComp.SRReserve();

                // 初期化式があるか否かの分岐
                if (mExpr == null)
                {// 初期化子がないので既定値で初期化する
                    // todo: 組み込み型以外の対応
                    if (mEvaluateInfo.TypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn)
                    {//
                        aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_TYPENAME, mEvaluateInfo.TypeInfo.Symbol.GetToken());
                    }

                    // 組み込み型ならゼロ初期化
                    aComp.BCFunction.AddOPCode_SReg(
                        BCOpCode.OpType.LDSRZR
                        , mEvaluateInfo.SR
                        );
                }
                else
                {// 初期化式の結果でロード命令を挟む
                    // 評価情報を伝達
                    aComp.TransferredEvaluateInfoSet(mEvaluateInfo);

                    // 評価
                    mExprNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);

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

                    // todo:
                    // 暗黙の変換の対応

                    // 型確認
                    Assert.Check(mExprNode.GetEvaluateInfo().Kind == EvaluateInfo.InfoKind.Value);
                    EvaluateInfo exprEI       = mExprNode.GetEvaluateInfo();
                    TypeInfo     exprTypeInfo = exprEI.TypeInfo;
                    if (exprTypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn ||
                        (exprTypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 && exprTypeInfo.Symbol.GetBuiltInType() != BuiltInType.Bool)
                        )
                    {// todo: 今はboolとintしかサポートしない
                        aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_TYPENAME, exprTypeInfo.Symbol.GetToken());
                    }

                    // 型が同じか確認
                    if (mEvaluateInfo.TypeInfo.Symbol.GetBuiltInType() != exprTypeInfo.Symbol.GetBuiltInType())
                    {// 違う型
                        // エラーメッセージ
                        throw new SymbolTree.ErrorException(new SymbolTree.ErrorInfo(
                                                                SymbolTree.ErrorKind.CANT_IMPLICIT_CAST_TYPEA_TO_TYPEB
                                                                , aComp.TypeSymbolNode.ModuleContext()
                                                                , mSymbol.GetIdentifier().Token
                                                                , exprTypeInfo
                                                                , mEvaluateInfo.TypeInfo
                                                                ));
                    }

                    // レジスタが異なればロード命令を追加する
                    if (!mEvaluateInfo.SR.IsSame(exprEI.SR))
                    {
                        aComp.BCFunction.AddOPCode_SReg1_SReg2(
                            BCOpCode.OpType.LDSRSR
                            , mEvaluateInfo.SR
                            , exprEI.SR
                            );
                    }
                    // 親の評価が終わったことを告げる
                    mExprNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
                }
            }