-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTDParser.j
106 lines (82 loc) · 2.04 KB
/
TDParser.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
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
@import <Foundation/Foundation.j>
@import "TDAssembly.j"
@implementation TDParser : CPObject
{
id assembler;
SEL selector;
CPString name;
}
+ (id)parser
{
return [[self alloc] init];
}
- (id)init
{
return self = [super init];
}
- (void)setAssembler:(id)a selector:(SEL)sel
{
[self setAssembler:a];
[self setSelector:sel];
}
- (TDParser)parserNamed:(CPString)s
{
if (name === s)
return self;
return nil;
}
- (CPSet)allMatchesFor:(CPSet)inAssemblies
{
//NSAssert1(0, @"-[TDParser %s] must be overriden", _cmd);
return nil;
}
- (TDAssembly)bestMatchFor:(TDAssembly)a
{
var initialState = [CPSet setWithObject:a],
finalState = [self matchAndAssemble:initialState];
return [self best:finalState];
}
- (TDAssembly)completeMatchFor:(TDAssembly)a
{
var best = [self bestMatchFor:a];
if (best && ![best hasMore])
return best;
return nil;
}
- (CPSet)matchAndAssemble:(CPSet)inAssemblies
{
var outAssemblies = [self allMatchesFor:inAssemblies];
if (assembler) {
//NSAssert2([assembler respondsToSelector:selector], @"provided assembler %@ should respond to %s", assembler, selector);
var values = [outAssemblies allValues],
length = [values count];
for (var i=0; i<length; i++) {
[assembler performSelector:selector withObject:values[i]];
}
}
return outAssemblies;
}
- (TDAssembly)best:(CPSet)inAssemblies
{
var best = nil,
values = [inAssemblies allValues],
length = [values count];
for (var i=0; i<length; i++) {
var a = values[i];
if (![a hasMore]) {
best = a;
break;
}
if (!best || a.objectsConsumed > best.objectsConsumed)
best = a;
}
return best;
}
- (CPString)description
{
if (name.length)
return [CPString stringWithFormat:@"%@ (%@)", [self className], name];
else
return [CPString stringWithFormat:@"%@", [self className]];
}
@end