-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTDRepetition.j
67 lines (53 loc) · 1.45 KB
/
TDRepetition.j
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
@import "TDParser.j"
@import "TDAssembly.j"
@implementation TDRepetition : TDParser
{
TDParser subparser;
id preassembler;
SEL preassemblerSelector;
}
+ (id)repetitionWithSubparser:(TDParser *)p
{
return [[self alloc] initWithSubparser:p];
}
- (id)init
{
return [self initWithSubparser:nil];
}
- (id)initWithSubparser:(TDParser)p
{
if (self = [super init])
self.subparser = p;
return self;
}
- (void)setPreassembler:(id)a selector:(SEL)sel
{
preassembler = a;
preassemblerSelector = sel;
}
- (TDParser)parserNamed:(CPString)s
{
if (name === s)
return self;
else
return [subparser parserNamed:s];
}
- (CPSet)allMatchesFor:(CPSet)inAssemblies
{
if (preassembler) {
//NSAssert2([preassembler respondsToSelector:preassemblerSelector], @"provided preassembler %@ should respond to %s", preassembler, preassemblerSelector);
var values = [inAssemblies allValues],
length = [values count];
for (var i=0; i<length; i++)
[preassembler performSelector:preassemblerSelector withObject:values[a]];
}
//NSMutableSet *outAssemblies = [[[NSSet alloc] initWithSet:inAssemblies copyItems:YES] autorelease];
var outAssemblies = [inAssemblies copy],
s = inAssemblies;
while ([s count]) {
s = [subparser matchAndAssemble:s];
[outAssemblies unionSet:s];
}
return outAssemblies;
}
@end