Индексатор у syntax_tree_node теперь возвращает только подузлы, производные от syntax_tree_node
49 lines
1.4 KiB
C#
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]);
|
|
}
|
|
}
|
|
|
|
} |