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