// [The "BSD licence"]
// Copyright (c) 2006-2007 Kay Roepke
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
//    derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#import <Cocoa/Cocoa.h>
#import "ANTLRParser.h"
#import "ANTLRDebugEventListener.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <netinet/tcp.h>
#include <arpa/inet.h>

// default port for ANTLRWorks
#define DEFAULT_DEBUGGER_PORT 0xC001

@interface ANTLRDebugEventProxy : NSObject <ANTLRDebugEventListener> {
	int serverSocket;
	
	struct sockaddr debugger_sockaddr;
	socklen_t debugger_socklen;
	int debuggerSocket;
	NSFileHandle *debuggerFH;
	
	NSString *grammarName;
	int debuggerPort;
}

- (id) init;
- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort;
- (void) waitForDebuggerConnection;
- (void) waitForAck;
- (void) sendToDebugger:(NSString *)message;
- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait;

- (NSInteger) serverSocket;
- (void) setServerSocket: (NSInteger) aServerSocket;

- (NSInteger) debuggerSocket;
- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket;

- (NSString *) grammarName;
- (void) setGrammarName: (NSString *) aGrammarName;

- (NSInteger) debuggerPort;
- (void) setDebuggerPort: (NSInteger) aDebuggerPort;

- (NSString *) escapeNewlines:(NSString *)aString;

#pragma mark -

#pragma mark DebugEventListener Protocol
- (void) enterRule:(NSString *)ruleName;
- (void) enterAlt:(NSInteger)alt;
- (void) exitRule:(NSString *)ruleName;
- (void) enterSubRule:(NSInteger)decisionNumber;
- (void) exitSubRule:(NSInteger)decisionNumber;
- (void) enterDecision:(NSInteger)decisionNumber;
- (void) exitDecision:(NSInteger)decisionNumber;
- (void) consumeToken:(id<ANTLRToken>)t;
- (void) consumeHiddenToken:(id<ANTLRToken>)t;
- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
- (void) mark:(NSInteger)marker;
- (void) rewind:(NSInteger)marker;
- (void) rewind;
- (void) beginBacktrack:(NSInteger)level;
- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
- (void) recognitionException:(ANTLRRecognitionException *)e;
- (void) beginResync;
- (void) endResync;
- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
- (void) commence;
- (void) terminate;


#pragma mark Tree Parsing
- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;


#pragma mark AST Events

- (void) createNilNode:(unsigned)hash;
- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex;

@end
