Home | History | Annotate | Download | only in Framework
      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 "ANTLRParser.h"
     28 
     29 
     30 @implementation ANTLRParser
     31 
     32 + (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput
     33 {
     34     return [[ANTLRParser alloc] initWithTokenStream:anInput];
     35 }
     36 
     37 + (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput State:(ANTLRRecognizerSharedState *)aState
     38 {
     39     return [[ANTLRParser alloc] initWithTokenStream:anInput State:aState];
     40 }
     41 
     42 - (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
     43 {
     44 	if ((self = [super init]) != nil) {
     45 		input = theStream;
     46 	}
     47 	return self;
     48 }
     49 
     50 - (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream State:(ANTLRRecognizerSharedState *)aState
     51 {
     52 	if ((self = [super initWithState:aState]) != nil) {
     53         input = theStream;
     54 	}
     55 	return self;
     56 }
     57 
     58 - (void) reset
     59 {
     60     [super reset]; // reset all recognizer state variables
     61     if ( input!=nil ) {
     62         [input seek:0]; // rewind the input
     63     }
     64 }
     65 
     66 - (void) dealloc
     67 {
     68 #ifdef DEBUG_DEALLOC
     69     NSLog( @"called dealloc in ANTLRParser" );
     70 #endif
     71 	[self setInput:nil];
     72 	[super dealloc];
     73 }
     74 
     75 //---------------------------------------------------------- 
     76 //  input 
     77 //---------------------------------------------------------- 
     78 - (id<ANTLRTokenStream>) input
     79 {
     80     return input; 
     81 }
     82 
     83 - (void) setInput: (id<ANTLRTokenStream>) anInput
     84 {
     85     if (input != anInput) {
     86         if ( input ) [input release];
     87         [anInput retain];
     88     }
     89     input = anInput;
     90 }
     91 
     92 - (id) getCurrentInputSymbol:(id<ANTLRTokenStream>)anInput
     93 {
     94     state.token = [input LT:1];
     95     return state.token;
     96 }
     97 
     98 - (ANTLRCommonToken *)getMissingSymbol:(id<ANTLRTokenStream>)anInput
     99                              Exception:(ANTLRRecognitionException *)e
    100                                  TType:(NSInteger)expectedTokenType
    101                                 BitSet:(ANTLRBitSet *)follow
    102 {
    103     NSString *tokenText = nil;
    104     if ( expectedTokenType == ANTLRTokenTypeEOF )
    105         tokenText = @"<missing EOF>";
    106     else
    107         tokenText = [NSString stringWithFormat:@"<missing %@>\n",[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:expectedTokenType]];
    108     ANTLRCommonToken *t = [[ANTLRCommonToken newToken:expectedTokenType Text:tokenText] retain];
    109     ANTLRCommonToken *current = [anInput LT:1];
    110     if ( current.type == ANTLRTokenTypeEOF ) {
    111         current = [anInput LT:-1];
    112     }
    113     t.line = current.line;
    114     t.charPositionInLine = current.charPositionInLine;
    115     t.channel = ANTLRTokenChannelDefault;
    116     return t;
    117 }
    118 
    119 /** Set the token stream and reset the parser */
    120 - (void) setTokenStream:(id<ANTLRTokenStream>)anInput
    121 {
    122     input = nil;
    123     [self reset];
    124     input = anInput;
    125 }
    126 
    127 - (id<ANTLRTokenStream>)getTokenStream
    128 {
    129     return input;
    130 }
    131 
    132 - (NSString *)getSourceName
    133 {
    134     return [input getSourceName];
    135 }
    136 
    137 - (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex
    138 {
    139     [super traceIn:ruleName Index:ruleIndex Object:[input LT:1]];
    140 }
    141 
    142 - (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex
    143 {
    144     [super traceOut:ruleName Index:ruleIndex Object:[input LT:1]];
    145 }
    146 
    147 @end
    148