pascalabcnet/SyntaxTree/tree/WalkingVisitorNew.cs
miks1965 39449dffb4 Переделанные AbstractVisitor, WalkingVisitor.
Индексатор у syntax_tree_node теперь возвращает только подузлы, производные от syntax_tree_node
2015-07-27 21:54:07 +03:00

49 lines
1.4 KiB
C#

using System;
using System.Collections.Generic;
namespace PascalABCCompiler.SyntaxTree
{
//Äâà âàðèàíòà èñïîëüçîâàíèÿ âèçèòîðà:
//1. Ñîçäàòü ýêçåìïëÿð ýòîãî êëàññà, ïðèâÿçàòü ê OnEnter è OnLeave îáðàáîò÷èêè ïîñåùåíèé óçëà
//è çàïóñòèòü îáõîä. Âèçèòîð îáîéäåò äåðåâî è äëÿ êàæäîãî óçëà âûçîâåò ýòè îáðàáîò÷èêè.
//
//2. Óíàñëåäîâàòü îò ýòîãî êëàññà ñâîé êëàññ, â êîòîðîì ïåðåîðïåäåëèòü îáðàáîòêó íóæíûõ óçëîâ.
//Íå çàáûâàòü ïðè ýòîì î âûçîâå visit'îâ äëÿ ïîäóçëîâ (èëè base.visit), åñëè ýòî íóæíî.
public delegate void VisitorDelegateNew(syntax_tree_node node);
public class WalkingVisitorNew : AbstractVisitor
{
protected VisitorDelegateNew OnEnter;
protected VisitorDelegateNew OnLeave;
protected bool visitNode = true; // â OnEnter ìîæíî ñäåëàòü false
public virtual void ProcessNode(syntax_tree_node Node)
{
if (Node != null)
{
if (OnEnter != null)
OnEnter(Node);
if (visitNode)
Node.visit(this);
else visitNode = true;
if (OnLeave != null)
OnLeave(Node);
}
}
public override void DefaultVisit(syntax_tree_node n)
{
var count = n.subnodes_count;
for (var i = 0; i < count; i++)
ProcessNode(n[i]);
}
}
}