1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#:
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met:
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer in the
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    documentation and/or other materials provided with the distribution.
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    derived from this software without specific prior written permission.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Debug {
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using System.Collections.Generic;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** <summary>
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  Broadcast debug events to multiple listeners.  Lets you debug and still
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  use the event mechanism to build parse trees etc...  Not thread-safe.
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  Don't add events in one thread while parser fires events in another.
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  </summary>
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  <seealso cref="DebugEventRepeater"/>
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class DebugEventHub : IDebugEventListener {
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        List<IDebugEventListener> _listeners = new List<IDebugEventListener>();
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public DebugEventHub(params IDebugEventListener[] listeners) {
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            _listeners = new List<IDebugEventListener>(listeners);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Initialize() {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  Add another listener to broadcast events too.  Not thread-safe.
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  Don't add events in one thread while parser fires events in another.
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  </summary>
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void AddListener(IDebugEventListener listener) {
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            _listeners.Add(listener);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /* To avoid a mess like this:
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public void enterRule(final String ruleName) {
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                broadcast(new Code(){
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    public void exec(DebugEventListener listener) {listener.enterRule(ruleName);}}
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    );
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            I am dup'ing the for-loop in each.  Where are Java closures!? blech!
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void EnterRule(string grammarFileName, string ruleName) {
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterRule(grammarFileName, ruleName);
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ExitRule(string grammarFileName, string ruleName) {
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitRule(grammarFileName, ruleName);
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void EnterAlt(int alt) {
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterAlt(alt);
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void EnterSubRule(int decisionNumber) {
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterSubRule(decisionNumber);
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ExitSubRule(int decisionNumber) {
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitSubRule(decisionNumber);
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void EnterDecision(int decisionNumber, bool couldBacktrack) {
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterDecision(decisionNumber, couldBacktrack);
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ExitDecision(int decisionNumber) {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitDecision(decisionNumber);
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Location(int line, int pos) {
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Location(line, pos);
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ConsumeToken(IToken token) {
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeToken(token);
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ConsumeHiddenToken(IToken token) {
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeHiddenToken(token);
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void LT(int index, IToken t) {
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.LT(index, t);
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Mark(int index) {
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Mark(index);
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Rewind(int index) {
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Rewind(index);
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Rewind() {
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Rewind();
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void BeginBacktrack(int level) {
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BeginBacktrack(level);
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void EndBacktrack(int level, bool successful) {
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EndBacktrack(level, successful);
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void RecognitionException(RecognitionException e) {
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.RecognitionException(e);
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void BeginResync() {
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BeginResync();
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void EndResync() {
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EndResync();
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void SemanticPredicate(bool result, string predicate) {
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.SemanticPredicate(result, predicate);
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Commence() {
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Commence();
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Terminate() {
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Terminate();
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region Tree parsing stuff
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ConsumeNode(object t) {
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeNode(t);
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void LT(int index, object t) {
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.LT(index, t);
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region AST Stuff
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void NilNode(object t) {
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.NilNode(t);
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ErrorNode(object t) {
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ErrorNode(t);
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void CreateNode(object t) {
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.CreateNode(t);
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void CreateNode(object node, IToken token) {
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.CreateNode(node, token);
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void BecomeRoot(object newRoot, object oldRoot) {
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BecomeRoot(newRoot, oldRoot);
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void AddChild(object root, object child) {
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.AddChild(root, child);
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void SetTokenBoundaries(object t, int tokenStartIndex, int tokenStopIndex) {
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < _listeners.Count; i++) {
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IDebugEventListener listener = _listeners[i];
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.SetTokenBoundaries(t, tokenStartIndex, tokenStopIndex);
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
300