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