pascalabcnet/_ParsePABC1/ParsePABC1/YieldVisitors/DeleteAllLocalDefs.cs

44 lines
1.5 KiB
C#
Raw Permalink Normal View History

2015-08-21 10:24:12 +03:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
{
public class DeleteAllLocalDefs : BaseChangeVisitor
{
public List<var_def_statement> LocalDeletedDefs = new List<var_def_statement>(); // все локальные описания
public HashSet<string> LocalDeletedDefsNames = new HashSet<string>(); // их имена - для быстрого поиска
public DeleteAllLocalDefs() // надо запускать этот визитор начиная с корня подпрограммы
{
}
public override void visit(var_statement vs) // локальные описания внутри процедуры
{
LocalDeletedDefs.Add(vs.var_def);
DeleteInStatementList(vs);
LocalDeletedDefsNames.UnionWith(vs.var_def.vars.idents.Select(id => id.name));
}
public override void visit(variable_definitions vd)
{
foreach (var v in vd.list)
{
LocalDeletedDefs.Add(v);
LocalDeletedDefsNames.UnionWith(v.vars.idents.Select(id => id.name));
}
var d = UpperNodeAs<declarations>();
d.defs.Remove(vd); // может ли остаться список declarations пустым?
}
2015-08-26 13:48:16 +03:00
// еще - не заходить в лямбды
2015-08-21 10:24:12 +03:00
}
}