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