-
Notifications
You must be signed in to change notification settings - Fork 4
/
toker.sc
93 lines (71 loc) · 1.66 KB
/
toker.sc
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
// =========
// The Toker
// =========
Toker {
var skoarse;
var i_am_here;
var i_saw;
*new {
| code |
^super.new.init( code );
}
init {
| code |
skoarse = code;
i_am_here = 0;
i_saw = nil;
}
see {
| want |
if (i_saw.notNil) {
if (i_saw.isKindOf(want)) {
^i_saw
}
} {
i_saw = want.match(skoarse, i_am_here);
^i_saw;
}
^nil;
}
sees {
| wants |
i_am_here = i_am_here + Toke_Whitespace.burn(skoarse, i_am_here);
wants.do {
| want |
var x = this.see(want);
if (x.notNil) {
^x;
};
};
^nil;
}
burn {
| want |
var toke = i_saw;
var msg;
if (toke.isNil) {
toke = this.see(want);
};
toke.isKindOf(want) and: {
i_saw = nil;
i_am_here = i_am_here + toke.burn;
i_am_here = i_am_here + Toke_Whitespace.burn(skoarse, i_am_here);
^toke;
};
msg = "Tried to burn " ++ want.asString ++ ", but saw " ++ toke.asString;
"Toker Fail.".postln;
msg.postln;
this.dump;
SkoarParseException(msg).throw;
}
eof {
Toke_EOF.burn(skoarse, i_am_here);
}
dump {
("\nToker Dump" ++
"\nhere : " ++ i_am_here.asString ++
"\nsaw : " ++ i_saw.asString ++
"\nskoarse: " ++ skoarse.copyRange(0,i_am_here)
++ "_$_" ++ skoarse.copyRange(i_am_here, skoarse.size)).postln;
}
}