//------------------------------------------------------------ // Negative,BitwiseNot用評価関数。 void evaluateNegativeBitwiseNot(SemanticAnalyzeComponent aComp, bool aIsNegative) { // todo: // 暗黙の変換の対応 // 今はintしか対応しない if (mFirstNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value || mFirstNode.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 ) { aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_EXPRESSION, mExpr.mOpToken); } // SR設定 mTransferredEIHolder.ReceiveAndSetSR(aComp); // 伝達できるなら伝達する mTransferredEIHolder.TransferIfPossible(aComp); // 1つめを評価 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); // 伝達情報リセット aComp.TransferredEvaluateInfoReset(); // 命令追加 aComp.BCFunction.AddOPCode_SReg1_SReg2( aIsNegative ? BCOpCode.OpType.NEGS32 : BCOpCode.OpType.NTI32 , mEvaluateInfo.SR , mFirstNode.GetEvaluateInfo().SR ); // イベント送信 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release); }
//------------------------------------------------------------ // 同じ数値の演算しか許さないタイプの演算。 void evaluateNumberType( SemanticAnalyzeComponent aComp , BCOpCode.OpType aOpType , bool aSwapLR // trueなら左辺と右辺を逆転させる。 ) { // レジスタ設定 mTransferredEIHolder.ReceiveAndSetSR(aComp); // 伝達設定 mTransferredEIHolder.TransferIfPossible(aComp); // 1つめ mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); // 伝達リセット aComp.TransferredEvaluateInfoReset(); // 可能なら2つめに伝達する if (!mFirstNode.GetEvaluateInfo().SR.IsSame(mEvaluateInfo.SR)) { mTransferredEIHolder.TransferIfPossible(aComp); } // 2つめ mSecondNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); // 伝達リセット aComp.TransferredEvaluateInfoReset(); // todo: // 暗黙の変換の対応 // 今はintしか対応しない if (mFirstNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value || mFirstNode.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 || mSecondNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value || mSecondNode.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.SInt32 ) { aComp.ThrowErrorException(SymbolTree.ErrorKind.NOT_SUPPORTED_EXPRESSION, mExpr.mOpToken); } // 演算 StackRegister leftSR = mFirstNode.GetEvaluateInfo().SR; StackRegister rightSR = mSecondNode.GetEvaluateInfo().SR; aComp.BCFunction.AddOPCode_SReg1_SReg2_SReg3( aOpType , mEvaluateInfo.SR , aSwapLR ? rightSR : leftSR , aSwapLR ? leftSR : rightSR ); // 通知 mSecondNode.SendEvent(aComp, EvaluateNodeEventKind.Release); mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release); }
//------------------------------------------------------------ // 評価実行。 void eventEvaluate(SemanticAnalyzeComponent aComp) { // レジスタの確保 if (mEvaluateInfo.TypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn || // 組み込み型じゃない mEvaluateInfo.TypeInfo.Symbol.GetBuiltInType() != BuiltInType.Void // voidじゃない ) { // レジスタが必要 // 伝搬情報を取得してみる mTransferredEI.ReceiveAndSetSR(aComp); } // 1つめを評価 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); // シンボルの取得 FunctionSymbolNode funcSymbol = (FunctionSymbolNode)mFirstNode.GetEvaluateInfo().Symbol; // 引数の対応 if (mSeqNode != null) { // まず評価設定 mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); // 関数情報設定 aComp.FunctionCallTargetSet(funcSymbol); // 戻り値用のFRを確保 if (mEvaluateInfo.SR.IsValid) { aComp.FunctionCallFRNextIndex(); } // 引数のFRを確保 mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.SetupFR); // 関数情報リセット aComp.FunctionCallTargetReset(); } // 関数コール命令 aComp.BCFunction.AddOPCode_SymbolTableIndex( BCOpCode.OpType.CALL , funcSymbol ); // 関数の結果を受け取る if (mEvaluateInfo.SR.IsValid) { aComp.BCFunction.AddOPCode_SReg( BCOpCode.OpType.LDSRFZ , mEvaluateInfo.SR ); } // 評価終了イベント送信 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release); }