1 // [The "BSD licence"] 2 // Copyright (c) 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 "ANTLRRecognizerSharedState.h" 28 #import "ANTLRCharStream.h" 29 #import "ANTLRCommonToken.h" 30 #import "ANTLRMismatchedTokenException.h" 31 #import "ANTLRMismatchedRangeException.h" 32 33 @implementation ANTLRRecognizerSharedState 34 35 @synthesize following; 36 @synthesize _fsp; 37 @synthesize errorRecovery; 38 @synthesize lastErrorIndex; 39 @synthesize failed; 40 @synthesize syntaxErrors; 41 @synthesize backtracking; 42 @synthesize ruleMemo; 43 @synthesize token; 44 @synthesize type; 45 @synthesize channel; 46 @synthesize tokenStartLine; 47 @synthesize tokenStartCharPositionInLine; 48 @synthesize tokenStartCharIndex; 49 @synthesize text; 50 51 + (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState 52 { 53 return [[[ANTLRRecognizerSharedState alloc] init] retain]; 54 } 55 56 + (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedStateWithRuleLen:(NSInteger)aLen 57 { 58 return [[[ANTLRRecognizerSharedState alloc] initWithRuleLen:aLen] retain]; 59 } 60 61 + (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState:(ANTLRRecognizerSharedState *)aState 62 { 63 return [[[ANTLRRecognizerSharedState alloc] initWithState:aState] retain]; 64 } 65 66 - (id) init 67 { 68 ANTLRHashRule *aHashRule; 69 if ((self = [super init]) != nil ) { 70 following = [[AMutableArray arrayWithCapacity:10] retain]; 71 _fsp = -1; 72 errorRecovery = NO; // are we recovering? 73 lastErrorIndex = -1; 74 failed = NO; // indicate that some match failed 75 syntaxErrors = 0; 76 backtracking = 0; // the level of backtracking 77 tokenStartCharIndex = -1; 78 tokenStartLine = 0; 79 int cnt = 200; 80 ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:cnt] retain]; 81 for (int i = 0; i < cnt; i++ ) { 82 aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain]; 83 [ruleMemo addObject:aHashRule]; 84 } 85 #ifdef DONTUSEYET 86 token = state.token; 87 tokenStartCharIndex = state.tokenStartCharIndex; 88 tokenStartCharPositionInLine = state.tokenStartCharPositionInLine; 89 channel = state.channel; 90 type = state.type; 91 text = state.text; 92 #endif 93 } 94 return self; 95 } 96 97 - (id) initWithRuleLen:(NSInteger)aLen 98 { 99 ANTLRHashRule *aHashRule; 100 if ((self = [super init]) != nil ) { 101 following = [[AMutableArray arrayWithCapacity:10] retain]; 102 _fsp = -1; 103 errorRecovery = NO; // are we recovering? 104 lastErrorIndex = -1; 105 failed = NO; // indicate that some match failed 106 syntaxErrors = 0; 107 backtracking = 0; // the level of backtracking 108 tokenStartCharIndex = -1; 109 tokenStartLine = 0; 110 ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:aLen] retain]; 111 for (int i = 0; i < aLen; i++ ) { 112 aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain]; 113 [ruleMemo addObject:aHashRule]; 114 } 115 #ifdef DONTUSEYET 116 token = state.token; 117 tokenStartCharIndex = state.tokenStartCharIndex; 118 tokenStartCharPositionInLine = state.tokenStartCharPositionInLine; 119 channel = state.channel; 120 type = state.type; 121 text = state.text; 122 #endif 123 } 124 return self; 125 } 126 127 - (id) initWithState:(ANTLRRecognizerSharedState *)aState 128 { 129 ANTLRHashRule *aHashRule; 130 if ( [following count] < [aState.following count] ) { 131 // following = new BitSet[state.following.size]; 132 } 133 [following setArray:aState.following]; 134 _fsp = aState._fsp; 135 errorRecovery = aState.errorRecovery; 136 lastErrorIndex = aState.lastErrorIndex; 137 failed = aState.failed; 138 syntaxErrors = aState.syntaxErrors; 139 backtracking = aState.backtracking; 140 if ( aState.ruleMemo == nil ) { 141 int cnt = 200; 142 ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:cnt] retain]; 143 for (int i = 0; i < cnt; i++ ) { 144 aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain]; 145 [ruleMemo addObject:aHashRule]; 146 } 147 } 148 else { 149 ruleMemo = aState.ruleMemo; 150 if ( [ruleMemo count] == 0 ) { 151 int cnt = [ruleMemo length]; 152 for (int i = 0; i < cnt; i++ ) { 153 [ruleMemo addObject:[[ANTLRHashRule newANTLRHashRuleWithLen:17] retain]]; 154 } 155 } 156 else { 157 [ruleMemo addObjectsFromArray:aState.ruleMemo]; 158 } 159 } 160 token = aState.token; 161 tokenStartCharIndex = aState.tokenStartCharIndex; 162 tokenStartCharPositionInLine = aState.tokenStartCharPositionInLine; 163 tokenStartLine = aState.tokenStartLine; 164 channel = aState.channel; 165 type = aState.type; 166 text = aState.text; 167 return( self ); 168 } 169 170 - (void) dealloc 171 { 172 #ifdef DEBUG_DEALLOC 173 NSLog( @"called dealloc in ANTLRRecognizerSharedState" ); 174 #endif 175 if ( token ) [token release]; 176 if ( following ) [following release]; 177 if ( ruleMemo ) [ruleMemo release]; 178 [super dealloc]; 179 } 180 181 // token stuff 182 #pragma mark Tokens 183 184 - (id<ANTLRToken>)getToken 185 { 186 return token; 187 } 188 189 - (void) setToken: (id<ANTLRToken>) aToken 190 { 191 if (token != aToken) { 192 [aToken retain]; 193 if ( token ) [token release]; 194 token = aToken; 195 } 196 } 197 198 - (NSUInteger)channel 199 { 200 return channel; 201 } 202 203 - (void) setChannel:(NSUInteger) theChannel 204 { 205 channel = theChannel; 206 } 207 208 - (NSUInteger) getTokenStartLine 209 { 210 return tokenStartLine; 211 } 212 213 - (void) setTokenStartLine:(NSUInteger) theTokenStartLine 214 { 215 tokenStartLine = theTokenStartLine; 216 } 217 218 - (NSUInteger) charPositionInLine 219 { 220 return tokenStartCharPositionInLine; 221 } 222 223 - (void) setCharPositionInLine:(NSUInteger) theCharPosition 224 { 225 tokenStartCharPositionInLine = theCharPosition; 226 } 227 228 - (NSInteger) getTokenStartCharIndex; 229 { 230 return tokenStartCharIndex; 231 } 232 233 - (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex 234 { 235 tokenStartCharIndex = theTokenStartCharIndex; 236 } 237 238 // error handling 239 - (void) reportError:(ANTLRRecognitionException *)e 240 { 241 NSLog(@"%@", e.name); 242 } 243 244 - (AMutableArray *) getFollowing 245 { 246 return following; 247 } 248 249 - (void)setFollowing:(AMutableArray *)aFollow 250 { 251 if ( following != aFollow ) { 252 if ( following ) [following release]; 253 [aFollow retain]; 254 } 255 following = aFollow; 256 } 257 258 - (ANTLRRuleStack *) getRuleMemo 259 { 260 return ruleMemo; 261 } 262 263 - (void)setRuleMemo:(ANTLRRuleStack *)aRuleMemo 264 { 265 if ( ruleMemo != aRuleMemo ) { 266 if ( ruleMemo ) [ruleMemo release]; 267 [aRuleMemo retain]; 268 } 269 ruleMemo = aRuleMemo; 270 } 271 272 - (BOOL) isErrorRecovery 273 { 274 return errorRecovery; 275 } 276 277 - (void) setIsErrorRecovery: (BOOL) flag 278 { 279 errorRecovery = flag; 280 } 281 282 283 - (BOOL) getFailed 284 { 285 return failed; 286 } 287 288 - (void) setFailed:(BOOL)flag 289 { 290 failed = flag; 291 } 292 293 294 - (NSInteger) backtracking 295 { 296 return backtracking; 297 } 298 299 - (void) setBacktracking:(NSInteger) value 300 { 301 backtracking = value; 302 } 303 304 - (void) increaseBacktracking 305 { 306 backtracking++; 307 } 308 309 - (void) decreaseBacktracking 310 { 311 backtracking--; 312 } 313 314 - (BOOL) isBacktracking 315 { 316 return backtracking > 0; 317 } 318 319 320 - (NSInteger) lastErrorIndex 321 { 322 return lastErrorIndex; 323 } 324 325 - (void) setLastErrorIndex:(NSInteger) value 326 { 327 lastErrorIndex = value; 328 } 329 330 331 @end 332