boucher / tdparsekit

A non-deterministic recursive descent parser written in Objective-J (ported from Obj-C, created by Tod Ditchendorf)

tdparsekit / TDWhitespaceState.j
100644 68 lines (51 sloc) 1.612 kb
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
@import "TDTokenizerState.j"
 
@implementation TDWhitespaceState : TDTokenizerState
{
    CPArray whitespaceChars;
    BOOL reportsWhitespaceTokens;
}
 
- (id)init
{
    if (self = [super init])
    {
        whitespaceChars = [];
 
        for (var i=0, len=255; i <= len; i++) {
            [whitespaceChars addObject:NO];
        }
        
        [self setWhitespaceChars:YES from:0 to:255];
    }
 
    return self;
}
 
- (void)setWhitespaceChars:(BOOL)yn from:(unsigned)start to:(unsigned)end
{
    var len = whitespaceChars.length;
    if (start > len || end > len || start < 0 || end < 0)
        [CPException raise:@"TDWhitespaceStateNotSupportedException" reason:@"TDWhitespaceState only supports setting word chars for chars in the latin1 set (under 256)"];
 
    for (var i=start ; i <= end; i++) {
        [whitespaceChars replaceObjectAtIndex:i withObject:yn];
    }
}
 
- (BOOL)isWhitespaceChar:(unsigned)cin
{
    if (cin < 0 || cin > whitespaceChars.length - 1)
        return NO;
 
    return !![whitespaceChars objectAtIndex:cin];
}
 
- (TDToken)nextTokenFromReader:(TDReader)r startingWith:(unsigned)cin tokenizer:(TDTokenizer)t
{
    if (reportsWhitespaceTokens)
        [self reset];
    
    var c = cin;
    while ([self isWhitespaceChar:c]) {
        if (reportsWhitespaceTokens)
            [self append:c];
 
        c = [r read];
    }
 
    if (-1 != c)
        [r unread];
    
    if (reportsWhitespaceTokens)
        return [TDToken tokenWithTokenType:TDTokenTypeWhitespace stringValue:[self bufferedString] floatValue:0.0];
    else
        return [t nextToken];
}
 
@end