//------------------------------------------------------------ // シンボルノードを作成する。 private bool onSymbolNodeCreate(VariableSymbolNode aNode) { // 重複チェック // ... // 追加 mLocalVariableSymbolNodes.Add(aNode); return(true); }
//------------------------------------------------------------ // 意味解析。 public bool SemanticAnalyze(SemanticAnalyzeComponent comp) { TypeInfo typeInfo = comp.CreateTypeInfo(mVariableDecl.TypePath); VariableSymbolNode newNode = new VariableSymbolNode( comp.PrevSymbolNode , mVariableDecl.Ident , typeInfo ); if (!comp.OnSymbolNodeCreateMethod(newNode)) { return(false); } comp.PrevSymbolNode = newNode; return(true); }
//------------------------------------------------------------ // シンボルを展開する。 public bool SymbolExpand(SymbolTree.ErrorInfoHolder aHolder, SymbolExpandCmdKind aCmdKind) { if (aCmdKind != SymbolExpandCmdKind.FunctionNodeImpl) {// 関数実装以外なら何もしない return(true); } mLocalVariableSymbolNodes = new List <VariableSymbolNode>(); ISymbolNode prevNode = this; {// 引数 foreach (ArgTypeInfo argTypeInfo in mArgTypeInfos) { VariableSymbolNode node = new VariableSymbolNode( prevNode , argTypeInfo.Ident , argTypeInfo.TypeInfo ); prevNode = node; mLocalVariableSymbolNodes.Add(node); } } {// Statement解析 SemanticAnalyzeComponent comp = new SemanticAnalyzeComponent( aHolder , mModuleContext , mParent , new SemanticAnalyzeComponent.OnSymbolNodeCreate(onSymbolNodeCreate) , prevNode ); if (!mFunctionDecl.Statement().SemanticAnalyze(comp)) { return(false); } } return(true); }