Пример #1
0
        public override void visit(variable_definitions vd)
        {
            if (vd.var_definitions.Any(vds => vds.vars.idents.Any(id => id.name.StartsWith("$"))))
            {
                return;
            }

            ++CurrentLevel;

            if (BlockNamesStack.Count <= CurrentLevel)
            {
                // Создаем отображение для имен текущего уровня вложенности мини-пространства имен
                BlockNamesStack.Add(new Dictionary <string, string>());
            }

            var newVD = new variable_definitions(
                vd.var_definitions.Select(vds =>
            {
                var newLocalNames = vds.vars.idents.Select(id =>
                {
                    var newName = this.CreateNewVariableName(id.name);
                    BlockNamesStack[CurrentLevel].Add(id.name, newName);
                    return(new ident(newName, id.source_context));
                });

                return(new var_def_statement(new ident_list(newLocalNames.ToArray()), vds.vars_type, vds.inital_value));
            }).ToList(),
                vd.source_context);

            Replace(vd, newVD);
            base.visit(newVD);
        }
Пример #2
0
        public override void visit(function_lambda_definition fld)
        {
            BlockNamesStack.Add(new Dictionary <string, string>());
            var last = BlockNamesStack.Count - 1;

            for (var i = 0; i < fld.parameters.expressions.Count; i++)
            {
                var qname = (fld.parameters.expressions[i] as ident).name.ToLower();
                BlockNamesStack[last][qname] = "-fl"; // -fl - формальный параметр лямбды - это стоп в поиске в GetNewVariableName
            }
            base.visit(fld);
        }
Пример #3
0
 public override void visit(formal_parameters fp)
 {
     if (!first_time_visit_function_header) // чтобы в лямбдах не заходить в формальные параметры. Во вложенных тоже не зайдёт
     {
         return;
     }
     // SSM переименование формальных параметров (нужно если мы их изменяем внутри)
     ++CurrentLevel;
     BlockNamesStack.Add(new Dictionary <string, string>());
     if (fp != null)
     {
         var fpids = fp.params_list.SelectMany(tp => tp.idents.idents);
         foreach (var v in fpids)
         {
             BlockNamesStack[CurrentLevel].Add(v.name, "$fp_" + v.name);
         }
     }
     // DO NOTHING
 }
Пример #4
0
        public override void visit(statement_list stlist)
        {
            ++CurrentLevel;

            if (BlockNamesStack.Count <= CurrentLevel)
            {
                // Создаем отображение для имен текущего уровня вложенности мини-пространства имен
                BlockNamesStack.Add(new Dictionary <string, string>());
            }

            //base.visit(stlist);
            for (var i = 0; i < stlist.list.Count; ++i)
            {
                ProcessNode(stlist.list[i]);
            }

            BlockNamesStack.RemoveAt(BlockNamesStack.Count - 1);

            --CurrentLevel;
        }