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