ANTLRTokenRewriteStream.h revision 324c4644fee44b9898524c09511bd33c3f12e2df
1//
2//  ANTLRTokenRewriteStream.h
3//  ANTLR
4//
5//  Created by Alan Condit on 6/19/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 <Cocoa/Cocoa.h>
33#import "ANTLRCommonTokenStream.h"
34#import "ANTLRLinkBase.h"
35#import "ANTLRHashMap.h"
36#import "ANTLRMapElement.h"
37#import "ANTLRTokenSource.h"
38
39// Define the rewrite operation hierarchy
40
41@interface ANTLRRewriteOperation : ANTLRCommonTokenStream
42{
43/** What index into rewrites List are we? */
44NSInteger instructionIndex;
45/** Token buffer index. */
46NSInteger index;
47NSString *text;
48}
49
50@property (getter=getInstructionIndex, setter=setInstructionIndex:) NSInteger instructionIndex;
51@property (getter=getIndex, setter=setIndex:) NSInteger index;
52@property (retain, getter=getText, setter=setText:) NSString *text;
53
54+ (ANTLRRewriteOperation *) newANTLRRewriteOperation:(NSInteger)index Text:(NSString *)text;
55
56- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
57
58/** Execute the rewrite operation by possibly adding to the buffer.
59 *  Return the index of the next token to operate on.
60 */
61- (NSInteger) execute:(NSString *)buf;
62
63- (NSString *)toString;
64- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString;
65@end
66
67@interface ANTLRInsertBeforeOp : ANTLRRewriteOperation {
68}
69
70+ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger)anIndex Text:(NSString *)theText;
71- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
72
73@end
74
75/** I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
76 *  instructions.
77 */
78@interface ANTLRReplaceOp : ANTLRRewriteOperation {
79    NSInteger lastIndex;
80}
81
82@property (getter=getLastIndex, setter=setLastIndex:) NSInteger lastIndex;
83
84+ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText;
85- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
86
87- (NSInteger) execute:(NSString *)buf;
88- (NSString *)toString;
89
90@end
91
92@interface ANTLRDeleteOp : ANTLRReplaceOp {
93}
94+ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to;
95
96- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to;
97
98- (NSString *)toString;
99
100@end
101
102
103@interface ANTLRTokenRewriteStream : ANTLRCommonTokenStream {
104/** You may have multiple, named streams of rewrite operations.
105 *  I'm calling these things "programs."
106 *  Maps String (name) -> rewrite (List)
107 */
108ANTLRHashMap *programs;
109
110/** Map String (program name) -> Integer index */
111ANTLRHashMap *lastRewriteTokenIndexes;
112}
113
114@property (retain, getter=getPrograms, setter=setPrograms:) ANTLRHashMap *programs;
115@property (retain, getter=getLastRewriteTokenIndexes, setter=setLastRewriteTokenIndexes:) ANTLRHashMap *lastRewriteTokenIndexes;
116
117+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream;
118+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource;
119+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource Channel:(NSInteger)aChannel;
120
121- (id) init;
122- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
123- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource Channel:(NSInteger)aChannel;
124
125- (ANTLRHashMap *)getPrograms;
126- (void)setPrograms:(ANTLRHashMap *)aProgList;
127
128- (void) rollback:(NSInteger)instructionIndex;
129- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex;
130- (void) deleteProgram;
131- (void) deleteProgram:(NSString *)programName;
132- (void) insertAfterToken:(id<ANTLRToken>)t Text:(NSString *)theText;
133- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText;
134- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
135
136
137- (void) insertBeforeToken:(id<ANTLRToken>)t Text:(NSString *)theText;
138- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText;
139- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)index Text:(NSString *)theText;
140- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText;
141- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
142- (void) replaceFromToken:(id<ANTLRToken>)indexT Text:(NSString *)theText;
143- (void) replaceFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to Text:(NSString *)theText;
144- (void) replaceProgNam:(NSString *)programName Token:(id<ANTLRToken>)from Token:(id<ANTLRToken>)to Text:(NSString *)theText;
145- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
146- (void) delete:(NSInteger)anIndex;
147- (void) delete:(NSInteger)from ToIndex:(NSInteger)to;
148- (void) deleteToken:(id<ANTLRToken>)indexT;
149- (void) deleteFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
150- (void) delete:(NSString *)programName FromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
151- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to;
152- (NSInteger)getLastRewriteTokenIndex;
153- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName;
154- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt;
155- (ANTLRHashMap *) getProgram:(NSString *)name;
156- (ANTLRHashMap *) initializeProgram:(NSString *)name;
157- (NSString *)toOriginalString;
158- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end;
159- (NSString *)toString;
160- (NSString *)toString:(NSString *)programName;
161- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
162- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end;
163- (ANTLRHashMap *)reduceToSingleOperationPerIndex:(ANTLRHashMap *)rewrites;
164- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind;
165- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before;
166- (NSString *)catOpText:(id)a PrevText:(id)b;
167- (NSMutableString *)toDebugString;
168- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
169
170@end
171