protected void CreateEachSymbols() { var procContext = this.ExpContext.ProcContext; var symbols = procContext.Symbols; int foreachIndex = this.ExpContext.ProcContext.CreateEachIndex(); var listSymbolName = "@each" + foreachIndex + "_list"; var indexName = "@each" + foreachIndex + "_index"; var elementName = "@each" + foreachIndex + "_item"; var countName = "@each" + foreachIndex + "_count"; ListSymbol = new SymbolLocalVar(listSymbolName, SubjectExp.RetType); ListSymbol.LoacalVarIndex = procContext.CreateLocalVarIndex(ListSymbol.SymbolName); symbols.Add(ListSymbol); Type[] genericTypes = GenericUtil.GetInstanceGenriceType(SubjectExp.RetType.SharpType, typeof(列表 <>)); Type ElementType = genericTypes[0]; IndexSymbol = new SymbolLocalVar(indexName, ZTypeManager.ZINT);//.GetBySharpType(typeof(int))); IndexSymbol.LoacalVarIndex = procContext.CreateLocalVarIndex(indexName); symbols.Add(IndexSymbol); CountSymbol = new SymbolLocalVar(countName, ZTypeManager.ZINT);//.GetBySharpType(typeof(int))); CountSymbol.LoacalVarIndex = procContext.CreateLocalVarIndex(countName); symbols.Add(CountSymbol); }
//private List<SymbolDefField> nestedSymbolInfos; public override Exp Analy( ) { CreateContext(); AnalyFields(); BodyExp.SetContext(NestedExpContext); BodyExp.SetIsNested(true); if (FnRetType == ZTypeManager.ZBOOL) { retSymbol = new SymbolLocalVar("$RetResult", FnRetType); } return(this); }
public Exp AnalyDim() { SymbolLocalVar localVarSymbol = new SymbolLocalVar(VarName, RetType); localVarSymbol.LoacalVarIndex = this.ExpContext.ProcContext.CreateLocalVarIndex(VarName); this.ProcContext.Symbols.Add(localVarSymbol); VarSymbol = localVarSymbol; WordInfo word = new WordInfo(VarName, WordKind.VarName, this); this.ExpContext.ProcContext.ProcVarWordDictionary.Add(word); return(this); }
public void EmitBody() { var symbols = this.ProcContext.Symbols; var IL = this.ProcContext.EmitContext.ILout; this.ProcContext.LoacalVarList.Reverse(); for (int i = 0; i < this.ProcContext.LoacalVarList.Count; i++) { string ident = this.ProcContext.LoacalVarList[i]; SymbolLocalVar varSymbol = symbols.Get(ident) as SymbolLocalVar; varSymbol.VarBuilder = IL.DeclareLocal(varSymbol.SymbolZType.SharpType); varSymbol.VarBuilder.SetLocalSymInfo(varSymbol.SymbolName); } Body.Emit(); ProcContext.EmitContext.ILout.Emit(OpCodes.Ret); }
public override void Analy( ) { var tyedimNames = GetTypeWords(); NameTypeParser parser = new NameTypeParser(tyedimNames); NameTypeParser.ParseResult result = parser.ParseVar(ExceptionTypeVarToken); exTypeName = result.TypeName; exType = result.ZType; exName = result.VarName; var symbols = this.ProcContext.Symbols; //exTypeName = ExceptionTypeToken.GetText(); //exType = ZTypeCache.GetByZName(exTypeName)[0]; //if (exType == null) //{ // errorf(ExceptionTypeToken.Postion, "类型'{0}'不存在", exTypeName); //} //exName = ExceptionVarToken.GetText(); var exSymbol2 = symbols.Get(exName); if (exSymbol2 == null) { exSymbol = new SymbolLocalVar(exName, exType); exSymbol.LoacalVarIndex = this.ProcContext.CreateLocalVarIndex(exName); } else { if (exSymbol2 is SymbolLocalVar) { exSymbol = exSymbol2 as SymbolLocalVar; if (exSymbol.SymbolZType != exType) { ErrorE(ExceptionTypeVarToken.Position, "变量'{0}'的类型与异常的类型不一致", exName); } } else { ErrorE(ExceptionTypeVarToken.Position, "变量名称'{0}'已经使用过", exName); } } symbols.Add(exSymbol); CatchBody.ProcContext = this.ProcContext; CatchBody.Analy(); }
public ExpEachItem(ContextExp expContext, SymbolLocalVar listSymbol, SymbolLocalVar indexSymbol) { ExpContext = expContext; ListSymbol = listSymbol; IndexSymbol = indexSymbol; }