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{
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Antlr.Runtime.JavaExtensions;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Array = System.Array;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using BaseTree = Antlr.Runtime.Tree.BaseTree;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Console = System.Console;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Exception = System.Exception;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using IOException = System.IO.IOException;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using ITree = Antlr.Runtime.Tree.ITree;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Math = System.Math;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Socket = System.Net.Sockets.Socket;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using SocketException = System.Net.Sockets.SocketException;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using TextReader = System.IO.TextReader;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using TextWriter = System.IO.TextWriter;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class RemoteDebugEventSocketListener
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        const int MAX_EVENT_ELEMENTS = 8;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        IDebugEventListener listener;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        string machine;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int port;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Socket channel = null;
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TextWriter @out;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TextReader @in;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        string @event;
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>Version of ANTLR (dictates events)</summary> */
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public string version;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public string grammarFileName;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  Track the last token index we saw during a consume.  If same, then
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  set a flag that we have a problem.
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  </summary>
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int previousTokenIndex = -1;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        bool tokenIndexesInvalid = false;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public class ProxyToken : IToken
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int index;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int channel;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int line;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int charPos;
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyToken( int index )
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.index = index;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyToken( int index, int type, int channel,
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                              int line, int charPos, string text )
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.index = index;
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.type = type;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.channel = channel;
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.line = line;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.charPos = charPos;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.text = text;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #region IToken Members
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public string Text
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return text;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    text = value;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int Type
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return type;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    type = value;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int Line
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return line;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    line = value;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int CharPositionInLine
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return charPos;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    charPos = value;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int Channel
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return channel;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    channel = value;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int StartIndex
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return -1;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int StopIndex
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return -1;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int TokenIndex
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return index;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    index = value;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ICharStream InputStream
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return null;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #endregion
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override string ToString()
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string channelStr = "";
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( channel != TokenChannels.Default )
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    channelStr = ",channel=" + channel;
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return "[" + Text + "/<" + type + ">" + channelStr + "," + line + ":" + CharPositionInLine + ",@" + index + "]";
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public class ProxyTree : BaseTree
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int ID;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int line = 0;
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int charPos = -1;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int tokenIndex = -1;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyTree( int ID, int type, int line, int charPos, int tokenIndex, string text )
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.ID = ID;
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.type = type;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.line = line;
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.charPos = charPos;
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.tokenIndex = tokenIndex;
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.text = text;
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyTree( int ID )
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.ID = ID;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #region Properties
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override string Text
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return text;
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override int TokenStartIndex
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return tokenIndex;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override int TokenStopIndex
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return 0;
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override int Type
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return type;
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #endregion
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override ITree DupNode()
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return null;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override string ToString()
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return "fix this";
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public RemoteDebugEventSocketListener( IDebugEventListener listener,
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                              string machine,
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                              int port )
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.listener = listener;
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.machine = machine;
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.port = port;
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( !OpenConnection() )
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new SocketException();
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void EventHandler()
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Handshake();
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @event = @in.ReadLine();
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                while ( @event != null )
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Dispatch( @event );
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Ack();
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    @event = @in.ReadLine();
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            catch ( Exception e )
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine( e );
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace( e, Console.Error );
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            finally
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                CloseConnection();
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual bool OpenConnection()
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bool success = false;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new System.NotImplementedException();
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //channel = new Socket( machine, port );
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //channel.setTcpNoDelay( true );
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //OutputStream os = channel.getOutputStream();
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //OutputStreamWriter osw = new OutputStreamWriter( os, "UTF8" );
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@out = new PrintWriter( new BufferedWriter( osw ) );
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //InputStream @is = channel.getInputStream();
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //InputStreamReader isr = new InputStreamReader( @is, "UTF8" );
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@in = new BufferedReader( isr );
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //success = true;
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            catch ( Exception e )
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine( e );
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return success;
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void CloseConnection()
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @in.Close();
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @in = null;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @out.Close();
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @out = null;
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                channel.Close();
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                channel = null;
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            catch ( Exception e )
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine( e );
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace( e, Console.Error );
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            finally
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( @in != null )
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    try
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    {
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        @in.Close();
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    catch ( IOException ioe )
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    {
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        Console.Error.WriteLine( ioe );
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( @out != null )
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    @out.Close();
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( channel != null )
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    try
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    {
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        channel.Close();
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    catch ( IOException ioe )
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    {
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        Console.Error.WriteLine( ioe );
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Handshake()
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string antlrLine = @in.ReadLine();
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] antlrElements = GetEventElements( antlrLine );
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            version = antlrElements[1];
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string grammarLine = @in.ReadLine();
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] grammarElements = GetEventElements( grammarLine );
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammarFileName = grammarElements[1];
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Ack();
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            listener.Commence(); // inform listener after handshake
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Ack()
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @out.WriteLine( "ack" );
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @out.Flush();
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Dispatch( string line )
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //JSystem.@out.println( "event: " + line );
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] elements = GetEventElements( line );
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( elements == null || elements[0] == null )
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine( "unknown debug event: " + line );
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return;
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( elements[0].Equals( "enterRule" ) )
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterRule( elements[1], elements[2] );
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "exitRule" ) )
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitRule( elements[1], elements[2] );
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "enterAlt" ) )
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterAlt( int.Parse( elements[1] ) );
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "enterSubRule" ) )
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterSubRule( int.Parse( elements[1] ) );
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "exitSubRule" ) )
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitSubRule( int.Parse( elements[1] ) );
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "enterDecision" ) )
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterDecision(int.Parse(elements[1]), elements[2].Equals("true"));
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "exitDecision" ) )
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitDecision( int.Parse( elements[1] ) );
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "location" ) )
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Location( int.Parse( elements[1] ),
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                  int.Parse( elements[2] ) );
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "consumeToken" ) )
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyToken t = DeserializeToken( elements, 1 );
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( t.TokenIndex == previousTokenIndex )
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokenIndexesInvalid = true;
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                previousTokenIndex = t.TokenIndex;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeToken( t );
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "consumeHiddenToken" ) )
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyToken t = DeserializeToken( elements, 1 );
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( t.TokenIndex == previousTokenIndex )
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokenIndexesInvalid = true;
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                previousTokenIndex = t.TokenIndex;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeHiddenToken( t );
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "LT" ) )
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IToken t = DeserializeToken( elements, 2 );
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.LT( int.Parse( elements[1] ), t );
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "mark" ) )
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Mark( int.Parse( elements[1] ) );
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "rewind" ) )
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( elements[1] != null )
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    listener.Rewind( int.Parse( elements[1] ) );
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    listener.Rewind();
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "beginBacktrack" ) )
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BeginBacktrack( int.Parse( elements[1] ) );
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "endBacktrack" ) )
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int level = int.Parse( elements[1] );
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int successI = int.Parse( elements[2] );
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EndBacktrack( level, successI == DebugEventListenerConstants.True );
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "exception" ) )
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if true
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new System.NotImplementedException();
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string excName = elements[1];
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string indexS = elements[2];
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string lineS = elements[3];
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string posS = elements[4];
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Class excClass = null;
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                try
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    excClass = Class.forName( excName );
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    RecognitionException e =
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        (RecognitionException)excClass.newInstance();
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    e.index = int.Parse( indexS );
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    e.line = int.Parse( lineS );
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    e.charPositionInLine = int.Parse( posS );
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    listener.recognitionException( e );
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                catch ( ClassNotFoundException cnfe )
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Console.Error.println( "can't find class " + cnfe );
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    cnfe.printStackTrace( Console.Error );
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                catch ( InstantiationException ie )
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Console.Error.println( "can't instantiate class " + ie );
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    ie.printStackTrace( Console.Error );
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                catch ( IllegalAccessException iae )
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Console.Error.println( "can't access class " + iae );
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    iae.printStackTrace( Console.Error );
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "beginResync" ) )
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BeginResync();
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "endResync" ) )
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EndResync();
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "terminate" ) )
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Terminate();
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "semanticPredicate" ) )
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                bool result = bool.Parse( elements[1] );
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string predicateText = elements[2];
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                predicateText = UnEscapeNewlines( predicateText );
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.SemanticPredicate( result,
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                           predicateText );
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "consumeNode" ) )
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = DeserializeNode( elements, 1 );
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeNode( node );
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "LN" ) )
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int i = int.Parse( elements[1] );
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = DeserializeNode( elements, 2 );
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.LT( i, node );
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "createNodeFromTokenElements" ) )
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse( elements[1] );
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int type = int.Parse( elements[2] );
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string text = elements[3];
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                text = UnEscapeNewlines( text );
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree( ID, type, -1, -1, -1, text );
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.CreateNode( node );
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "createNode" ) )
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse( elements[1] );
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int tokenIndex = int.Parse( elements[2] );
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // create dummy node/token filled with ID, tokenIndex
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree( ID );
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyToken token = new ProxyToken( tokenIndex );
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.CreateNode( node, token );
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "nilNode" ) )
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse( elements[1] );
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree( ID );
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.NilNode( node );
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "errorNode" ) )
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // TODO: do we need a special tree here?
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse( elements[1] );
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int type = int.Parse( elements[2] );
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string text = elements[3];
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                text = UnEscapeNewlines( text );
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree( ID, type, -1, -1, -1, text );
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ErrorNode( node );
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "becomeRoot" ) )
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int newRootID = int.Parse( elements[1] );
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int oldRootID = int.Parse( elements[2] );
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree newRoot = new ProxyTree( newRootID );
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree oldRoot = new ProxyTree( oldRootID );
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BecomeRoot( newRoot, oldRoot );
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "addChild" ) )
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int rootID = int.Parse( elements[1] );
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int childID = int.Parse( elements[2] );
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree root = new ProxyTree( rootID );
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree child = new ProxyTree( childID );
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.AddChild( root, child );
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if ( elements[0].Equals( "setTokenBoundaries" ) )
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse( elements[1] );
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree( ID );
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.SetTokenBoundaries(
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    node,
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    int.Parse( elements[2] ),
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    int.Parse( elements[3] ) );
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine( "unknown debug event: " + line );
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual ProxyTree DeserializeNode( string[] elements, int offset )
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = int.Parse( elements[offset + 0] );
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = int.Parse( elements[offset + 1] );
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int tokenLine = int.Parse( elements[offset + 2] );
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int charPositionInLine = int.Parse( elements[offset + 3] );
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int tokenIndex = int.Parse( elements[offset + 4] );
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = elements[offset + 5];
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            text = UnEscapeNewlines( text );
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return new ProxyTree( ID, type, tokenLine, charPositionInLine, tokenIndex, text );
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual ProxyToken DeserializeToken( string[] elements,
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                              int offset )
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string indexS = elements[offset + 0];
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string typeS = elements[offset + 1];
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string channelS = elements[offset + 2];
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string lineS = elements[offset + 3];
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string posS = elements[offset + 4];
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = elements[offset + 5];
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            text = UnEscapeNewlines( text );
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int index = int.Parse( indexS );
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ProxyToken t =
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                new ProxyToken( index,
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse( typeS ),
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse( channelS ),
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse( lineS ),
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse( posS ),
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               text );
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return t;
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>Create a thread to listen to the remote running recognizer</summary> */
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Start()
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            System.Threading.Thread t = new System.Threading.Thread( Run );
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t.Start();
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Run()
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            EventHandler();
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region Misc
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual string[] GetEventElements( string @event )
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( @event == null )
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return null;
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] elements = new string[MAX_EVENT_ELEMENTS];
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string str = null; // a string element if present (must be last)
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int firstQuoteIndex = @event.IndexOf( '"' );
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( firstQuoteIndex >= 0 )
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // treat specially; has a string argument like "a comment\n
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // Note that the string is terminated by \n not end quote.
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // Easier to parse that way.
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    string eventWithoutString = @event.Substring( 0, firstQuoteIndex );
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    str = @event.Substring( firstQuoteIndex + 1 );
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    @event = eventWithoutString;
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string[] tokens = @event.Split('\t');
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Array.Copy(tokens, elements, Math.Min(tokens.Length, MAX_EVENT_ELEMENTS));
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (tokens.Length >= MAX_EVENT_ELEMENTS)
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return elements;
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( str != null )
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    elements[tokens.Length] = str;
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            catch ( Exception e )
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace( e, Console.Error );
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return elements;
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual string UnEscapeNewlines( string txt )
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // this unescape is slow but easy to understand
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = txt.Replace( "%0A", "\n" );  // unescape \n
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = txt.Replace( "%0D", "\r" );  // unescape \r
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = txt.Replace( "%25", "%" );   // undo escaped escape chars
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return txt;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual bool TokenIndexesAreInvalid()
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return tokenIndexesInvalid;
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
745