xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/DebugEventSocketProxy.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot// [The "BSD licence"]
2*16467b97STreehugger Robot// Copyright (c) 2006-2007 Kay Roepke
3*16467b97STreehugger Robot// All rights reserved.
4*16467b97STreehugger Robot//
5*16467b97STreehugger Robot// Redistribution and use in source and binary forms, with or without
6*16467b97STreehugger Robot// modification, are permitted provided that the following conditions
7*16467b97STreehugger Robot// are met:
8*16467b97STreehugger Robot// 1. Redistributions of source code must retain the above copyright
9*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer.
10*16467b97STreehugger Robot// 2. Redistributions in binary form must reproduce the above copyright
11*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer in the
12*16467b97STreehugger Robot//    documentation and/or other materials provided with the distribution.
13*16467b97STreehugger Robot// 3. The name of the author may not be used to endorse or promote products
14*16467b97STreehugger Robot//    derived from this software without specific prior written permission.
15*16467b97STreehugger Robot//
16*16467b97STreehugger Robot// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*16467b97STreehugger Robot// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*16467b97STreehugger Robot// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*16467b97STreehugger Robot// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*16467b97STreehugger Robot// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*16467b97STreehugger Robot// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*16467b97STreehugger Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*16467b97STreehugger Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*16467b97STreehugger Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*16467b97STreehugger Robot// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*16467b97STreehugger Robot
27*16467b97STreehugger Robot#import "DebugEventSocketProxy.h"
28*16467b97STreehugger Robot#import "Token+DebuggerSupport.h"
29*16467b97STreehugger Robot#include <string.h>
30*16467b97STreehugger Robot
31*16467b97STreehugger Robotstatic NSData *newlineData = nil;
32*16467b97STreehugger Robotstatic unsigned lengthOfUTF8Ack = 0;
33*16467b97STreehugger Robot
34*16467b97STreehugger Robot@implementation DebugEventSocketProxy
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot+ (void) initialize
37*16467b97STreehugger Robot{
38*16467b97STreehugger Robot	if (!newlineData) newlineData = [@"\n" dataUsingEncoding:NSUTF8StringEncoding];
39*16467b97STreehugger Robot	if (!lengthOfUTF8Ack) lengthOfUTF8Ack = [[@"ack\n" dataUsingEncoding:NSUTF8StringEncoding] length];
40*16467b97STreehugger Robot}
41*16467b97STreehugger Robot
42*16467b97STreehugger Robot- (id) init
43*16467b97STreehugger Robot{
44*16467b97STreehugger Robot	return [self initWithGrammarName:nil debuggerPort:DEFAULT_DEBUGGER_PORT];
45*16467b97STreehugger Robot}
46*16467b97STreehugger Robot
47*16467b97STreehugger Robot- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort
48*16467b97STreehugger Robot{
49*16467b97STreehugger Robot	self = [super init];
50*16467b97STreehugger Robot	if (self) {
51*16467b97STreehugger Robot		serverSocket = -1;
52*16467b97STreehugger Robot		[self setGrammarName:aGrammarName];
53*16467b97STreehugger Robot		if (aPort == -1) aPort = DEFAULT_DEBUGGER_PORT;
54*16467b97STreehugger Robot		[self setDebuggerPort:aPort];
55*16467b97STreehugger Robot	}
56*16467b97STreehugger Robot	return self;
57*16467b97STreehugger Robot}
58*16467b97STreehugger Robot
59*16467b97STreehugger Robot- (void) dealloc
60*16467b97STreehugger Robot{
61*16467b97STreehugger Robot	if (serverSocket != -1)
62*16467b97STreehugger Robot		shutdown(serverSocket,SHUT_RDWR);
63*16467b97STreehugger Robot	serverSocket = -1;
64*16467b97STreehugger Robot	[debuggerFH release];
65*16467b97STreehugger Robot    [self setGrammarName:nil];
66*16467b97STreehugger Robot    [super dealloc];
67*16467b97STreehugger Robot}
68*16467b97STreehugger Robot
69*16467b97STreehugger Robot/* Java stuff
70*16467b97STreehugger Robotpublic void handshake() throws IOException {
71*16467b97STreehugger Robot    if ( serverSocket==nil ) {
72*16467b97STreehugger Robot        serverSocket = new ServerSocket(port);
73*16467b97STreehugger Robot        socket = serverSocket.accept();
74*16467b97STreehugger Robot        socket.setTcpNoDelay(true);
75*16467b97STreehugger Robot        OutputStream os = socket.getOutputStream();
76*16467b97STreehugger Robot        OutputStreamWriter osw = new OutputStreamWriter(os, "UTF8");
77*16467b97STreehugger Robot        out = new PrintWriter(new BufferedWriter(osw));
78*16467b97STreehugger Robot        InputStream is = socket.getInputStream();
79*16467b97STreehugger Robot        InputStreamReader isr = new InputStreamReader(is, "UTF8");
80*16467b97STreehugger Robot        in = new BufferedReader(isr);
81*16467b97STreehugger Robot        out.println("ANTLR "+ DebugEventListener.PROTOCOL_VERSION);
82*16467b97STreehugger Robot        out.println("grammar \""+ grammarFileName);
83*16467b97STreehugger Robot        out.flush();
84*16467b97STreehugger Robot        ack();
85*16467b97STreehugger Robot    }
86*16467b97STreehugger Robot}
87*16467b97STreehugger Robot
88*16467b97STreehugger Robot- (void) commence
89*16467b97STreehugger Robot{
90*16467b97STreehugger Robot    // don't bother sending event; listener will trigger upon connection
91*16467b97STreehugger Robot}
92*16467b97STreehugger Robot
93*16467b97STreehugger Robot- (void) terminate
94*16467b97STreehugger Robot{
95*16467b97STreehugger Robot    [self transmit:@"terminate";
96*16467b97STreehugger Robot    [out close];
97*16467b97STreehugger Robot    try {
98*16467b97STreehugger Robot        [socket close];
99*16467b97STreehugger Robot    }
100*16467b97STreehugger Robot    catch (IOException *ioe) {
101*16467b97STreehugger Robot        ioe.printStackTrace(System.err);
102*16467b97STreehugger Robot    }
103*16467b97STreehugger Robot}
104*16467b97STreehugger Robot
105*16467b97STreehugger Robot- (void) ack
106*16467b97STreehugger Robot{
107*16467b97STreehugger Robot    try {
108*16467b97STreehugger Robot        in.readLine();
109*16467b97STreehugger Robot    }
110*16467b97STreehugger Robot    catch (IOException ioe) {
111*16467b97STreehugger Robot        ioe.printStackTrace(System.err);
112*16467b97STreehugger Robot    }
113*16467b97STreehugger Robot}
114*16467b97STreehugger Robot
115*16467b97STreehugger Robotprotected void transmit(String event) {
116*16467b97STreehugger Robot    out.println(event);
117*16467b97STreehugger Robot    out.flush();
118*16467b97STreehugger Robot    ack();
119*16467b97STreehugger Robot}
120*16467b97STreehugger Robot*/
121*16467b97STreehugger Robot
122*16467b97STreehugger Robot- (void) waitForDebuggerConnection
123*16467b97STreehugger Robot{
124*16467b97STreehugger Robot	if (serverSocket == -1) {
125*16467b97STreehugger Robot		serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
126*16467b97STreehugger Robot
127*16467b97STreehugger Robot		NSAssert1(serverSocket != -1, @"Failed to create debugger socket. %s", strerror(errno));
128*16467b97STreehugger Robot
129*16467b97STreehugger Robot		int yes = 1;
130*16467b97STreehugger Robot		setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE|SO_REUSEPORT|SO_REUSEADDR|TCP_NODELAY, (void *)&yes, sizeof(NSInteger));
131*16467b97STreehugger Robot
132*16467b97STreehugger Robot		struct sockaddr_in server_addr;
133*16467b97STreehugger Robot		bzero(&server_addr, sizeof(struct sockaddr_in));
134*16467b97STreehugger Robot		server_addr.sin_family = AF_INET;
135*16467b97STreehugger Robot		server_addr.sin_port = htons([self debuggerPort]);
136*16467b97STreehugger Robot		server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
137*16467b97STreehugger Robot		NSAssert1( bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1, @"bind(2) failed. %s", strerror(errno));
138*16467b97STreehugger Robot
139*16467b97STreehugger Robot		NSAssert1(listen(serverSocket,50) == 0, @"listen(2) failed. %s", strerror(errno));
140*16467b97STreehugger Robot
141*16467b97STreehugger Robot		NSLog(@"ANTLR waiting for debugger attach (grammar %@)", [self grammarName]);
142*16467b97STreehugger Robot
143*16467b97STreehugger Robot		debuggerSocket = accept(serverSocket, &debugger_sockaddr, &debugger_socklen);
144*16467b97STreehugger Robot		NSAssert1( debuggerSocket != -1, @"accept(2) failed. %s", strerror(errno));
145*16467b97STreehugger Robot
146*16467b97STreehugger Robot		debuggerFH = [[NSFileHandle alloc] initWithFileDescriptor:debuggerSocket];
147*16467b97STreehugger Robot		[self sendToDebugger:[NSString stringWithFormat:@"ANTLR %d", DebugProtocolVersion] waitForResponse:NO];
148*16467b97STreehugger Robot		[self sendToDebugger:[NSString stringWithFormat:@"grammar \"%@", [self grammarName]] waitForResponse:NO];
149*16467b97STreehugger Robot	}
150*16467b97STreehugger Robot}
151*16467b97STreehugger Robot
152*16467b97STreehugger Robot- (void) waitForAck
153*16467b97STreehugger Robot{
154*16467b97STreehugger Robot	NSString *response;
155*16467b97STreehugger Robot	@try {
156*16467b97STreehugger Robot		NSData *newLine = [debuggerFH readDataOfLength:lengthOfUTF8Ack];
157*16467b97STreehugger Robot		response = [[NSString alloc] initWithData:newLine encoding:NSUTF8StringEncoding];
158*16467b97STreehugger Robot		if (![response isEqualToString:@"ack\n"]) @throw [NSException exceptionWithName:@"DebugEventSocketProxy" reason:@"illegal response from debugger" userInfo:nil];
159*16467b97STreehugger Robot	}
160*16467b97STreehugger Robot	@catch (NSException *e) {
161*16467b97STreehugger Robot		NSLog(@"socket died or debugger misbehaved: %@ read <%@>", e, response);
162*16467b97STreehugger Robot	}
163*16467b97STreehugger Robot	@finally {
164*16467b97STreehugger Robot		[response release];
165*16467b97STreehugger Robot	}
166*16467b97STreehugger Robot}
167*16467b97STreehugger Robot
168*16467b97STreehugger Robot- (void) sendToDebugger:(NSString *)message
169*16467b97STreehugger Robot{
170*16467b97STreehugger Robot	[self sendToDebugger:message waitForResponse:YES];
171*16467b97STreehugger Robot}
172*16467b97STreehugger Robot
173*16467b97STreehugger Robot- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait
174*16467b97STreehugger Robot{
175*16467b97STreehugger Robot	if (! debuggerFH ) return;
176*16467b97STreehugger Robot	[debuggerFH writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];
177*16467b97STreehugger Robot	[debuggerFH writeData:newlineData];
178*16467b97STreehugger Robot	if (wait) [self waitForAck];
179*16467b97STreehugger Robot}
180*16467b97STreehugger Robot
181*16467b97STreehugger Robot- (NSInteger) serverSocket
182*16467b97STreehugger Robot{
183*16467b97STreehugger Robot    return serverSocket;
184*16467b97STreehugger Robot}
185*16467b97STreehugger Robot
186*16467b97STreehugger Robot- (void) setServerSocket: (NSInteger) aServerSocket
187*16467b97STreehugger Robot{
188*16467b97STreehugger Robot    serverSocket = aServerSocket;
189*16467b97STreehugger Robot}
190*16467b97STreehugger Robot
191*16467b97STreehugger Robot- (NSInteger) debuggerSocket
192*16467b97STreehugger Robot{
193*16467b97STreehugger Robot    return debuggerSocket;
194*16467b97STreehugger Robot}
195*16467b97STreehugger Robot
196*16467b97STreehugger Robot- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket
197*16467b97STreehugger Robot{
198*16467b97STreehugger Robot    debuggerSocket = aDebuggerSocket;
199*16467b97STreehugger Robot}
200*16467b97STreehugger Robot
201*16467b97STreehugger Robot- (NSString *) grammarName
202*16467b97STreehugger Robot{
203*16467b97STreehugger Robot    return grammarName;
204*16467b97STreehugger Robot}
205*16467b97STreehugger Robot
206*16467b97STreehugger Robot- (void) setGrammarName: (NSString *) aGrammarName
207*16467b97STreehugger Robot{
208*16467b97STreehugger Robot    if (grammarName != aGrammarName) {
209*16467b97STreehugger Robot        [aGrammarName retain];
210*16467b97STreehugger Robot        [grammarName release];
211*16467b97STreehugger Robot        grammarName = aGrammarName;
212*16467b97STreehugger Robot    }
213*16467b97STreehugger Robot}
214*16467b97STreehugger Robot
215*16467b97STreehugger Robot- (NSInteger) debuggerPort
216*16467b97STreehugger Robot{
217*16467b97STreehugger Robot    return debuggerPort;
218*16467b97STreehugger Robot}
219*16467b97STreehugger Robot
220*16467b97STreehugger Robot- (void) setDebuggerPort: (NSInteger) aDebuggerPort
221*16467b97STreehugger Robot{
222*16467b97STreehugger Robot    debuggerPort = aDebuggerPort;
223*16467b97STreehugger Robot}
224*16467b97STreehugger Robot
225*16467b97STreehugger Robot- (NSString *) escapeNewlines:(NSString *)aString
226*16467b97STreehugger Robot{
227*16467b97STreehugger Robot	NSMutableString *escapedText;
228*16467b97STreehugger Robot	if (aString) {
229*16467b97STreehugger Robot		escapedText = [NSMutableString stringWithString:aString];
230*16467b97STreehugger Robot		NSRange wholeString = NSMakeRange(0,[escapedText length]);
231*16467b97STreehugger Robot		[escapedText replaceOccurrencesOfString:@"%" withString:@"%25" options:0 range:wholeString];
232*16467b97STreehugger Robot		[escapedText replaceOccurrencesOfString:@"\n" withString:@"%0A" options:0 range:wholeString];
233*16467b97STreehugger Robot		[escapedText replaceOccurrencesOfString:@"\r" withString:@"%0D" options:0 range:wholeString];
234*16467b97STreehugger Robot	} else {
235*16467b97STreehugger Robot		escapedText = [NSMutableString stringWithString:@""];
236*16467b97STreehugger Robot	}
237*16467b97STreehugger Robot	return escapedText;
238*16467b97STreehugger Robot}
239*16467b97STreehugger Robot
240*16467b97STreehugger Robot#pragma mark -
241*16467b97STreehugger Robot
242*16467b97STreehugger Robot#pragma mark DebugEventListener Protocol
243*16467b97STreehugger Robot- (void) enterRule:(NSString *)ruleName
244*16467b97STreehugger Robot{
245*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"enterRule %@", ruleName]];
246*16467b97STreehugger Robot}
247*16467b97STreehugger Robot
248*16467b97STreehugger Robot- (void) enterAlt:(NSInteger)alt
249*16467b97STreehugger Robot{
250*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"enterAlt %d", alt]];
251*16467b97STreehugger Robot}
252*16467b97STreehugger Robot
253*16467b97STreehugger Robot- (void) exitRule:(NSString *)ruleName
254*16467b97STreehugger Robot{
255*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"exitRule %@", ruleName]];
256*16467b97STreehugger Robot}
257*16467b97STreehugger Robot
258*16467b97STreehugger Robot- (void) enterSubRule:(NSInteger)decisionNumber
259*16467b97STreehugger Robot{
260*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"enterSubRule %d", decisionNumber]];
261*16467b97STreehugger Robot}
262*16467b97STreehugger Robot
263*16467b97STreehugger Robot- (void) exitSubRule:(NSInteger)decisionNumber
264*16467b97STreehugger Robot{
265*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"exitSubRule %d", decisionNumber]];
266*16467b97STreehugger Robot}
267*16467b97STreehugger Robot
268*16467b97STreehugger Robot- (void) enterDecision:(NSInteger)decisionNumber
269*16467b97STreehugger Robot{
270*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"enterDecision %d", decisionNumber]];
271*16467b97STreehugger Robot}
272*16467b97STreehugger Robot
273*16467b97STreehugger Robot- (void) exitDecision:(NSInteger)decisionNumber
274*16467b97STreehugger Robot{
275*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"exitDecision %d", decisionNumber]];
276*16467b97STreehugger Robot}
277*16467b97STreehugger Robot
278*16467b97STreehugger Robot- (void) consumeToken:(id<Token>)t
279*16467b97STreehugger Robot{
280*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"consumeToken %@", [self escapeNewlines:[t description]]]];
281*16467b97STreehugger Robot}
282*16467b97STreehugger Robot
283*16467b97STreehugger Robot- (void) consumeHiddenToken:(id<Token>)t
284*16467b97STreehugger Robot{
285*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"consumeHiddenToken %@", [self escapeNewlines:[t description]]]];
286*16467b97STreehugger Robot}
287*16467b97STreehugger Robot
288*16467b97STreehugger Robot- (void) LT:(NSInteger)i foundToken:(id<Token>)t
289*16467b97STreehugger Robot{
290*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"LT %d %@", i, [self escapeNewlines:[t description]]]];
291*16467b97STreehugger Robot}
292*16467b97STreehugger Robot
293*16467b97STreehugger Robot- (void) mark:(NSInteger)marker
294*16467b97STreehugger Robot{
295*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"mark %d", marker]];
296*16467b97STreehugger Robot}
297*16467b97STreehugger Robot- (void) rewind:(NSInteger)marker
298*16467b97STreehugger Robot{
299*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"rewind %d", marker]];
300*16467b97STreehugger Robot}
301*16467b97STreehugger Robot
302*16467b97STreehugger Robot- (void) rewind
303*16467b97STreehugger Robot{
304*16467b97STreehugger Robot	[self sendToDebugger:@"rewind"];
305*16467b97STreehugger Robot}
306*16467b97STreehugger Robot
307*16467b97STreehugger Robot- (void) beginBacktrack:(NSInteger)level
308*16467b97STreehugger Robot{
309*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"beginBacktrack %d", level]];
310*16467b97STreehugger Robot}
311*16467b97STreehugger Robot
312*16467b97STreehugger Robot- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful
313*16467b97STreehugger Robot{
314*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"endBacktrack %d %d", level, successful ? 1 : 0]];
315*16467b97STreehugger Robot}
316*16467b97STreehugger Robot
317*16467b97STreehugger Robot- (void) locationLine:(NSInteger)line column:(NSInteger)pos
318*16467b97STreehugger Robot{
319*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"location %d %d", line, pos]];
320*16467b97STreehugger Robot}
321*16467b97STreehugger Robot
322*16467b97STreehugger Robot- (void) recognitionException:(RecognitionException *)e
323*16467b97STreehugger Robot{
324*16467b97STreehugger Robot#warning TODO: recognition exceptions
325*16467b97STreehugger Robot	// these must use the names of the corresponding Java exception classes, because ANTLRWorks recreates the exception
326*16467b97STreehugger Robot	// objects on the Java side.
327*16467b97STreehugger Robot	// Write categories for Objective-C exceptions to provide those names
328*16467b97STreehugger Robot}
329*16467b97STreehugger Robot
330*16467b97STreehugger Robot- (void) beginResync
331*16467b97STreehugger Robot{
332*16467b97STreehugger Robot	[self sendToDebugger:@"beginResync"];
333*16467b97STreehugger Robot}
334*16467b97STreehugger Robot
335*16467b97STreehugger Robot- (void) endResync
336*16467b97STreehugger Robot{
337*16467b97STreehugger Robot	[self sendToDebugger:@"endResync"];
338*16467b97STreehugger Robot}
339*16467b97STreehugger Robot
340*16467b97STreehugger Robot- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result
341*16467b97STreehugger Robot{
342*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"semanticPredicate %d %@", result?1:0, [self escapeNewlines:predicate]]];
343*16467b97STreehugger Robot}
344*16467b97STreehugger Robot
345*16467b97STreehugger Robot- (void) commence
346*16467b97STreehugger Robot{
347*16467b97STreehugger Robot	// no need to send event
348*16467b97STreehugger Robot}
349*16467b97STreehugger Robot
350*16467b97STreehugger Robot- (void) terminate
351*16467b97STreehugger Robot{
352*16467b97STreehugger Robot	[self sendToDebugger:@"terminate"];
353*16467b97STreehugger Robot	@try {
354*16467b97STreehugger Robot		[debuggerFH closeFile];
355*16467b97STreehugger Robot	}
356*16467b97STreehugger Robot	@finally {
357*16467b97STreehugger Robot#warning TODO: make socket handling robust. too lazy now...
358*16467b97STreehugger Robot		shutdown(serverSocket,SHUT_RDWR);
359*16467b97STreehugger Robot		serverSocket = -1;
360*16467b97STreehugger Robot	}
361*16467b97STreehugger Robot}
362*16467b97STreehugger Robot
363*16467b97STreehugger Robot
364*16467b97STreehugger Robot#pragma mark Tree Parsing
365*16467b97STreehugger Robot- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text
366*16467b97STreehugger Robot{
367*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"consumeNode %u %d %@",
368*16467b97STreehugger Robot		nodeHash,
369*16467b97STreehugger Robot		type,
370*16467b97STreehugger Robot		[self escapeNewlines:text]
371*16467b97STreehugger Robot		]];
372*16467b97STreehugger Robot}
373*16467b97STreehugger Robot
374*16467b97STreehugger Robot- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text
375*16467b97STreehugger Robot{
376*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"LN %d %u %d %@",
377*16467b97STreehugger Robot		i,
378*16467b97STreehugger Robot		nodeHash,
379*16467b97STreehugger Robot		type,
380*16467b97STreehugger Robot		[self escapeNewlines:text]
381*16467b97STreehugger Robot		]];
382*16467b97STreehugger Robot}
383*16467b97STreehugger Robot
384*16467b97STreehugger Robot
385*16467b97STreehugger Robot#pragma mark AST Events
386*16467b97STreehugger Robot
387*16467b97STreehugger Robot- (void) createNilNode:(unsigned)hash
388*16467b97STreehugger Robot{
389*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"nilNode %u", hash]];
390*16467b97STreehugger Robot}
391*16467b97STreehugger Robot
392*16467b97STreehugger Robot- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type
393*16467b97STreehugger Robot{
394*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"createNodeFromToken %u %d %@",
395*16467b97STreehugger Robot		hash,
396*16467b97STreehugger Robot		type,
397*16467b97STreehugger Robot		[self escapeNewlines:text]
398*16467b97STreehugger Robot		]];
399*16467b97STreehugger Robot}
400*16467b97STreehugger Robot
401*16467b97STreehugger Robot- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex
402*16467b97STreehugger Robot{
403*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"createNode %u %d", hash, tokenIndex]];
404*16467b97STreehugger Robot}
405*16467b97STreehugger Robot
406*16467b97STreehugger Robot- (void) becomeRoot:(unsigned)newRootHash old:(unsigned)oldRootHash
407*16467b97STreehugger Robot{
408*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"becomeRoot %u %u", newRootHash, oldRootHash]];
409*16467b97STreehugger Robot}
410*16467b97STreehugger Robot
411*16467b97STreehugger Robot- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash
412*16467b97STreehugger Robot{
413*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"addChild %u %u", treeHash, childHash]];
414*16467b97STreehugger Robot}
415*16467b97STreehugger Robot
416*16467b97STreehugger Robot- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex
417*16467b97STreehugger Robot{
418*16467b97STreehugger Robot	[self sendToDebugger:[NSString stringWithFormat:@"setTokenBoundaries %u %d %d", nodeHash, tokenStartIndex, tokenStopIndex]];
419*16467b97STreehugger Robot}
420*16467b97STreehugger Robot
421*16467b97STreehugger Robot
422*16467b97STreehugger Robot
423*16467b97STreehugger Robot@end
424