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 "ANTLRCommonTreeAdaptor.h"
     28 
     29 @implementation ANTLRCommonTreeAdaptor
     30 
     31 + (ANTLRCommonTree *) newEmptyTree;
     32 {
     33     return [ANTLRCommonTree newTree];
     34 }
     35 
     36 + (ANTLRCommonTreeAdaptor *)newTreeAdaptor
     37 {
     38     return[[ANTLRCommonTreeAdaptor alloc] init];
     39 }
     40 
     41 - (id) init
     42 {
     43     self = [super init];
     44     if (self) {
     45     }
     46     return self;
     47 }
     48 
     49 /** Duplicate a node.  This is part of the factory;
     50  *	override if you want another kind of node to be built.
     51  *
     52  *  I could use reflection to prevent having to override this
     53  *  but reflection is slow.
     54  */
     55 - (id) dupNode:(id<ANTLRBaseTree>)t
     56 {
     57     if ( t==nil )
     58         return nil;
     59     return [ANTLRCommonTree newTree:t];
     60 }
     61 
     62 /** Tell me how to create a token for use with imaginary token nodes.
     63  *  For example, there is probably no input symbol associated with imaginary
     64  *  token DECL, but you need to create it as a payload or whatever for
     65  *  the DECL node as in ^(DECL type ID).
     66  *
     67  *  This is a variant of createToken where the new token is derived from
     68  *  an actual real input token.  Typically this is for converting '{'
     69  *  tokens to BLOCK etc...  You'll see
     70  *
     71  *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
     72  *
     73  *  If you care what the token payload objects' type is, you should
     74  *  override this method and any other createToken variant.
     75  */
     76 - (ANTLRCommonTree *) create:(ANTLRCommonToken *)aToken
     77 {
     78     return [ANTLRCommonTree newTreeWithToken:aToken];
     79 }
     80 
     81 /** Tell me how to create a token for use with imaginary token nodes.
     82  *  For example, there is probably no input symbol associated with imaginary
     83  *  token DECL, but you need to create it as a payload or whatever for
     84  *  the DECL node as in ^(DECL type ID).
     85  *
     86  *  If you care what the token payload objects' type is, you should
     87  *  override this method and any other createToken variant.
     88  */
     89 - (ANTLRCommonTree *)createTree:(NSInteger)tokenType Text:(NSString *)text
     90 {
     91     return [ANTLRCommonTree newTreeWithTokenType:tokenType Text:text];
     92 }
     93 
     94 - (id<ANTLRToken>)createToken:(NSInteger)tokenType Text:(NSString *)text
     95 {
     96     id<ANTLRToken> fromToken = [ANTLRCommonToken newToken:tokenType Text:text];
     97     return fromToken;
     98 }
     99 
    100 - (id<ANTLRToken>)createToken:(id<ANTLRToken>)fromToken
    101 {
    102     return [ANTLRCommonToken newTokenWithToken:(ANTLRCommonToken *)fromToken];
    103 }
    104 
    105 /** Track start/stop token for subtree root created for a rule.
    106  *  Only works with Tree nodes.  For rules that match nothing,
    107  *  seems like this will yield start=i and stop=i-1 in a nil node.
    108  *  Might be useful info so I'll not force to be i..i.
    109  */
    110 - (void) setTokenBoundaries:(id<ANTLRBaseTree>)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken
    111 {
    112     if ( aTree == nil )
    113         return;
    114     int startTokIdx = 0;
    115     int stopTokIdx = 0;
    116     if ( startToken != nil )
    117         startTokIdx = [startToken getTokenIndex];
    118     if ( stopToken != nil )
    119         stopTokIdx = [stopToken getTokenIndex];
    120     [(id<ANTLRBaseTree>)aTree setTokenStartIndex:startTokIdx];
    121     [(id<ANTLRBaseTree>)aTree setTokenStopIndex:stopTokIdx];
    122 }
    123 
    124 - (NSInteger)getTokenStartIndex:(id<ANTLRBaseTree>) t
    125 {
    126     if ( t == nil )
    127         return -1;
    128     return [(id<ANTLRBaseTree>)t getTokenStartIndex];
    129 }
    130 
    131 - (NSInteger)getTokenStopIndex:(id<ANTLRBaseTree>) t
    132 {
    133     if ( t == nil )
    134         return -1;
    135     return [(id<ANTLRBaseTree>)t getTokenStopIndex];
    136 }
    137 
    138 - (NSString *)getText:(ANTLRCommonTree *)t
    139 {
    140     if ( t == nil )
    141         return nil;
    142     return t.token.text;
    143 }
    144 
    145 - (void)setText:(id<ANTLRBaseTree>)t Text:(NSString *)text
    146 {
    147     if ( t == nil )
    148         return;
    149 }
    150 
    151 - (NSInteger)getType:(ANTLRCommonTree *)t
    152 {
    153     if ( t==nil )
    154         return ANTLRTokenTypeInvalid;
    155     return t.token.type;
    156 }
    157 
    158 - (void) setType:(id<ANTLRBaseTree>)t Type:(NSInteger)tokenType
    159 {
    160     if ( t==nil )
    161         return;
    162 }
    163 
    164 /** What is the Token associated with this node?  If
    165  *  you are not using ANTLRCommonTree, then you must
    166  *  override this in your own adaptor.
    167  */
    168 - (id<ANTLRToken>) getToken:(ANTLRCommonTree *) t
    169 {
    170     if ( [t isKindOfClass:[ANTLRCommonTree class]] ) {
    171         return t.token;
    172     }
    173     return nil; // no idea what to do
    174 }
    175 
    176 - (id<ANTLRBaseTree>) getChild:(id<ANTLRBaseTree>)t At:(NSInteger)i
    177 {
    178     if ( t == nil )
    179         return nil;
    180     return [(id<ANTLRBaseTree>)t getChild:i];
    181 }
    182 
    183 - (void) setChild:(id<ANTLRBaseTree>)t At:(NSInteger)i Child:(id<ANTLRBaseTree>)child
    184 {
    185     if ( t == nil )
    186         return;
    187     [(id<ANTLRBaseTree>)t setChild:i With:child];
    188 }
    189 
    190 - (id) deleteChild:(id<ANTLRBaseTree>)t Index:(NSInteger)anIndex
    191 {
    192     return [t deleteChild:anIndex];
    193 }
    194 
    195 - (NSInteger) getChildCount:(id<ANTLRBaseTree>) t
    196 {
    197     if ( t == nil )
    198         return 0;
    199     return [(id<ANTLRBaseTree>) t getChildCount];
    200 }
    201 
    202 - (id<ANTLRBaseTree>) getParent:(id<ANTLRBaseTree>) t
    203 {
    204     if ( t == nil )
    205         return nil;
    206     return (id<ANTLRBaseTree>)[t getParent];
    207 }
    208 
    209 - (void) setParent:(id<ANTLRBaseTree>)t With:(id<ANTLRBaseTree>) parent
    210 {
    211     if ( t != nil )
    212         [(id<ANTLRBaseTree>) t setParent:(id<ANTLRBaseTree>)parent];
    213 }
    214 
    215 - (NSInteger) getChildIndex:(id<ANTLRBaseTree>) t
    216 {
    217     if ( t == nil )
    218         return 0;
    219     return [(id<ANTLRBaseTree>) t getChildIndex];
    220 }
    221 
    222 - (void) setChildIndex:(id<ANTLRBaseTree>)t With:(NSInteger)anIndex
    223 {
    224     if ( t!=nil )
    225         [(id<ANTLRBaseTree>)t setChildIndex:anIndex];
    226 }
    227 
    228 - (void) replaceChildren:(id<ANTLRBaseTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRBaseTree>)t
    229 {
    230     if ( parent != nil ) {
    231         [(id<ANTLRBaseTree>)parent replaceChildrenFrom:startChildIndex To:stopChildIndex With:t];
    232     }
    233 }
    234 
    235 - (id) copyWithZone:(NSZone *)aZone
    236 {
    237     return [[[self class] allocWithZone:aZone] init];
    238 }
    239 
    240 @end
    241