pascalabcnet/_ParsePABC1/ParsePABC1/BaseVisitors/BaseChangeVisitor.cs

79 lines
2.5 KiB
C#
Raw Permalink Normal View History

2015-06-28 10:53:10 +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
2015-06-28 10:53:10 +03:00
{
public class BaseChangeVisitor : CollectUpperNodesVisitor
2015-06-28 10:53:10 +03:00
{
public override void DefaultVisit(syntax_tree_node n)
{
// Элементы списков - с конца в начало чтобы можно было эти элементы изменять по ходу (удалять/вставлять/заменять один несколькими)
var Сount = n.subnodes_count;
var СountWithoutListElements = n.subnodes_without_list_elements_count;
for (var i = 0; i < СountWithoutListElements; i++)
ProcessNode(n[i]);
for (var i = Сount - 1; i >= СountWithoutListElements; i--) // в обратном порядке
ProcessNode(n[i]);
}
2015-06-28 10:53:10 +03:00
public void Replace(syntax_tree_node from, syntax_tree_node to)
{
var upper = UpperNode();
if (upper == null)
throw new Exception("У корневого элемента нельзя получить UpperNode");
upper.Replace(from, to);
2015-06-28 10:53:10 +03:00
}
public T UpperNodeAs<T>(int up = 1) where T : syntax_tree_node
2015-06-28 10:53:10 +03:00
{
var stl = UpperNode(up) as T;
2015-06-28 10:53:10 +03:00
if (stl == null)
throw new Exception("Элемент вложен не в " + typeof(T));
2015-06-28 10:53:10 +03:00
return stl;
}
public bool DeleteInIdentList(ident id)
2015-06-28 10:53:10 +03:00
{
var idl = UpperNodeAs<ident_list>();
return idl.Remove(id);
2015-06-28 10:53:10 +03:00
}
public bool DeleteInStatementList(statement st)
2015-06-28 10:53:10 +03:00
{
var stl = UpperNodeAs<statement_list>();
return stl.Remove(st);
2015-06-28 10:53:10 +03:00
}
public static IEnumerable<statement> SeqStatements(params statement[] seq)
{
var l = new List<statement>();
foreach (var st in seq)
if (st is statement_list)
l.AddRange((st as statement_list).list);
else l.Add(st);
return l;
}
2015-06-28 10:53:10 +03:00
public void ReplaceStatement(statement from, statement to)
{
var stl = UpperNodeAs<statement_list>();
stl.Replace(from, to);
2015-06-28 10:53:10 +03:00
}
public void ReplaceStatement(statement from, IEnumerable<statement> to)
2015-06-28 10:53:10 +03:00
{
var stl = UpperNodeAs<statement_list>();
stl.Replace(from, to);
2015-06-28 10:53:10 +03:00
}
}
}