00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 namespace Antlr.Runtime.Debug
00037 {
00038 using System;
00039 using System.Globalization;
00040 using System.Threading;
00041 using StreamReader = System.IO.StreamReader;
00042 using StreamWriter = System.IO.StreamWriter;
00043 using IOException = System.IO.IOException;
00044 using Encoding = System.Text.Encoding;
00045 using StringBuilder = System.Text.StringBuilder;
00046 using TcpClient = System.Net.Sockets.TcpClient;
00047 using TcpListener = System.Net.Sockets.TcpListener;
00048 using Antlr.Runtime;
00049 using ITree = Antlr.Runtime.Tree.ITree;
00050 using BaseTree = Antlr.Runtime.Tree.BaseTree;
00051
00052
00053 public class RemoteDebugEventSocketListener
00054 {
00055 internal const int MAX_EVENT_ELEMENTS = 8;
00056 internal IDebugEventListener listener;
00057 internal string hostName;
00058 internal int port;
00059 internal TcpClient channel = null;
00060 internal StreamWriter writer;
00061 internal StreamReader reader;
00062 internal string eventLabel;
00064 public string version;
00065 public string grammarFileName;
00070 int previousTokenIndex = -1;
00071 bool tokenIndexesInvalid = false;
00072
00073 #region ProxyToken Class
00074
00075 public class ProxyToken : IToken
00076 {
00077 internal int index;
00078 internal int type;
00079 internal int channel;
00080 internal int line;
00081 internal int charPos;
00082 internal string text;
00083
00084 public ProxyToken(int index)
00085 {
00086 this.index = index;
00087 }
00088
00089 public ProxyToken(int index, int type, int channel, int line, int charPos, string text)
00090 {
00091 this.index = index;
00092 this.type = type;
00093 this.channel = channel;
00094 this.line = line;
00095 this.charPos = charPos;
00096 this.text = text;
00097 }
00098
00099 public int Type
00100 {
00101 get { return this.type; }
00102 set { this.type = value; }
00103 }
00104
00105 public int Line
00106 {
00107 get { return this.line; }
00108 set { this.line = value; }
00109 }
00110
00111 public int CharPositionInLine
00112 {
00113 get { return this.charPos; }
00114 set { this.charPos = value; }
00115 }
00116
00117 public int Channel
00118 {
00119 get { return this.channel; }
00120 set { this.channel = value; }
00121 }
00122
00123 public int TokenIndex
00124 {
00125 get { return this.index; }
00126 set { this.index = value; }
00127 }
00128
00129 public string Text
00130 {
00131 get { return this.text; }
00132 set { this.text = value; }
00133 }
00134
00135 public ICharStream InputStream
00136 {
00137 get { return null; }
00138 set { ; }
00139 }
00140
00141 public override string ToString()
00142 {
00143 string channelStr = "";
00144 if (channel != Token.DEFAULT_CHANNEL)
00145 {
00146 channelStr = ",channel=" + channel;
00147 }
00148 return "[" + Text + "/<" + type + ">" + channelStr + "," + line + ":" + CharPositionInLine + ",@" + index + "]";
00149 }
00150 }
00151
00152 #endregion
00153
00154 #region ProxyTree Class
00155
00156 public class ProxyTree : BaseTree
00157 {
00158 public int ID;
00159 public int type;
00160 public int line = 0;
00161 public int charPos = -1;
00162 public int tokenIndex = -1;
00163 public string text;
00164
00165 public ProxyTree(int ID)
00166 {
00167 this.ID = ID;
00168 }
00169
00170 public ProxyTree(int ID, int type, int line, int charPos, int tokenIndex, string text)
00171 {
00172 this.ID = ID;
00173 this.type = type;
00174 this.line = line;
00175 this.charPos = charPos;
00176 this.tokenIndex = tokenIndex;
00177 this.text = text;
00178 }
00179
00180 override public int TokenStartIndex
00181 {
00182 get { return tokenIndex; }
00183 set { ; }
00184 }
00185 override public int TokenStopIndex
00186 {
00187 get { return 0; }
00188 set { ; }
00189 }
00190 override public ITree DupNode()
00191 {
00192 return null;
00193 }
00194 override public int Type
00195 {
00196 get { return type; }
00197 }
00198 override public string Text
00199 {
00200 get { return text; }
00201 }
00202
00203 override public string ToString()
00204 {
00205 return "fix this";
00206 }
00207 }
00208
00209 #endregion
00210
00211 public RemoteDebugEventSocketListener(IDebugEventListener listener, string hostName, int port)
00212 {
00213 this.listener = listener;
00214 this.hostName = hostName;
00215 this.port = port;
00216
00217 if (!OpenConnection())
00218 {
00219 throw new System.Exception();
00220 }
00221 }
00222
00223 protected virtual void EventHandler()
00224 {
00225 try
00226 {
00227 Handshake();
00228 eventLabel = reader.ReadLine();
00229 while (eventLabel != null)
00230 {
00231 Dispatch(eventLabel);
00232 Ack();
00233 eventLabel = reader.ReadLine();
00234 }
00235 }
00236 catch (System.Exception e)
00237 {
00238 Console.Error.WriteLine(e);
00239 Console.Error.WriteLine(e.StackTrace);
00240 }
00241 finally
00242 {
00243 CloseConnection();
00244 }
00245 }
00246
00247 protected virtual bool OpenConnection()
00248 {
00249 bool success = false;
00250 try
00251 {
00252 channel = new TcpClient(hostName, port);
00253 channel.NoDelay = true;
00254 writer = new StreamWriter(channel.GetStream(), Encoding.UTF8);
00255 reader = new StreamReader(channel.GetStream(), Encoding.UTF8);
00256 success = true;
00257 }
00258 catch (Exception e)
00259 {
00260 Console.Error.WriteLine(e);
00261 }
00262 return success;
00263 }
00264
00265 protected virtual void CloseConnection()
00266 {
00267 try
00268 {
00269 reader.Close(); reader = null;
00270 writer.Close();
00271 writer = null;
00272 channel.Close();
00273 channel = null;
00274 }
00275 catch (System.Exception e)
00276 {
00277 Console.Error.WriteLine(e);
00278 Console.Error.WriteLine(e.StackTrace);
00279 }
00280 finally
00281 {
00282 if (reader != null)
00283 {
00284 try
00285 {
00286 reader.Close();
00287 }
00288 catch (IOException ioe)
00289 {
00290 Console.Error.WriteLine(ioe);
00291 }
00292 }
00293 if (writer != null)
00294 {
00295 writer.Close();
00296 }
00297 if (channel != null)
00298 {
00299 try
00300 {
00301 channel.Close();
00302 }
00303 catch (IOException ioe)
00304 {
00305 Console.Error.WriteLine(ioe);
00306 }
00307 }
00308 }
00309 }
00310
00311 protected virtual void Handshake()
00312 {
00313 string antlrLine = reader.ReadLine();
00314 string[] antlrElements = GetEventElements(antlrLine);
00315 version = antlrElements[1];
00316 string grammarLine = reader.ReadLine();
00317 string[] grammarElements = GetEventElements(grammarLine);
00318 grammarFileName = grammarElements[1];
00319 Ack();
00320 listener.Commence();
00321 }
00322
00323 protected virtual void Ack()
00324 {
00325 writer.WriteLine("ack");
00326 writer.Flush();
00327 }
00328
00329 protected virtual void Dispatch(string line)
00330 {
00331 string[] elements = GetEventElements(line);
00332 if (elements == null || elements[0] == null)
00333 {
00334 Console.Error.WriteLine("unknown debug event: " + line);
00335 return ;
00336 }
00337 if (elements[0].Equals("enterRule"))
00338 {
00339 listener.EnterRule(elements[1], elements[2]);
00340 }
00341 else if (elements[0].Equals("exitRule"))
00342 {
00343 listener.ExitRule(elements[1], elements[2]);
00344 }
00345 else if (elements[0].Equals("enterAlt"))
00346 {
00347 listener.EnterAlt(int.Parse(elements[1], CultureInfo.InvariantCulture));
00348 }
00349 else if (elements[0].Equals("enterSubRule"))
00350 {
00351 listener.EnterSubRule(int.Parse(elements[1], CultureInfo.InvariantCulture));
00352 }
00353 else if (elements[0].Equals("exitSubRule"))
00354 {
00355 listener.ExitSubRule(int.Parse(elements[1], CultureInfo.InvariantCulture));
00356 }
00357 else if (elements[0].Equals("enterDecision"))
00358 {
00359 listener.EnterDecision(int.Parse(elements[1], CultureInfo.InvariantCulture));
00360 }
00361 else if (elements[0].Equals("exitDecision"))
00362 {
00363 listener.ExitDecision(int.Parse(elements[1], CultureInfo.InvariantCulture));
00364 }
00365 else if (elements[0].Equals("location"))
00366 {
00367 listener.Location(int.Parse(elements[1], CultureInfo.InvariantCulture),
00368 int.Parse(elements[2], CultureInfo.InvariantCulture));
00369 }
00370 else if (elements[0].Equals("consumeToken"))
00371 {
00372 ProxyToken t = DeserializeToken(elements, 1);
00373 if (t.TokenIndex == previousTokenIndex)
00374 {
00375 tokenIndexesInvalid = true;
00376 }
00377 previousTokenIndex = t.TokenIndex;
00378 listener.ConsumeToken(t);
00379 }
00380 else if (elements[0].Equals("consumeHiddenToken"))
00381 {
00382 ProxyToken t = DeserializeToken(elements, 1);
00383 if (t.TokenIndex == previousTokenIndex)
00384 {
00385 tokenIndexesInvalid = true;
00386 }
00387 previousTokenIndex = t.TokenIndex;
00388 listener.ConsumeHiddenToken(t);
00389 }
00390 else if (elements[0].Equals("LT"))
00391 {
00392 IToken t = DeserializeToken(elements, 2);
00393 listener.LT(int.Parse(elements[1], CultureInfo.InvariantCulture), t);
00394 }
00395 else if (elements[0].Equals("mark"))
00396 {
00397 listener.Mark(int.Parse(elements[1], CultureInfo.InvariantCulture));
00398 }
00399 else if (elements[0].Equals("rewind"))
00400 {
00401 if (elements[1] != null)
00402 {
00403 listener.Rewind(int.Parse(elements[1], CultureInfo.InvariantCulture));
00404 }
00405 else
00406 {
00407 listener.Rewind();
00408 }
00409 }
00410 else if (elements[0].Equals("beginBacktrack"))
00411 {
00412 listener.BeginBacktrack(int.Parse(elements[1], CultureInfo.InvariantCulture));
00413 }
00414 else if (elements[0].Equals("endBacktrack"))
00415 {
00416 int level = int.Parse(elements[1], CultureInfo.InvariantCulture);
00417 int successI = int.Parse(elements[2], CultureInfo.InvariantCulture);
00418
00419 listener.EndBacktrack(level, successI == 1 );
00420 }
00421 else if (elements[0].Equals("exception"))
00422 {
00423 string excName = elements[1];
00424 string indexS = elements[2];
00425 string lineS = elements[3];
00426 string posS = elements[4];
00427 Type excClass = null;
00428 try
00429 {
00430 excClass = System.Type.GetType(excName);
00431 RecognitionException e = (RecognitionException) System.Activator.CreateInstance(excClass);
00432 e.Index = int.Parse(indexS, CultureInfo.InvariantCulture);
00433 e.Line = int.Parse(lineS, CultureInfo.InvariantCulture);
00434 e.CharPositionInLine = int.Parse(posS, CultureInfo.InvariantCulture);
00435 listener.RecognitionException(e);
00436 }
00437 catch (System.UnauthorizedAccessException iae)
00438 {
00439 Console.Error.WriteLine("can't access class " + iae);
00440 Console.Error.WriteLine(iae.StackTrace);
00441 }
00442 }
00443 else if (elements[0].Equals("beginResync"))
00444 {
00445 listener.BeginResync();
00446 }
00447 else if (elements[0].Equals("endResync"))
00448 {
00449 listener.EndResync();
00450 }
00451 else if (elements[0].Equals("terminate"))
00452 {
00453 listener.Terminate();
00454 }
00455 else if (elements[0].Equals("semanticPredicate"))
00456 {
00457 bool result = bool.Parse(elements[1]);
00458 string predicateText = elements[2];
00459 predicateText = UnEscapeNewlines(predicateText);
00460 listener.SemanticPredicate(result, predicateText);
00461 }
00462 else if (elements[0].Equals("consumeNode"))
00463 {
00464 ProxyTree node = DeserializeNode(elements, 1);
00465 listener.ConsumeNode(node);
00466 }
00467 else if (elements[0].Equals("LN"))
00468 {
00469 int i = int.Parse(elements[1], CultureInfo.InvariantCulture);
00470 ProxyTree node = DeserializeNode(elements, 2);
00471 listener.LT(i, node);
00472 }
00473 else if (elements[0].Equals("createNodeFromTokenElements"))
00474 {
00475 int ID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00476 int type = int.Parse(elements[2], CultureInfo.InvariantCulture);
00477 string text = elements[3];
00478 text = UnEscapeNewlines(text);
00479 ProxyTree node = new ProxyTree(ID, type, -1, -1, -1, text);
00480 listener.CreateNode(node);
00481 }
00482 else if (elements[0].Equals("createNode"))
00483 {
00484 int ID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00485 int tokenIndex = int.Parse(elements[2], CultureInfo.InvariantCulture);
00486
00487 ProxyTree node = new ProxyTree(ID);
00488 ProxyToken token = new ProxyToken(tokenIndex);
00489 listener.CreateNode(node, token);
00490 }
00491 else if (elements[0].Equals("nilNode"))
00492 {
00493 int ID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00494 ProxyTree node = new ProxyTree(ID);
00495 listener.GetNilNode(node);
00496 }
00497 else if ( elements[0].Equals("errorNode") ) {
00498
00499 int ID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00500 int type = int.Parse(elements[2], CultureInfo.InvariantCulture);
00501 String text = elements[3];
00502 text = UnEscapeNewlines(text);
00503 ProxyTree node = new ProxyTree(ID, type, -1, -1, -1, text);
00504 listener.ErrorNode(node);
00505 }
00506 else if (elements[0].Equals("becomeRoot"))
00507 {
00508 int newRootID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00509 int oldRootID = int.Parse(elements[2], CultureInfo.InvariantCulture);
00510 ProxyTree newRoot = new ProxyTree(newRootID);
00511 ProxyTree oldRoot = new ProxyTree(oldRootID);
00512 listener.BecomeRoot(newRoot, oldRoot);
00513 }
00514 else if (elements[0].Equals("addChild"))
00515 {
00516 int rootID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00517 int childID = int.Parse(elements[2], CultureInfo.InvariantCulture);
00518 ProxyTree root = new ProxyTree(rootID);
00519 ProxyTree child = new ProxyTree(childID);
00520 listener.AddChild(root, child);
00521 }
00522 else if (elements[0].Equals("setTokenBoundaries"))
00523 {
00524 int ID = int.Parse(elements[1], CultureInfo.InvariantCulture);
00525 ProxyTree node = new ProxyTree(ID);
00526 listener.SetTokenBoundaries(node,
00527 int.Parse(elements[2], CultureInfo.InvariantCulture),
00528 int.Parse(elements[3], CultureInfo.InvariantCulture));
00529 }
00530 else
00531 {
00532 Console.Error.WriteLine("unknown debug event: " + line);
00533 }
00534 }
00535
00536 protected internal ProxyTree DeserializeNode(string[] elements, int offset)
00537 {
00538 int ID = int.Parse(elements[offset + 0], CultureInfo.InvariantCulture);
00539 int type = int.Parse(elements[offset + 1], CultureInfo.InvariantCulture);
00540 int tokenLine = int.Parse(elements[offset + 2], CultureInfo.InvariantCulture);
00541 int charPositionInLine = int.Parse(elements[offset + 3], CultureInfo.InvariantCulture);
00542 int tokenIndex = int.Parse(elements[offset + 4], CultureInfo.InvariantCulture);
00543 string text = elements[offset + 5];
00544 text = UnEscapeNewlines(text);
00545 return new ProxyTree(ID, type, tokenLine, charPositionInLine, tokenIndex, text);
00546 }
00547
00548 protected internal virtual ProxyToken DeserializeToken(string[] elements, int offset)
00549 {
00550 string indexS = elements[offset + 0];
00551 string typeS = elements[offset + 1];
00552 string channelS = elements[offset + 2];
00553 string lineS = elements[offset + 3];
00554 string posS = elements[offset + 4];
00555 string text = elements[offset + 5];
00556 text = UnEscapeNewlines(text);
00557 int index = int.Parse(indexS, CultureInfo.InvariantCulture);
00558 ProxyToken t = new ProxyToken(index, int.Parse(typeS, CultureInfo.InvariantCulture), int.Parse(channelS, CultureInfo.InvariantCulture), int.Parse(lineS, CultureInfo.InvariantCulture), int.Parse(posS, CultureInfo.InvariantCulture), text);
00559 return t;
00560 }
00561
00563 public virtual void start()
00564 {
00565 Thread t = new Thread(new ThreadStart(this.Run));
00566 t.Start();
00567 }
00568
00569 public virtual void Run()
00570 {
00571 EventHandler();
00572 }
00573
00574
00575
00576 public virtual string[] GetEventElements(string eventLabel)
00577 {
00578 if (eventLabel == null)
00579 return null;
00580
00581 string[] elements = new string[MAX_EVENT_ELEMENTS];
00582 string str = null;
00583 try
00584 {
00585 int firstQuoteIndex = eventLabel.IndexOf('"');
00586 if (firstQuoteIndex >= 0)
00587 {
00588
00589
00590
00591 string eventWithoutString = eventLabel.Substring(0, (firstQuoteIndex) - (0));
00592 str = eventLabel.Substring(firstQuoteIndex + 1, (eventLabel.Length) - (firstQuoteIndex + 1));
00593 eventLabel = eventWithoutString;
00594 }
00595
00596 string[] strings = eventLabel.Split(new char[] { ' ', '\t' });
00597 int i = 0;
00598 for ( ; i < strings.Length; i++)
00599 {
00600 if (i >= MAX_EVENT_ELEMENTS)
00601 {
00602 return elements;
00603 }
00604 elements[i] = strings[i];
00605 }
00606
00607 if (str != null)
00608 {
00609 elements[i] = str;
00610 }
00611 }
00612 catch (System.Exception e)
00613 {
00614 Console.Error.WriteLine(e.StackTrace);
00615 }
00616 return elements;
00617 }
00618
00619 protected string UnEscapeNewlines(string txt)
00620 {
00621
00622 txt = txt.Replace("%0A", "\n");
00623 txt = txt.Replace("%0D", "\r");
00624 txt = txt.Replace("%25", "%");
00625 return txt;
00626 }
00627
00628 public bool TokenIndexesAreInvalid
00629 {
00630 get { return false; }
00631 }
00632 }
00633 }