1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note to JL: Removed extension call syntax
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 System;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Antlr.Runtime.JavaExtensions;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using IOException = System.IO.IOException;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using ITreeAdaptor = Antlr.Runtime.Tree.ITreeAdaptor;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Socket = System.Net.Sockets.Socket;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using StringBuilder = System.Text.StringBuilder;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using TcpListener = System.Net.Sockets.TcpListener;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** <summary>
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  A proxy debug event listener that forwards events over a socket to
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  a debugger (or any other listener) using a simple text-based protocol;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  one event per line.  ANTLRWorks listens on server socket with a
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  RemoteDebugEventSocketListener instance.  These two objects must therefore
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  be kept in sync.  New events must be handled on both sides of socket.
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  </summary>
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class DebugEventSocketProxy : BlankDebugEventListener {
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public const int DefaultDebuggerPort = 49100;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected int port = DefaultDebuggerPort;
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected TcpListener serverSocket;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected Socket socket;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected string grammarFileName;
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //protected PrintWriter @out;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //protected BufferedReader @in;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>Who am i debugging?</summary> */
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected BaseRecognizer recognizer;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  Almost certainly the recognizer will have adaptor set, but
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  we don't know how to cast it (Parser or TreeParser) to get
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  the adaptor field.  Must be set with a constructor. :(
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  </summary>
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected ITreeAdaptor adaptor;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public DebugEventSocketProxy(BaseRecognizer recognizer, ITreeAdaptor adaptor) :
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this(recognizer, DefaultDebuggerPort, adaptor) {
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public DebugEventSocketProxy(BaseRecognizer recognizer, int port, ITreeAdaptor adaptor) {
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.grammarFileName = recognizer.GrammarFileName;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.adaptor = adaptor;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.port = port;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region Properties
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ITreeAdaptor TreeAdaptor {
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get {
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return adaptor;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            set {
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                adaptor = value;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Handshake() {
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (serverSocket == null) {
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                System.Net.IPHostEntry hostInfo = System.Net.Dns.GetHostEntry("localhost");
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                System.Net.IPAddress ipAddress = hostInfo.AddressList[0];
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                serverSocket = new TcpListener(ipAddress, port);
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                socket = serverSocket.AcceptSocket();
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                socket.NoDelay = true;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                socket.Send(encoding.GetBytes("ANTLR " + DebugEventListenerConstants.ProtocolVersion + "\n"));
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                socket.Send(encoding.GetBytes("grammar \"" + grammarFileName + "\n"));
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Ack();
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //serverSocket = new ServerSocket( port );
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //socket = serverSocket.accept();
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //socket.setTcpNoDelay( true );
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //OutputStream os = socket.getOutputStream();
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //OutputStreamWriter osw = new OutputStreamWriter( os, "UTF8" );
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@out = new PrintWriter( new BufferedWriter( osw ) );
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //InputStream @is = socket.getInputStream();
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //InputStreamReader isr = new InputStreamReader( @is, "UTF8" );
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@in = new BufferedReader( isr );
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@out.println( "ANTLR " + DebugEventListenerConstants.PROTOCOL_VERSION );
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@out.println( "grammar \"" + grammarFileName );
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@out.flush();
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //ack();
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void Commence() {
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // don't bother sending event; listener will trigger upon connection
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void Terminate() {
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("terminate");
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //@out.close();
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try {
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                socket.Close();
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } catch (IOException ioe) {
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace(ioe, Console.Error);
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Ack() {
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try {
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new NotImplementedException();
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //@in.readLine();
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } catch (IOException ioe) {
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ExceptionExtensions.PrintStackTrace(ioe, Console.Error);
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void Transmit(string @event) {
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            socket.Send(new System.Text.UTF8Encoding().GetBytes(@event + "\n"));
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //@out.println( @event );
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //@out.flush();
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Ack();
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void EnterRule(string grammarFileName, string ruleName) {
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("enterRule\t" + grammarFileName + "\t" + ruleName);
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void EnterAlt(int alt) {
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("enterAlt\t" + alt);
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ExitRule(string grammarFileName, string ruleName) {
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("exitRule\t" + grammarFileName + "\t" + ruleName);
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void EnterSubRule(int decisionNumber) {
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("enterSubRule\t" + decisionNumber);
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ExitSubRule(int decisionNumber) {
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("exitSubRule\t" + decisionNumber);
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void EnterDecision(int decisionNumber, bool couldBacktrack) {
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("enterDecision\t" + decisionNumber);
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ExitDecision(int decisionNumber) {
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("exitDecision\t" + decisionNumber);
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ConsumeToken(IToken t) {
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string buf = SerializeToken(t);
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("consumeToken\t" + buf);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ConsumeHiddenToken(IToken t) {
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string buf = SerializeToken(t);
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("consumeHiddenToken\t" + buf);
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void LT(int i, IToken t) {
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (t != null)
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Transmit("LT\t" + i + "\t" + SerializeToken(t));
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void Mark(int i) {
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("mark\t" + i);
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void Rewind(int i) {
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("rewind\t" + i);
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void Rewind() {
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("rewind");
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void BeginBacktrack(int level) {
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("beginBacktrack\t" + level);
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void EndBacktrack(int level, bool successful) {
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("endBacktrack\t" + level + "\t" + (successful ? DebugEventListenerConstants.True : DebugEventListenerConstants.False));
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void Location(int line, int pos) {
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("location\t" + line + "\t" + pos);
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void RecognitionException(RecognitionException e) {
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("exception\t");
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(e.GetType().Name);
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // dump only the data common to all exceptions for now
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(e.Index);
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(e.Line);
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(e.CharPositionInLine);
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit(buf.ToString());
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void BeginResync() {
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("beginResync");
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void EndResync() {
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("endResync");
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void SemanticPredicate(bool result, string predicate) {
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("semanticPredicate\t");
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(result);
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeText(buf, predicate);
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit(buf.ToString());
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region AST Parsing Events
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ConsumeNode(object t) {
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("consumeNode");
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeNode(buf, t);
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit(buf.ToString());
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void LT(int i, object t) {
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(t);
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = adaptor.GetText(t);
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = adaptor.GetType(t);
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("LN\t"); // lookahead node; distinguish from LT in protocol
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(i);
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeNode(buf, t);
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit(buf.ToString());
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void SerializeNode(StringBuilder buf, object t) {
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(t);
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = adaptor.GetText(t);
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = adaptor.GetType(t);
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(ID);
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(type);
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            IToken token = adaptor.GetToken(t);
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int line = -1;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int pos = -1;
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (token != null) {
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                line = token.Line;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                pos = token.CharPositionInLine;
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(line);
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(pos);
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int tokenIndex = adaptor.GetTokenStartIndex(t);
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(tokenIndex);
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeText(buf, text);
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region AST Events
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void NilNode(object t) {
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(t);
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("nilNode\t" + ID);
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void ErrorNode(object t) {
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(t);
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = t.ToString();
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("errorNode\t");
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(ID);
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(TokenTypes.Invalid);
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeText(buf, text);
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit(buf.ToString());
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void CreateNode(object t) {
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(t);
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = adaptor.GetText(t);
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = adaptor.GetType(t);
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("createNodeFromTokenElements\t");
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(ID);
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t");
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(type);
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeText(buf, text);
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit(buf.ToString());
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void CreateNode(object node, IToken token) {
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(node);
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int tokenIndex = token.TokenIndex;
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("createNode\t" + ID + "\t" + tokenIndex);
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void BecomeRoot(object newRoot, object oldRoot) {
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int newRootID = adaptor.GetUniqueID(newRoot);
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int oldRootID = adaptor.GetUniqueID(oldRoot);
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("becomeRoot\t" + newRootID + "\t" + oldRootID);
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void AddChild(object root, object child) {
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int rootID = adaptor.GetUniqueID(root);
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int childID = adaptor.GetUniqueID(child);
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("addChild\t" + rootID + "\t" + childID);
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public override void SetTokenBoundaries(object t, int tokenStartIndex, int tokenStopIndex) {
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID(t);
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Transmit("setTokenBoundaries\t" + ID + "\t" + tokenStartIndex + "\t" + tokenStopIndex);
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region Support
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual string SerializeToken(IToken t) {
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            StringBuilder buf = new StringBuilder(50);
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(t.TokenIndex);
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append('\t');
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(t.Type);
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append('\t');
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(t.Channel);
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append('\t');
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(t.Line);
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append('\t');
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(t.CharPositionInLine);
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SerializeText(buf, t.Text);
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return buf.ToString();
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual void SerializeText(StringBuilder buf, string text) {
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append("\t\"");
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (text == null) {
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                text = "";
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // escape \n and \r all text for token appears to exist on one line
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // this escape is slow but easy to understand
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            text = EscapeNewlines(text);
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.Append(text);
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected virtual string EscapeNewlines(string txt) {
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = StringExtensions.replaceAll(txt, "%", "%25");   // escape all escape char ;)
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = StringExtensions.replaceAll(txt, "\n", "%0A");  // escape \n
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            txt = StringExtensions.replaceAll(txt, "\r", "%0D");  // escape \r
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return txt;
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
394