forked from montagejs/frb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.js
71 lines (67 loc) · 2 KB
/
parser.js
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
exports.makeParser = makeParser;
function makeParser(production) {
return function (text /*, ...args*/) {
var syntax;
var column = 0, line = 1;
var state = production.apply(this, [function (_syntax) {
syntax = _syntax;
return expectEof();
}].concat(Array.prototype.slice.call(arguments, 1)));
try {
for (var i = 0; i < text.length; i++) {
state = state(text[i], {
index: i,
line: line,
column: column
});
if (text[i] === "\n") {
line++;
column = 0;
} else {
column++;
}
}
state = state("", {
index: i,
line: line,
column: column
});
} catch (exception) {
if (exception.loc) {
var loc = exception.loc;
if (text.length > 80) {
exception.message += " at line " + loc.line + ", column " + loc.column;
} else {
exception.message += " in " + JSON.stringify(text) + " at index " + loc.index;
}
}
throw exception;
}
return syntax;
};
}
exports.expectEof = expectEof;
function expectEof() {
return function (character, loc) {
if (character !== "") {
var error = new Error("Unexpected " + JSON.stringify(character));
error.loc = loc;
throw error;
}
return function noop() {
return noop;
};
};
}
exports.makeExpect = makeExpect;
function makeExpect(expected) {
return function (callback, loc) {
return function (character, loc) {
if (character === expected) {
return callback(character, loc);
} else {
return callback()(character, loc);
}
};
};
}