1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note to JL: Refactored extension methods
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"]
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met:
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer in the
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    documentation and/or other materials provided with the distribution.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    derived from this software without specific prior written permission.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Debug {
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Antlr.Runtime.JavaExtensions;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using BaseTree = Antlr.Runtime.Tree.BaseTree;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Console = System.Console;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Exception = System.Exception;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using IOException = System.IO.IOException;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using ITree = Antlr.Runtime.Tree.ITree;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Socket = System.Net.Sockets.Socket;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using SocketException = System.Net.Sockets.SocketException;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using TextReader = System.IO.TextReader;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using TextWriter = System.IO.TextWriter;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class RemoteDebugEventSocketListener {
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        const int MAX_EVENT_ELEMENTS = 8;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        IDebugEventListener listener;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        string machine;
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int port;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Socket channel = null;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TextWriter @out;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TextReader @in;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        string @event;
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>Version of ANTLR (dictates events)</summary> */
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public string version;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public string grammarFileName;
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  Track the last token index we saw during a consume.  If same, then
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  set a flag that we have a problem.
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  </summary>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int previousTokenIndex = -1;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        bool tokenIndexesInvalid = false;
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public class ProxyToken : IToken {
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int index;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int channel;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int line;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int charPos;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyToken(int index) {
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.index = index;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyToken(int index, int type, int channel,
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                              int line, int charPos, string text) {
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.index = index;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.type = type;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.channel = channel;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.line = line;
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.charPos = charPos;
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.text = text;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #region IToken Members
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public string Text {
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return text;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    text = value;
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int Type {
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return type;
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    type = value;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int Line {
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return line;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    line = value;
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int CharPositionInLine {
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return charPos;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    charPos = value;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int Channel {
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return channel;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    channel = value;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int StartIndex {
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return -1;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int StopIndex {
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return -1;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int TokenIndex {
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return index;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    index = value;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ICharStream InputStream {
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return null;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #endregion
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override string ToString() {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string channelStr = "";
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (channel != TokenChannels.Default) {
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    channelStr = ",channel=" + channel;
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return "[" + Text + "/<" + type + ">" + channelStr + "," + line + ":" + CharPositionInLine + ",@" + index + "]";
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public class ProxyTree : BaseTree {
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int ID;
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int line = 0;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int charPos = -1;
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public int tokenIndex = -1;
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text;
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyTree(int ID, int type, int line, int charPos, int tokenIndex, string text) {
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.ID = ID;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.type = type;
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.line = line;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.charPos = charPos;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.tokenIndex = tokenIndex;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.text = text;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public ProxyTree(int ID) {
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.ID = ID;
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #region Properties
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override string Text {
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return text;
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override int TokenStartIndex {
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return tokenIndex;
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override int TokenStopIndex {
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return 0;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override int Type {
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                get {
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return type;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                set {
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #endregion
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override ITree DupNode() {
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return null;
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            public override string ToString() {
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return "fix this";
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public RemoteDebugEventSocketListener(IDebugEventListener listener,
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                              string machine,
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                              int port) {
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.listener = listener;
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.machine = machine;
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.port = port;
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (!OpenConnection()) {
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new SocketException();
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void EventHandler() {
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try {
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Handshake();
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @event = @in.ReadLine();
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                while (@event != null) {
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Dispatch(@event);
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Ack();
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    @event = @in.ReadLine();
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } catch (Exception e) {
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine(e);
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace(e, Console.Error);
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } finally {
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                CloseConnection();
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual bool OpenConnection() {
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bool success = false;
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try {
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new System.NotImplementedException();
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //channel = new Socket( machine, port );
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //channel.setTcpNoDelay( true );
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //OutputStream os = channel.getOutputStream();
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //OutputStreamWriter osw = new OutputStreamWriter( os, "UTF8" );
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@out = new PrintWriter( new BufferedWriter( osw ) );
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //InputStream @is = channel.getInputStream();
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //InputStreamReader isr = new InputStreamReader( @is, "UTF8" );
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@in = new BufferedReader( isr );
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //success = true;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } catch (Exception e) {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine(e);
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return success;
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void CloseConnection() {
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try {
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @in.Close();
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @in = null;
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @out.Close();
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                @out = null;
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                channel.Close();
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                channel = null;
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } catch (Exception e) {
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine(e);
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace(e, Console.Error);
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } finally {
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (@in != null) {
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    try {
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        @in.Close();
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    } catch (IOException ioe) {
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        Console.Error.WriteLine(ioe);
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (@out != null) {
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    @out.Close();
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (channel != null) {
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    try {
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        channel.Close();
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    } catch (IOException ioe) {
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        Console.Error.WriteLine(ioe);
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Handshake() {
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string antlrLine = @in.ReadLine();
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] antlrElements = GetEventElements(antlrLine);
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            version = antlrElements[1];
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string grammarLine = @in.ReadLine();
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] grammarElements = GetEventElements(grammarLine);
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammarFileName = grammarElements[1];
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Ack();
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            listener.Commence(); // inform listener after handshake
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Ack() {
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @out.WriteLine("ack");
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @out.Flush();
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Dispatch(string line) {
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //JSystem.@out.println( "event: " + line );
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] elements = GetEventElements(line);
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (elements == null || elements[0] == null) {
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine("unknown debug event: " + line);
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (elements[0].Equals("enterRule")) {
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterRule(elements[1], elements[2]);
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("exitRule")) {
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitRule(elements[1], elements[2]);
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("enterAlt")) {
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterAlt(int.Parse(elements[1]));
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("enterSubRule")) {
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterSubRule(int.Parse(elements[1]));
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("exitSubRule")) {
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitSubRule(int.Parse(elements[1]));
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("enterDecision")) {
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EnterDecision(int.Parse(elements[1]), elements[2].Equals("true"));
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("exitDecision")) {
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ExitDecision(int.Parse(elements[1]));
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("location")) {
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Location(int.Parse(elements[1]),
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                  int.Parse(elements[2]));
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("consumeToken")) {
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyToken t = DeserializeToken(elements, 1);
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (t.TokenIndex == previousTokenIndex) {
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokenIndexesInvalid = true;
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                previousTokenIndex = t.TokenIndex;
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeToken(t);
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("consumeHiddenToken")) {
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyToken t = DeserializeToken(elements, 1);
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (t.TokenIndex == previousTokenIndex) {
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokenIndexesInvalid = true;
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                previousTokenIndex = t.TokenIndex;
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeHiddenToken(t);
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("LT")) {
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                IToken t = DeserializeToken(elements, 2);
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.LT(int.Parse(elements[1]), t);
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("mark")) {
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Mark(int.Parse(elements[1]));
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("rewind")) {
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (elements[1] != null) {
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    listener.Rewind(int.Parse(elements[1]));
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                } else {
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    listener.Rewind();
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("beginBacktrack")) {
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BeginBacktrack(int.Parse(elements[1]));
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("endBacktrack")) {
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int level = int.Parse(elements[1]);
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int successI = int.Parse(elements[2]);
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EndBacktrack(level, successI == DebugEventListenerConstants.True);
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("exception")) {
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if true
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new System.NotImplementedException();
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string excName = elements[1];
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string indexS = elements[2];
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string lineS = elements[3];
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string posS = elements[4];
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Class excClass = null;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                try
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    excClass = Class.forName( excName );
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    RecognitionException e =
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        (RecognitionException)excClass.newInstance();
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    e.index = int.Parse( indexS );
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    e.line = int.Parse( lineS );
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    e.charPositionInLine = int.Parse( posS );
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    listener.recognitionException( e );
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                catch ( ClassNotFoundException cnfe )
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Console.Error.println( "can't find class " + cnfe );
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    cnfe.printStackTrace( Console.Error );
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                catch ( InstantiationException ie )
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Console.Error.println( "can't instantiate class " + ie );
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    ie.printStackTrace( Console.Error );
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                catch ( IllegalAccessException iae )
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Console.Error.println( "can't access class " + iae );
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    iae.printStackTrace( Console.Error );
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("beginResync")) {
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BeginResync();
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("endResync")) {
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.EndResync();
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("terminate")) {
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.Terminate();
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("semanticPredicate")) {
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                bool result = bool.Parse(elements[1]);
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string predicateText = elements[2];
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                predicateText = UnEscapeNewlines(predicateText);
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.SemanticPredicate(result,
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                           predicateText);
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("consumeNode")) {
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = DeserializeNode(elements, 1);
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ConsumeNode(node);
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("LN")) {
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int i = int.Parse(elements[1]);
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = DeserializeNode(elements, 2);
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.LT(i, node);
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("createNodeFromTokenElements")) {
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse(elements[1]);
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int type = int.Parse(elements[2]);
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string text = elements[3];
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                text = UnEscapeNewlines(text);
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree(ID, type, -1, -1, -1, text);
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.CreateNode(node);
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("createNode")) {
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse(elements[1]);
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int tokenIndex = int.Parse(elements[2]);
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // create dummy node/token filled with ID, tokenIndex
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree(ID);
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyToken token = new ProxyToken(tokenIndex);
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.CreateNode(node, token);
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("nilNode")) {
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse(elements[1]);
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree(ID);
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.NilNode(node);
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("errorNode")) {
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // TODO: do we need a special tree here?
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse(elements[1]);
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int type = int.Parse(elements[2]);
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                string text = elements[3];
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                text = UnEscapeNewlines(text);
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree(ID, type, -1, -1, -1, text);
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.ErrorNode(node);
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("becomeRoot")) {
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int newRootID = int.Parse(elements[1]);
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int oldRootID = int.Parse(elements[2]);
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree newRoot = new ProxyTree(newRootID);
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree oldRoot = new ProxyTree(oldRootID);
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.BecomeRoot(newRoot, oldRoot);
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("addChild")) {
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int rootID = int.Parse(elements[1]);
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int childID = int.Parse(elements[2]);
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree root = new ProxyTree(rootID);
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree child = new ProxyTree(childID);
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.AddChild(root, child);
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else if (elements[0].Equals("setTokenBoundaries")) {
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int ID = int.Parse(elements[1]);
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ProxyTree node = new ProxyTree(ID);
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                listener.SetTokenBoundaries(
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    node,
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    int.Parse(elements[2]),
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    int.Parse(elements[3]));
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else {
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Console.Error.WriteLine("unknown debug event: " + line);
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual ProxyTree DeserializeNode(string[] elements, int offset) {
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = int.Parse(elements[offset + 0]);
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = int.Parse(elements[offset + 1]);
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int tokenLine = int.Parse(elements[offset + 2]);
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int charPositionInLine = int.Parse(elements[offset + 3]);
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int tokenIndex = int.Parse(elements[offset + 4]);
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = elements[offset + 5];
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            text = UnEscapeNewlines(text);
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return new ProxyTree(ID, type, tokenLine, charPositionInLine, tokenIndex, text);
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual ProxyToken DeserializeToken(string[] elements,
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                              int offset) {
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string indexS = elements[offset + 0];
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string typeS = elements[offset + 1];
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string channelS = elements[offset + 2];
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string lineS = elements[offset + 3];
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string posS = elements[offset + 4];
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = elements[offset + 5];
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            text = UnEscapeNewlines(text);
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int index = int.Parse(indexS);
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ProxyToken t =
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                new ProxyToken(index,
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse(typeS),
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse(channelS),
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse(lineS),
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               int.Parse(posS),
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                               text);
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return t;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>Create a thread to listen to the remote running recognizer</summary> */
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Start() {
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            System.Threading.Thread t = new System.Threading.Thread(Run);
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t.Start();
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Run() {
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            EventHandler();
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region Misc
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual string[] GetEventElements(string @event) {
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (@event == null) {
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return null;
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string[] elements = new string[MAX_EVENT_ELEMENTS];
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string str = null; // a string element if present (must be last)
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try {
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int firstQuoteIndex = @event.IndexOf('"');
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (firstQuoteIndex >= 0) {
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // treat specially; has a string argument like "a comment\n
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // Note that the string is terminated by \n not end quote.
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // Easier to parse that way.
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    string eventWithoutString = @event.Substring(0, firstQuoteIndex);
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    str = @event.Substring(firstQuoteIndex + 1);
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    @event = eventWithoutString;
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                StringTokenizer st = new StringTokenizer(@event, "\t", false);
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int i = 0;
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                while (st.hasMoreTokens()) {
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    if (i >= MAX_EVENT_ELEMENTS) {
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        // ErrorManager.internalError("event has more than "+MAX_EVENT_ELEMENTS+" args: "+event);
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        return elements;
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    elements[i] = st.nextToken();
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    i++;
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (str != null) {
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    elements[i] = str;
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } catch (Exception e) {
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace(e, Console.Error);
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return elements;
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual string UnEscapeNewlines(string txt) {
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // this unescape is slow but easy to understand
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = StringExtensions.replaceAll(txt, "%0A", "\n");  // unescape \n
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = StringExtensions.replaceAll(txt, "%0D", "\r");  // unescape \r
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = StringExtensions.replaceAll(txt, "%25", "%");   // undo escaped escape chars
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return txt;
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual bool TokenIndexesAreInvalid() {
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return false;
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //return tokenIndexesInvalid;
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
589