Home | History | Annotate | Download | only in Framework
      1 //
      2 //  ANTLRParseTree.m
      3 //  ANTLR
      4 //
      5 //  Created by Alan Condit on 7/12/10.
      6 // [The "BSD licence"]
      7 // Copyright (c) 2010 Alan Condit
      8 // All rights reserved.
      9 //
     10 // Redistribution and use in source and binary forms, with or without
     11 // modification, are permitted provided that the following conditions
     12 // are met:
     13 // 1. Redistributions of source code must retain the above copyright
     14 //    notice, this list of conditions and the following disclaimer.
     15 // 2. Redistributions in binary form must reproduce the above copyright
     16 //    notice, this list of conditions and the following disclaimer in the
     17 //    documentation and/or other materials provided with the distribution.
     18 // 3. The name of the author may not be used to endorse or promote products
     19 //    derived from this software without specific prior written permission.
     20 //
     21 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31 
     32 #import "ANTLRParseTree.h"
     33 
     34 /** A record of the rules used to match a token sequence.  The tokens
     35  *  end up as the leaves of this tree and rule nodes are the interior nodes.
     36  *  This really adds no functionality, it is just an alias for CommonTree
     37  *  that is more meaningful (specific) and holds a String to display for a node.
     38  */
     39 @implementation ANTLRParseTree
     40 + (ANTLRParseTree *)newANTLRParseTree:(id<ANTLRToken>)label
     41 {
     42     return [[ANTLRParseTree alloc] initWithLabel:label];
     43 }
     44     
     45 - (id)initWithLabel:(id<ANTLRToken>)label
     46 {
     47     self = [super init];
     48     if ( self != nil) {
     49         payload = [label retain];
     50     }
     51     return self;
     52 }
     53 
     54 - (id<ANTLRBaseTree>)dupNode
     55 {
     56     return nil;
     57 }
     58     
     59 - (NSInteger)type
     60 {
     61     return 0;
     62 }
     63     
     64 - (NSString *)text
     65 {
     66     return [self toString];
     67 }
     68     
     69 - (NSInteger)getTokenStartIndex
     70 {
     71     return 0;
     72 }
     73     
     74 - (void)setTokenStartIndex:(NSInteger)anIndex
     75 {
     76 }
     77     
     78 - (NSInteger)getTokenStopIndex
     79 {
     80     return 0;
     81 }
     82     
     83 - (void)setTokenStopIndex:(NSInteger)anIndex
     84 {
     85 }
     86 
     87 - (NSString *)description
     88 {
     89     if ( [payload isKindOfClass:[ANTLRCommonToken class]] ) {
     90         id<ANTLRToken> t = (id<ANTLRToken>)payload;
     91         if ( t.type == ANTLRTokenTypeEOF ) {
     92             return @"<EOF>";
     93         }
     94         return [t text];
     95     }
     96     return [payload description];
     97 }
     98     
     99 - (NSString *)toString
    100 {
    101     return [self description];
    102 }
    103     
    104 /** Emit a token and all hidden nodes before.  EOF node holds all
    105  *  hidden tokens after last real token.
    106  */
    107 - (NSString *)toStringWithHiddenTokens
    108 {
    109     NSMutableString *buf = [NSMutableString stringWithCapacity:25];
    110     if ( hiddenTokens!=nil ) {
    111         for (NSUInteger i = 0; i < [hiddenTokens count]; i++) {
    112             id<ANTLRToken>  hidden = (id<ANTLRToken> ) [hiddenTokens objectAtIndex:i];
    113             [buf appendString:[hidden text]];
    114         }
    115     }
    116     NSString *nodeText = [self toString];
    117     if ( ![nodeText isEqualTo:@"<EOF>"] )
    118         [buf appendString:nodeText];
    119     return buf;
    120 }
    121     
    122 /** Print out the leaves of this tree, which means printing original
    123  *  input back out.
    124  */
    125 - (NSString *)toInputString
    126 {
    127     NSMutableString *buf = [NSMutableString stringWithCapacity:25];
    128     [self _toStringLeaves:buf];
    129     return buf;
    130 }
    131     
    132 - (void)_toStringLeaves:(NSMutableString *)buf
    133 {
    134     if ( [payload isKindOfClass:[ANTLRCommonToken class]] ) { // leaf node token?
    135         [buf appendString:[self toStringWithHiddenTokens]];
    136         return;
    137     }
    138     for (int i = 0; children!=nil && i < [children count]; i++) {
    139         ANTLRParseTree *t = (ANTLRParseTree *) [children objectAtIndex:i];
    140         [t _toStringLeaves:buf];
    141     }
    142 }
    143     
    144 @synthesize payload;
    145 @synthesize hiddenTokens;
    146 @synthesize children;
    147 @synthesize anException;
    148 
    149 @end
    150