//------------------------------------------------------------ // 評価準備。 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); } }
//------------------------------------------------------------ // 式の結果がboolであることをチェックする。 static public void CheckBoolExpression( SemanticAnalyzeComponent aComp , IEvaluateNode aExprEN , IExpression aExpr ) { if (aExprEN.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.Value || aExprEN.GetEvaluateInfo().TypeInfo.Symbol.GetBuiltInType() != BuiltInType.Bool) { throw new SymbolTree.ErrorException(new SymbolTree.ErrorInfo( SymbolTree.ErrorKind.CANT_IMPLICIT_CAST_TYPEA_TO_TYPEB , aComp.TypeSymbolNode.ModuleContext() , aExpr.GetToken() , aExprEN.GetEvaluateInfo().TypeInfo , new TypeInfo(new TypeInfo.TypeSymbol(null, BuiltInType.Bool), new TypeInfo.TypeAttribute(true, false)) )); } }
//------------------------------------------------------------ // 評価ノードを追加する。 public void AddEvaluateNode(IEvaluateNode aNode) { mEvaluateNodeList.Add(aNode); }
//------------------------------------------------------------ // コンストラクタ。 public EvaluatedSymbolNode(ISymbolNode aSymbolNode, IEvaluateNode aEvaluateNode) { SymbolNode = aSymbolNode; EvaluateNode = aEvaluateNode; }