forked from gavinkwoe/todparsekit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPKCommentState.m
141 lines (115 loc) · 4.1 KB
/
PKCommentState.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
// PKCommentState.m
// ParseKit
//
// Created by Todd Ditchendorf on 12/28/08.
// Copyright 2009 Todd Ditchendorf. All rights reserved.
//
#import <ParseKit/PKCommentState.h>
#import <ParseKit/PKTokenizer.h>
#import <ParseKit/PKToken.h>
#import <ParseKit/PKReader.h>
#import <ParseKit/PKSymbolRootNode.h>
#import <ParseKit/PKSingleLineCommentState.h>
#import <ParseKit/PKMultiLineCommentState.h>
@interface PKToken ()
@property (nonatomic, readwrite) NSUInteger offset;
@end
@interface PKTokenizerState ()
- (void)resetWithReader:(PKReader *)r;
- (PKTokenizerState *)nextTokenizerStateFor:(PKUniChar)c tokenizer:(PKTokenizer *)t;
@end
@interface PKCommentState ()
@property (nonatomic, retain) PKSymbolRootNode *rootNode;
@property (nonatomic, retain) PKSingleLineCommentState *singleLineState;
@property (nonatomic, retain) PKMultiLineCommentState *multiLineState;
@end
@interface PKSingleLineCommentState ()
- (void)addStartMarker:(NSString *)start;
- (void)removeStartMarker:(NSString *)start;
@property (nonatomic, retain) NSMutableArray *startMarkers;
@property (nonatomic, retain) NSString *currentStartMarker;
@end
@interface PKMultiLineCommentState ()
- (void)addStartMarker:(NSString *)start endMarker:(NSString *)end;
- (void)removeStartMarker:(NSString *)start;
@property (nonatomic, retain) NSMutableArray *startMarkers;
@property (nonatomic, retain) NSMutableArray *endMarkers;
@property (nonatomic, copy) NSString *currentStartMarker;
@end
@implementation PKCommentState
- (id)init {
if (self = [super init]) {
self.rootNode = [[[PKSymbolRootNode alloc] init] autorelease];
self.singleLineState = [[[PKSingleLineCommentState alloc] init] autorelease];
self.multiLineState = [[[PKMultiLineCommentState alloc] init] autorelease];
}
return self;
}
- (void)dealloc {
self.rootNode = nil;
self.singleLineState = nil;
self.multiLineState = nil;
[super dealloc];
}
- (void)addSingleLineStartMarker:(NSString *)start {
NSParameterAssert([start length]);
[rootNode add:start];
[singleLineState addStartMarker:start];
}
- (void)removeSingleLineStartMarker:(NSString *)start {
NSParameterAssert([start length]);
[rootNode remove:start];
[singleLineState removeStartMarker:start];
}
- (void)addMultiLineStartMarker:(NSString *)start endMarker:(NSString *)end {
NSParameterAssert([start length]);
NSParameterAssert([end length]);
[rootNode add:start];
[rootNode add:end];
[multiLineState addStartMarker:start endMarker:end];
}
- (void)removeMultiLineStartMarker:(NSString *)start {
NSParameterAssert([start length]);
[rootNode remove:start];
[multiLineState removeStartMarker:start];
}
- (PKToken *)nextTokenFromReader:(PKReader *)r startingWith:(PKUniChar)cin tokenizer:(PKTokenizer *)t {
NSParameterAssert(r);
NSParameterAssert(t);
[self resetWithReader:r];
NSString *symbol = [rootNode nextSymbol:r startingWith:cin];
PKToken *tok = nil;
while ([symbol length]) {
if ([multiLineState.startMarkers containsObject:symbol]) {
multiLineState.currentStartMarker = symbol;
tok = [multiLineState nextTokenFromReader:r startingWith:cin tokenizer:t];
if (tok.isComment) {
tok.offset = offset;
}
} else if ([singleLineState.startMarkers containsObject:symbol]) {
singleLineState.currentStartMarker = symbol;
tok = [singleLineState nextTokenFromReader:r startingWith:cin tokenizer:t];
if (tok.isComment) {
tok.offset = offset;
}
}
if (tok) {
return tok;
} else {
if ([symbol length] > 1) {
symbol = [symbol substringToIndex:[symbol length] -1];
} else {
break;
}
[r unread:1];
}
}
return [[self nextTokenizerStateFor:cin tokenizer:t] nextTokenFromReader:r startingWith:cin tokenizer:t];
}
@synthesize rootNode;
@synthesize singleLineState;
@synthesize multiLineState;
@synthesize reportsCommentTokens;
@synthesize balancesEOFTerminatedComments;
@end