当前位置: 首页>>代码示例>>C#>>正文


C# SyntaxTree.procedure_definition类代码示例

本文整理汇总了C#中PascalABCCompiler.SyntaxTree.procedure_definition的典型用法代码示例。如果您正苦于以下问题:C# procedure_definition类的具体用法?C# procedure_definition怎么用?C# procedure_definition使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。


procedure_definition类属于PascalABCCompiler.SyntaxTree命名空间,在下文中一共展示了procedure_definition类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: visit

        // Лучше запретить yield в вложенных функциях и в функциях со вложенными!
        // Запретить-запретить-запретить
        public override void visit(procedure_definition pd)
        {
            // var u = UpperNode(3);
            // В случае отсутствия формальных параметров
            if ((object)pd.proc_header.parameters == null)
            {
                base.visit(pd.proc_body);
                return;
            }

            formalParametersStack.Add(new Dictionary<string, string>());
            int currentLevel = formalParametersStack.Count - 1;

            foreach (var plist in pd.proc_header.parameters.params_list)
            {
                foreach (var id in plist.idents.idents)
                {
                    var paramName = id.name;
                    var hoistedParamName = CapturedNamesHelper.MakeCapturedFormalParameterName(id.name);

                    formalParametersStack[currentLevel].Add(paramName, hoistedParamName);

                    // Захват
                    CollectedFormalParameters.Add(hoistedParamName, plist.vars_type);
                }
            }

            base.visit(pd.proc_body);

            formalParametersStack.RemoveAt(currentLevel);
        }
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:33,代码来源:ReplaceFormalParametersRefsVisitor.cs

示例2: visit

        public override void visit(procedure_definition p)
        {
            if (PrintInfo)
                Console.WriteLine(" " + p.proc_header.name.meth_name);

            var ld = new FindLocalDefsVisitor(); 
            p.visit(ld);

            base.visit(p);
        }
开发者ID:lisiynos,项目名称:pascalabcnet,代码行数:10,代码来源:CollectNamespaces.cs

示例3: visit

        public override void visit(procedure_definition pd)
        {
            // frninja

            // Classification
            ISet<string> CollectedLocalsNames = new HashSet<string>();
            ISet<string> CollectedFormalParamsNames = new HashSet<string>();
            ISet<string> CollectedClassFieldsNames = new HashSet<string>();
            ISet<string> CollectedUnitGlobalsNames = new HashSet<string>();

            ISet<var_def_statement> CollectedLocals = new HashSet<var_def_statement>();
            ISet<var_def_statement> CollectedFormalParams = new HashSet<var_def_statement>();

            // Map from ident idName -> captured ident idName
            IDictionary<string, string> CapturedLocalsNamesMap = new Dictionary<string, string>();
            IDictionary<string, string> CapturedFormalParamsNamesMap = new Dictionary<string, string>();

            var dld = new DeleteAllLocalDefs(); // mids.vars - все захваченные переменные
            pd.visit(dld); // Удалить в локальных и блочных описаниях этой процедуры все переменные и вынести их в отдельный список var_def_statement

            // frninja 08/12/15
            bool isInClassMethod;

            // Collect locals
            CollectedLocals.UnionWith(dld.LocalDeletedDefs);
            CollectedLocalsNames.UnionWith(dld.LocalDeletedDefs.SelectMany(vds => vds.vars.idents).Select(id => id.name));
            // Collect formal params
            CollectFormalParams(pd, CollectedFormalParams);
            CollectFormalParamsNames(pd, CollectedFormalParamsNames);
            // Collect class fields
            CollectClassFieldsNames(pd, CollectedClassFieldsNames, out isInClassMethod);

            // Collect unit globals
            CollectUnitGlobalsNames(pd, CollectedUnitGlobalsNames);

            // Create maps :: idName -> captureName
            CreateCapturedLocalsNamesMap(CollectedLocalsNames, CapturedLocalsNamesMap);
            CreateCapturedFormalParamsNamesMap(CollectedFormalParamsNames, CapturedFormalParamsNamesMap);

            // AHAHA test!
            ReplaceCapturedVariablesVisitor rcapVis = new ReplaceCapturedVariablesVisitor(
                CollectedLocalsNames,
                CollectedFormalParamsNames,
                CollectedClassFieldsNames,
                new HashSet<string>(),
                new HashSet<string>(),
                CollectedUnitGlobalsNames,
                CapturedLocalsNamesMap,
                CapturedFormalParamsNamesMap,
                isInClassMethod
                );
            // Replace
            (pd.proc_body as block).program_code.visit(rcapVis);
        }
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:54,代码来源:JustTestVisitor.cs

示例4: visit

        public override void visit(procedure_definition pd)
        {
            //this.CurrentMethod = pd;

            MethodsStack.Push(pd);

            HasYields = false;

            base.visit(pd);
            pd.has_yield = HasYields;

            if (pd.has_yield) // SSM bug fix #219
            {
                var ee = pd.proc_body as block;
                if (ee != null)
                {
                    var FirstTypeDeclaration = ee.defs.DescendantNodes().OfType<type_declarations>();
                    if (FirstTypeDeclaration.Count() > 0)
                    {
                        throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_LOCAL_TYPE_DEFINITIONS", FirstTypeDeclaration.First().source_context);
                    }
                }
            }

            var innerPds = pd.DescendantNodes().OfType<procedure_definition>();

            if (pd.has_yield && innerPds.Count() > 0
                || innerPds.Where(npd => npd.has_yield).Count() > 0)
            {
                // Есть yield и вложенные - плохо
                // Или нет yield но есть вложенные с yield
                throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_NESTED_SUBROUTINES", pd.source_context);
            }

            if (pd.has_yield && pd.DescendantNodes().OfType<try_stmt>().Count() > 0)
            {
                throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_TRY_EXCEPT_FINALLY", pd.source_context);
            }

            if (pd.has_yield && pd.DescendantNodes().OfType<lock_stmt>().Count() > 0)
            {
                throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_LOCK", pd.source_context);
            }

            HasYields = false;

            MethodsStack.Pop();

            //this.CurrentMethod = null;
        }
开发者ID:Slav76,项目名称:pascalabcnet,代码行数:50,代码来源:MarkMethodHasYieldVisitor.cs

示例5: CollectClassFieldsNames

        private void CollectClassFieldsNames(procedure_definition pd, ISet<string> collectedFields, out bool isInClassMethod)
        {
            isInClassMethod = false;

            ident className = null;
            if ((object)pd.proc_header.name.class_name != null)
            {
                // Объявление вне класса его метода
                className = pd.proc_header.name.class_name;
            }
            else
            {
                // Объявление функции в классе?
                var classDef = UpperNode(3) as class_definition;
                if ((object)(UpperNode(3) as class_definition) != null)
                {
                    var td = UpperNode(4) as type_declaration;
                    if ((object)td != null)
                    {
                        className = td.type_name;
                    }
                }
            }

            if ((object)className != null)
            {
                isInClassMethod = true;

                CollectClassFieldsVisitor fieldsVis = new CollectClassFieldsVisitor(className);
                var cu = UpperTo<compilation_unit>();
                if ((object)cu != null)
                {
                    cu.visit(fieldsVis);
                    // Collect
                    collectedFields.UnionWith(fieldsVis.CollectedFields.Select(id => id.name));
                }
            }
        }
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:38,代码来源:JustTestVisitor.cs

示例6: GetClassName

        private ident GetClassName(procedure_definition pd)
        {
            if ((object)pd.proc_header.name.class_name != null)
            {
                // Объявление вне класса его метода
                return pd.proc_header.name.class_name;
            }
            else
            {
                // Объявление функции в классе?
                var classDef = UpperNode(3) as class_definition;
                if ((object)(UpperNode(3) as class_definition) != null)
                {
                    var td = UpperNode(4) as type_declaration;
                    if ((object)td != null)
                    {
                        return td.type_name;
                    }
                }
            }

            return null;
        }
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:23,代码来源:ProcessYieldsCapturedVars.cs

示例7: CollectUnitGlobalsNames

 private void CollectUnitGlobalsNames(procedure_definition pd, ISet<string> collectedUnitGlobalsName)
 {
     var cu = UpperTo<compilation_unit>();
     if ((object)cu != null)
     {
         var ugVis = new CollectUnitGlobalsVisitor();
         cu.visit(ugVis);
         // Collect
         collectedUnitGlobalsName.UnionWith(ugVis.CollectedGlobals.Select(id => id.name));
     }
 }
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:11,代码来源:ProcessYieldsCapturedVars.cs

示例8: CollectFormalParams

 private void CollectFormalParams(procedure_definition pd, ISet<var_def_statement> collectedFormalParams)
 {
     if ((object)pd.proc_header.parameters != null)
         collectedFormalParams.UnionWith(pd.proc_header.parameters.params_list.Select(tp => new var_def_statement(tp.idents, tp.vars_type)));
 }
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:5,代码来源:ProcessYieldsCapturedVars.cs

示例9: visit

        public override void visit(procedure_definition pd)
        {
            // frninja
            // DEBUG for test
            // SORRY

            // Classification
            ISet<string> CollectedLocalsNames = new HashSet<string>();
            ISet<string> CollectedFormalParamsNames = new HashSet<string>();
            ISet<string> CollectedClassFieldsNames = new HashSet<string>();
            ISet<string> CollectedClassMethodsNames = new HashSet<string>();
            ISet<string> CollectedClassPropertiesNames = new HashSet<string>();
            ISet<string> CollectedUnitGlobalsNames = new HashSet<string>();

            ISet<var_def_statement> CollectedLocals = new HashSet<var_def_statement>();
            ISet<var_def_statement> CollectedFormalParams = new HashSet<var_def_statement>();

            // Map from ident idName -> captured ident idName
            IDictionary<string, string> CapturedLocalsNamesMap = new Dictionary<string, string>();
            IDictionary<string, string> CapturedFormalParamsNamesMap = new Dictionary<string, string>();

            hasYields = false;
            if (pd.proc_header is function_header)
                mids = new FindMainIdentsVisitor();

            base.visit(pd);

            if (!hasYields) // т.е. мы разобрали функцию и уже выходим. Это значит, что пока yield будет обрабатываться только в функциях. Так это и надо.
                return;

            LoweringVisitor.Accept(pd);

            // frninja 16/11/15: перенес ниже чтобы работал захват для lowered for

            var dld = new DeleteAllLocalDefs(); // mids.vars - все захваченные переменные
            pd.visit(dld); // Удалить в локальных и блочных описаниях этой процедуры все переменные и вынести их в отдельный список var_def_statement

            // frninja 08/12/15
            bool isClassMethod = IsClassMethod(pd);

            // Collect locals
            CollectedLocals.UnionWith(dld.LocalDeletedDefs);
            CollectedLocalsNames.UnionWith(dld.LocalDeletedDefs.SelectMany(vds => vds.vars.idents).Select(id => id.name));
            // Collect formal params
            CollectFormalParams(pd, CollectedFormalParams);
            CollectFormalParamsNames(pd, CollectedFormalParamsNames);
            // Collect class fields
            CollectClassFieldsNames(pd, CollectedClassFieldsNames);
            // Collect class methods
            CollectClassMethodsNames(pd, CollectedClassMethodsNames);
            // Collect class properties
            CollectClassPropertiesNames(pd, CollectedClassPropertiesNames);
            // Collect unit globals
            CollectUnitGlobalsNames(pd, CollectedUnitGlobalsNames);

            // Create maps :: idName -> captureName
            CreateCapturedLocalsNamesMap(CollectedLocalsNames, CapturedLocalsNamesMap);
            CreateCapturedFormalParamsNamesMap(CollectedFormalParamsNames, CapturedFormalParamsNamesMap);

            // AHAHA test!
            ReplaceCapturedVariablesVisitor rcapVis = new ReplaceCapturedVariablesVisitor(
                CollectedLocalsNames,
                CollectedFormalParamsNames,
                CollectedClassFieldsNames,
                CollectedClassMethodsNames,
                CollectedClassPropertiesNames,
                CollectedUnitGlobalsNames,
                CapturedLocalsNamesMap,
                CapturedFormalParamsNamesMap,
                isClassMethod
                );
            // Replace
            (pd.proc_body as block).program_code.visit(rcapVis);

            mids.vars.Except(dld.LocalDeletedDefsNames); // параметры остались. Их тоже надо исключать - они и так будут обработаны
            // В результате работы в mids.vars что-то осталось. Это не локальные переменные и с ними непонятно что делать

            // Обработать параметры!
            // Как? Ищем в mids formal_parametrs, но надо выделить именно обращение к параметрам - не полям класса, не глобальным переменным

            var cfa = new ConstructFiniteAutomata((pd.proc_body as block).program_code);
            cfa.Transform();
            (pd.proc_body as block).program_code = cfa.res;

            // Конструируем определение класса
            var cct = GenClassesForYield(pd, dld.LocalDeletedDefs, CapturedLocalsNamesMap, CapturedFormalParamsNamesMap); // все удаленные описания переменных делаем описанием класса

            //UpperNodeAs<declarations>().InsertBefore(pd, cct);
            if (isClassMethod)
            {
                var cd = UpperTo<class_definition>();
                if ((object)cd != null)
                {
                    var td = UpperTo<type_declarations>();
                    // Insert class predefenition!
                    var iteratorClassPredef = new type_declaration(GetClassName(pd), new class_definition(null));
                    td.types_decl.Insert(0, iteratorClassPredef);

                    foreach (var helperName in cct.types_decl.Select(ttd => ttd.type_name))
                    {
//.........这里部分代码省略.........
开发者ID:PascalABC-CompilerLaboratory,项目名称:ParsePABC,代码行数:101,代码来源:ProcessYieldsCapturedVars.cs

示例10: visit

		public void visit(procedure_definition _procedure_definition)
		{
			bw.Write((Int16)43);
			write_procedure_definition(_procedure_definition);
		}
开发者ID:Slav76,项目名称:pascalabcnet,代码行数:5,代码来源:SyntaxTreeStreamWriter.cs

示例11: BuildClassWithOneMethod

        public static type_declaration BuildClassWithOneMethod(string class_name, List<ident> names, List<type_definition> types, procedure_definition pd)
        {
            var formnames = names.Select(x => new ident("form"+x.name)).ToList();

            var cm1 = BuildClassFieldsSection(names, types);
            var cm2 = BuildSimpleConstructorSection(names, formnames, types);
            var cm3 = BuildOneMemberSection(pd);

            return new type_declaration(class_name, BuildClassOrRecordDefinition(true, cm1, cm2, cm3), BuildGenSC);
        }
开发者ID:lisiynos,项目名称:pascalabcnet,代码行数:10,代码来源:NodesBuilder.cs

示例12: InsertHelperMethod

        // frninja 31/05/16
        /// <summary>
        /// Вставляет метод-хелпер
        /// </summary>
        /// <param name="pd">Метод-итератор</param>
        /// <param name="helper">Метод-хелпер</param>
        private void InsertHelperMethod(procedure_definition pd, procedure_definition helper)
        {
            helper.proc_header.is_yield_helper = true;

            if (IsClassMethod(pd))
            {
                var cd = UpperTo<class_definition>();
                if (cd != null)
                {
                    // Метод класса описан в классе
                    var classMembers = UpperTo<class_members>();
                    classMembers.Add(helper);
                }
                else
                {
                    // Метод класса описан вне класса

                    var decls = UpperTo<declarations>();
                    var classMembers = decls.list
                        .Select(decl => decl as type_declarations)
                        .Where(tdecls => tdecls != null)
                        .SelectMany(tdecls => tdecls.types_decl)
                        .Where(td => td.type_name.name == GetClassName(pd).name)
                        .Select(td => td.type_def as class_definition)
                        .Where(_cd => _cd != null)
                        .SelectMany(_cd => _cd.body.class_def_blocks);


                    // Вставляем предописание метода-хелпера 
                    var helperPredefHeader = ObjectCopier.Clone(helper.proc_header);
                    helperPredefHeader.name.class_name = null;
                    classMembers.First().members.Insert(0, helperPredefHeader);

                    // Вставляем тело метода-хелпера
                    UpperTo<declarations>().InsertBefore(pd, helper);
                }
            }
            else
            {
                UpperTo<declarations>().InsertBefore(pd, helper);
            }
        }
开发者ID:Slav76,项目名称:pascalabcnet,代码行数:48,代码来源:ProcessYieldsCapturedVars.cs

示例13: CollectClassMethodsNames

        private void CollectClassMethodsNames(procedure_definition pd, ISet<string> collectedMethods)
        {
            ident className = GetClassName(pd);

            if (className != null)
            {
                CollectClassMethodsVisitor methodsVis = new CollectClassMethodsVisitor(className);
                var cu = UpperTo<compilation_unit>();
                if (cu != null)
                {
                    cu.visit(methodsVis);
                    // Collect
                    collectedMethods.UnionWith(methodsVis.CollectedMethods.Select(id => id.name));
                }
            }
        }
开发者ID:Slav76,项目名称:pascalabcnet,代码行数:16,代码来源:ProcessYieldsCapturedVars.cs

示例14: GetMethodWhereSection

        private where_definition_list GetMethodWhereSection(procedure_definition pd)
        {
            if (!IsClassMethod(pd))
            {
                if (pd.proc_header.where_defs != null)
                {
                    return ObjectCopier.Clone(pd.proc_header.where_defs);
                }
                else
                {
                    var pdPredefs = UpperTo<declarations>().defs
                        .OfType<procedure_definition>()
                        .Where(lpd => lpd.proc_body == null
                                && lpd.proc_header.name.meth_name.name == pd.proc_header.name.meth_name.name
                                && lpd.proc_header.proc_attributes.proc_attributes.FindIndex(attr => attr.attribute_type == proc_attribute.attr_forward) != -1);
                    if (pdPredefs.Count() > 0)
                    {
                        return ObjectCopier.Clone(pdPredefs.First().proc_header.where_defs);
                    }
                }
            }
            else
            {
                class_definition cd = GetMethodClassDefinition(pd);
                if (cd != null)
                {
                    return ObjectCopier.Clone(cd.where_section);
                }
            }

            return null;
        }
开发者ID:Slav76,项目名称:pascalabcnet,代码行数:32,代码来源:ProcessYieldsCapturedVars.cs

示例15: GetMethodClassDefinition

        private class_definition GetMethodClassDefinition(procedure_definition pd)
        {
            if (!IsClassMethod(pd))
            {
                return null;
            }

            var cd = UpperTo<class_definition>();
            if (cd != null)
            {
                // Метод класса описан в классе
                return cd;
            }
            else
            {
                // Метод класса описан вне класса

                return UpperTo<declarations>().list
                    .OfType<type_declarations>()
                    .SelectMany(tdecls => tdecls.types_decl)
                    .Where(td => td.type_name.name == GetClassName(pd).name)
                    .Select(td => td.type_def as class_definition)
                    .Where(_cd => _cd != null)
                    .DefaultIfEmpty()
                    .First();
            }
        }
开发者ID:Slav76,项目名称:pascalabcnet,代码行数:27,代码来源:ProcessYieldsCapturedVars.cs


注:本文中的PascalABCCompiler.SyntaxTree.procedure_definition类示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。