Exemple #1
0
        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);
        }
Exemple #2
0
        //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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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();
        }
Exemple #6
0
 public ExpEachItem(ContextExp expContext, SymbolLocalVar listSymbol, SymbolLocalVar indexSymbol)
 {
     ExpContext  = expContext;
     ListSymbol  = listSymbol;
     IndexSymbol = indexSymbol;
 }