//------------------------------------------------------------ // 評価準備。 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); } }
//------------------------------------------------------------ // 評価準備。 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); // 関数シンボルかどうかのチェック 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); }
//------------------------------------------------------------ // 評価準備。 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); }
//------------------------------------------------------------ // 評価準備。 void eventAnalyze(SemanticAnalyzeComponent aComp) { // todo:いろいろ対応してません・・・。 // 型情報取得 TypeInfo typeInfo = mSymbol.GetTypeInfo(); // 評価情報作成 mEvaluateInfo = EvaluateInfo.CreateAsValue(typeInfo); }
//------------------------------------------------------------ // 評価準備。 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); }
//------------------------------------------------------------ // シンボルを展開する。 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(); }