//------------------------------------------------------------ // 評価準備。 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); }
//------------------------------------------------------------ // 評価準備。 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); }
//------------------------------------------------------------ // 評価準備。 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); }