1// [The "BSD licence"] 2// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit 3// All rights reserved. 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions 7// are met: 8// 1. Redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer. 10// 2. Redistributions in binary form must reproduce the above copyright 11// notice, this list of conditions and the following disclaimer in the 12// documentation and/or other materials provided with the distribution. 13// 3. The name of the author may not be used to endorse or promote products 14// derived from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27#import "ANTLRRecognitionException.h" 28#import "ANTLRTokenStream.h" 29#import "ANTLRTreeNodeStream.h" 30 31@implementation ANTLRRecognitionException 32 33@synthesize input; 34@synthesize token; 35@synthesize node; 36@synthesize line; 37@synthesize charPositionInLine; 38 39+ (id) newException 40{ 41 return [[ANTLRRecognitionException alloc] init]; 42} 43 44+ (id) newException:(id<ANTLRIntStream>) anInputStream 45{ 46 return [[ANTLRRecognitionException alloc] initWithStream:anInputStream]; 47} 48 49+ (id) newException:(id<ANTLRIntStream>) anInputStream reason:(NSString *)aReason 50{ 51 return [[ANTLRRecognitionException alloc] initWithStream:anInputStream reason:aReason]; 52} 53 54- (id) init 55{ 56 self = [super initWithName:@"Recognition Exception" reason:@"Recognition Exception" userInfo:nil]; 57 if ( self != nil ) { 58 } 59 return self; 60} 61 62- (id) initWithStream:(id<ANTLRIntStream>)anInputStream reason:(NSString *)aReason 63{ 64 self = [super initWithName:NSStringFromClass([self class]) reason:aReason userInfo:nil]; 65 if ( self != nil ) { 66 [self setStream:anInputStream]; 67 index = input.index; 68 69 Class inputClass = [input class]; 70 if ([inputClass conformsToProtocol:@protocol(ANTLRTokenStream)]) { 71 [self setToken:[(id<ANTLRTokenStream>)input LT:1]]; 72 line = token.line; 73 charPositionInLine = token.charPositionInLine; 74 } else if ([inputClass conformsToProtocol:@protocol(ANTLRCharStream)]) { 75 c = (unichar)[input LA:1]; 76 line = ((id<ANTLRCharStream>)input).line; 77 charPositionInLine = ((id<ANTLRCharStream>)input).charPositionInLine; 78 } else if ([inputClass conformsToProtocol:@protocol(ANTLRTreeNodeStream)]) { 79 [self setNode:[(id<ANTLRTreeNodeStream>)input LT:1]]; 80 line = [node line]; 81 charPositionInLine = [node charPositionInLine]; 82 } else { 83 c = (unichar)[input LA:1]; 84 } 85 } 86 return self; 87} 88 89- (id) initWithStream:(id<ANTLRIntStream>)anInputStream 90{ 91 self = [super initWithName:NSStringFromClass([self class]) reason:@"Runtime Exception" userInfo:nil]; 92 if ( self != nil ) { 93 } 94 return self; 95} 96 97- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo 98{ 99 self = [super initWithName:aName reason:aReason userInfo:aUserInfo]; 100 if ( self != nil ) { 101 } 102 return self; 103} 104 105- (void) dealloc 106{ 107#ifdef DEBUG_DEALLOC 108 NSLog( @"called dealloc in ANTLRRecognitionException" ); 109#endif 110 if ( input ) [input release]; 111 if ( token ) [token release]; 112 if ( node ) [node release]; 113 [super dealloc]; 114} 115 116- (NSInteger) unexpectedType 117{ 118 if (token) { 119 return token.type; 120 } else if (node) { 121 return [node type]; 122 } else { 123 return c; 124 } 125} 126 127- (id<ANTLRToken>)getUnexpectedToken 128{ 129 return token; 130} 131 132- (NSString *) description 133{ 134 //NSMutableString *desc = [[NSMutableString alloc] initWithString:NSStringFromClass([self class])]; 135 NSMutableString *desc = [NSMutableString stringWithString:[self className]]; 136 if (token) { 137 [desc appendFormat:@" token:%@", token]; 138 } else if (node) { 139 [desc appendFormat:@" node:%@", node]; 140 } else { 141 [desc appendFormat:@" char:%c", c]; 142 } 143 [desc appendFormat:@" line:%d position:%d", line, charPositionInLine]; 144 return desc; 145} 146 147//---------------------------------------------------------- 148// input 149//---------------------------------------------------------- 150- (id<ANTLRIntStream>) getStream 151{ 152 return input; 153} 154 155- (void) setStream: (id<ANTLRIntStream>) aStream 156{ 157 if ( input != aStream ) { 158 if ( input ) [input release]; 159 if ( aStream ) [aStream retain]; 160 input = aStream; 161 } 162} 163 164//---------------------------------------------------------- 165// token 166//---------------------------------------------------------- 167- (id<ANTLRToken>) getToken 168{ 169 return token; 170} 171 172- (void) setToken: (id<ANTLRToken>) aToken 173{ 174 if (token != aToken) { 175 if ( token ) [token release]; 176 if ( aToken ) [aToken retain]; 177 token = aToken; 178 } 179} 180 181//---------------------------------------------------------- 182// node 183//---------------------------------------------------------- 184- (id<ANTLRBaseTree>) getNode 185{ 186 return node; 187} 188 189- (void) setNode: (id<ANTLRBaseTree>) aNode 190{ 191 if (node != aNode) { 192 if ( node ) [node release]; 193 if ( aNode ) [aNode retain]; 194 node = aNode; 195 } 196} 197 198- (NSString *)getMessage 199{ 200 return @"Fix getMessage in ANTLRRecognitionException"; 201} 202 203- (NSUInteger)charPositionInLine 204{ 205 return charPositionInLine; 206} 207 208- (void)setCharPositionInLine:(NSUInteger)aPos 209{ 210 charPositionInLine = aPos; 211} 212 213@synthesize index; 214@synthesize c; 215@end 216