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