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); }
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); }
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 }
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; }