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