goodguide-gibbon 0.10.1 → 0.10.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/lib/goodguide/gibbon/version.rb +1 -1
- data/vendor/gibbon/lib/gibbon.browser.dev.js +239 -138
- data/vendor/gibbon/lib/gibbon.browser.js +239 -130
- data/vendor/gibbon/package.json +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bfe6e644dc8dbda3f8054e1c36b805956387529
|
4
|
+
data.tar.gz: 33de5acdaf0e4a3f489b8cdaab289ec96a63c1eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 267c82933e85a791ce21c1a940f68c6ec1983c5cb4144dae9cd523bc602794150f4e717e72e08ea7d20ab16e967a3b5fbbb27edb9dbef78d608a673bb78272bc
|
7
|
+
data.tar.gz: e1187c03ea3bbe127376c01fac81e0a9d45870947d7889d5659c93a518d175ba399f126b4a194b63f25097a325ad56ad4920b364b9e89ada50a96177877fc8d7
|
data/Gemfile
CHANGED
@@ -116,46 +116,53 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
116
116
|
}
|
117
117
|
}
|
118
118
|
|
119
|
-
function
|
120
|
-
|
121
|
-
|
119
|
+
function assertParser(p) {
|
120
|
+
if (!(p instanceof Parser)) throw new Error('not a parser: '+p);
|
121
|
+
}
|
122
|
+
|
123
|
+
var formatError = Parsimmon.formatError = function(stream, error) {
|
124
|
+
var expected = error.expected;
|
125
|
+
var i = error.index;
|
122
126
|
|
123
127
|
if (i === stream.length) {
|
124
|
-
|
125
|
-
}
|
126
|
-
else {
|
127
|
-
var prefix = (i > 0 ? "'..." : "'");
|
128
|
-
var suffix = (stream.length - i > 12 ? "...'" : "'");
|
129
|
-
var message = 'expected ' + expected + ' at character ' + i + ', got '
|
130
|
-
+ prefix + stream.slice(i, i+12) + suffix;
|
128
|
+
return 'expected ' + expected + ', got the end of the string';
|
131
129
|
}
|
132
|
-
|
133
|
-
|
130
|
+
|
131
|
+
var prefix = (i > 0 ? "'..." : "'");
|
132
|
+
var suffix = (stream.length - i > 12 ? "...'" : "'");
|
133
|
+
return (
|
134
|
+
'expected ' + expected + ' at character ' + i + ', got ' +
|
135
|
+
prefix + stream.slice(i, i+12) + suffix
|
136
|
+
);
|
137
|
+
};
|
134
138
|
|
135
139
|
_.init = function(body) { this._ = body; };
|
136
140
|
|
137
141
|
_.parse = function(stream) {
|
138
142
|
var result = this.skip(eof)._(stream, 0);
|
139
143
|
|
140
|
-
return result.status ?
|
144
|
+
return result.status ? {
|
145
|
+
status: true,
|
146
|
+
value: result.value
|
147
|
+
} : {
|
148
|
+
status: false,
|
149
|
+
index: result.furthest,
|
150
|
+
expected: result.expected
|
151
|
+
};
|
141
152
|
};
|
142
153
|
|
143
154
|
// -*- primitive combinators -*- //
|
144
155
|
_.or = function(alternative) {
|
145
|
-
return alt(
|
156
|
+
return alt(this, alternative);
|
146
157
|
};
|
147
158
|
|
148
159
|
_.then = function(next) {
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
var result = self._(stream, i);
|
153
|
-
|
154
|
-
if (!result.status) return result;
|
160
|
+
if (typeof next === 'function') {
|
161
|
+
throw new Error('chaining features of .then are no longer supported');
|
162
|
+
}
|
155
163
|
|
156
|
-
|
157
|
-
|
158
|
-
});
|
164
|
+
assertParser(next);
|
165
|
+
return seq(this, next).map(function(results) { return results[1]; });
|
159
166
|
};
|
160
167
|
|
161
168
|
// -*- optimized iterative combinators -*- //
|
@@ -257,7 +264,7 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
257
264
|
_.atMost = function(n) { return this.times(0, n); };
|
258
265
|
_.atLeast = function(n) {
|
259
266
|
var self = this;
|
260
|
-
return seq(
|
267
|
+
return seq(this.times(n), this.many()).map(function(results) {
|
261
268
|
return results[0].concat(results[1]);
|
262
269
|
});
|
263
270
|
};
|
@@ -272,11 +279,11 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
272
279
|
};
|
273
280
|
|
274
281
|
_.skip = function(next) {
|
275
|
-
return seq(
|
282
|
+
return seq(this, next).map(function(results) { return results[0]; });
|
276
283
|
};
|
277
284
|
|
278
285
|
_.mark = function() {
|
279
|
-
return seq(
|
286
|
+
return seq(index, this, index).map(function(results) {
|
280
287
|
return { start: results[0], value: results[1], end: results[2] };
|
281
288
|
});
|
282
289
|
};
|
@@ -357,12 +364,15 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
357
364
|
};
|
358
365
|
|
359
366
|
// [Parser a] -> Parser [a]
|
360
|
-
var seq = Parsimmon.seq = function(
|
367
|
+
var seq = Parsimmon.seq = function() {
|
368
|
+
var parsers = [].slice.call(arguments);
|
369
|
+
var numParsers = parsers.length;
|
370
|
+
|
361
371
|
return Parser(function(stream, i) {
|
362
372
|
var result;
|
363
|
-
var accum = new Array(
|
373
|
+
var accum = new Array(numParsers);
|
364
374
|
|
365
|
-
for (var j = 0; j <
|
375
|
+
for (var j = 0; j < numParsers; j += 1) {
|
366
376
|
result = furthestBacktrackFor(parsers[j]._(stream, i), result);
|
367
377
|
if (!result.status) return result;
|
368
378
|
accum[j] = result.value
|
@@ -373,7 +383,11 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
373
383
|
});
|
374
384
|
};
|
375
385
|
|
376
|
-
var alt = Parsimmon.alt = function(
|
386
|
+
var alt = Parsimmon.alt = function() {
|
387
|
+
var parsers = [].slice.call(arguments);
|
388
|
+
var numParsers = parsers.length;
|
389
|
+
if (numParsers === 0) return fail('zero alternates')
|
390
|
+
|
377
391
|
return Parser(function(stream, i) {
|
378
392
|
var result;
|
379
393
|
for (var j = 0; j < parsers.length; j += 1) {
|
@@ -398,13 +412,21 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
398
412
|
_.of = Parser.of = Parsimmon.of = succeed
|
399
413
|
|
400
414
|
_.ap = function(other) {
|
401
|
-
return seq(
|
415
|
+
return seq(this, other).map(function(results) {
|
402
416
|
return results[0](results[1]);
|
403
417
|
});
|
404
418
|
};
|
405
419
|
|
406
420
|
//- Monad
|
407
|
-
_.chain =
|
421
|
+
_.chain = function(f) {
|
422
|
+
var self = this;
|
423
|
+
return Parser(function(stream, i) {
|
424
|
+
var result = self._(stream, i);
|
425
|
+
if (!result.status) return result;
|
426
|
+
var nextParser = f(result.value);
|
427
|
+
return furthestBacktrackFor(nextParser._(stream, result.index), result);
|
428
|
+
});
|
429
|
+
};
|
408
430
|
});
|
409
431
|
return Parsimmon;
|
410
432
|
})()
|
@@ -1145,7 +1167,7 @@ Gibbon.TypeAST = TypeAST = (function(_super) {
|
|
1145
1167
|
})(Variant);
|
1146
1168
|
|
1147
1169
|
parse = Gibbon.parse = (function() {
|
1148
|
-
var accessor, accessorExpr, arrow, arrowType, assertString, blankLines, blockExpr, blockType, comma, commaSepFlows, comment, component, concrete, decimal, decimalExpr, defaulted, define, definition, expr, fail, flow, fraction, fractionExpr, frame, freeFrame, fullSignature, func, funcPlaceholder, identifier, innerFrame, integer, integerExpr, isString, label, labelVal, lazy, lbrace, lbrack, lexeme, lexical, lexicalExpr, lines, listExpr, listType, lparen, lsplat, metadata, multiline, name, nonDefaultedFlow, nonPairedFlow, numericExpr, opt, pair, parenFlow, parenFrame, parenType, percent, percentExpr, program, query, queryArg, queryExpr, rbrace, rbrack, regex, rparen, rsplat, seq, signature, simpleType, singletonFlow, spanLoc, squishListExpr, str, string, stringExpr, substExpr, succeed, tag, tassign, type, typeVar, variable, whitespace, wildType, wildcard, withLoc,
|
1170
|
+
var accessor, accessorExpr, arrow, arrowType, assertString, blankLines, blockExpr, blockType, comma, commaSepFlows, comment, component, concrete, decimal, decimalExpr, defaulted, define, definition, expr, fail, flow, fraction, fractionExpr, frame, freeFrame, fullSignature, func, funcPlaceholder, handleResult, identifier, innerFrame, integer, integerExpr, isString, label, labelVal, lazy, lbrace, lbrack, lexeme, lexical, lexicalExpr, lines, listExpr, listType, lparen, lsplat, metadata, multiline, name, nonDefaultedFlow, nonPairedFlow, numericExpr, opt, pair, parenFlow, parenFrame, parenType, percent, percentExpr, program, query, queryArg, queryExpr, rbrace, rbrack, regex, rparen, rsplat, seq, signature, simpleType, singletonFlow, spanLoc, squishListExpr, str, string, stringExpr, substExpr, succeed, tag, tassign, type, typeVar, variable, whitespace, wildType, wildcard, withLoc,
|
1149
1171
|
_this = this;
|
1150
1172
|
tag = function(name, parser) {
|
1151
1173
|
return Parsimmon.Parser(function(stream, i) {
|
@@ -1245,9 +1267,9 @@ parse = Gibbon.parse = (function() {
|
|
1245
1267
|
lexicalExpr = withLoc(lexical, function(loc, name) {
|
1246
1268
|
return AST.lexical(loc, name, []);
|
1247
1269
|
});
|
1248
|
-
queryExpr = query.
|
1270
|
+
queryExpr = query.chain(function(q) {
|
1249
1271
|
var args;
|
1250
|
-
args = seq(
|
1272
|
+
args = seq(lbrack, queryArg.many(), rbrack).map(function(_arg) {
|
1251
1273
|
var a, args, loc, r, _;
|
1252
1274
|
_ = _arg[0], args = _arg[1], r = _arg[2];
|
1253
1275
|
loc = spanLoc(q, r);
|
@@ -1268,28 +1290,28 @@ parse = Gibbon.parse = (function() {
|
|
1268
1290
|
return lparen.then(flow).skip(rparen);
|
1269
1291
|
});
|
1270
1292
|
substExpr = lazy(function() {
|
1271
|
-
return seq(
|
1293
|
+
return seq(lparen, flow, rparen).map(function(_arg) {
|
1272
1294
|
var fl, l, r;
|
1273
1295
|
l = _arg[0], fl = _arg[1], r = _arg[2];
|
1274
1296
|
return AST.subst(spanLoc(l, r), fl);
|
1275
1297
|
});
|
1276
1298
|
});
|
1277
1299
|
listExpr = lazy(function() {
|
1278
|
-
return seq(
|
1300
|
+
return seq(lbrack, commaSepFlows, rbrack).map(function(_arg) {
|
1279
1301
|
var els, l, r;
|
1280
1302
|
l = _arg[0], els = _arg[1], r = _arg[2];
|
1281
1303
|
return AST.list(spanLoc(l, r), els, false);
|
1282
1304
|
});
|
1283
1305
|
});
|
1284
1306
|
squishListExpr = lazy(function() {
|
1285
|
-
return seq(
|
1307
|
+
return seq(lsplat, commaSepFlows, rsplat).map(function(_arg) {
|
1286
1308
|
var els, l, r;
|
1287
1309
|
l = _arg[0], els = _arg[1], r = _arg[2];
|
1288
1310
|
return AST.list(spanLoc(l, r), els, true);
|
1289
1311
|
});
|
1290
1312
|
});
|
1291
1313
|
blockExpr = lazy(function() {
|
1292
|
-
return seq(
|
1314
|
+
return seq(lbrace, flow, rbrace).map(function(_arg) {
|
1293
1315
|
var flow, l, r;
|
1294
1316
|
l = _arg[0], flow = _arg[1], r = _arg[2];
|
1295
1317
|
return AST.block(spanLoc(l, r), flow);
|
@@ -1299,7 +1321,7 @@ parse = Gibbon.parse = (function() {
|
|
1299
1321
|
singletonFlow = expr.map(function(e) {
|
1300
1322
|
return AST.flow(e.loc, e, null);
|
1301
1323
|
});
|
1302
|
-
func = seq(
|
1324
|
+
func = seq(name, parenFlow.or(singletonFlow).many()).map(function(_arg) {
|
1303
1325
|
var args, loc, name;
|
1304
1326
|
name = _arg[0], args = _arg[1];
|
1305
1327
|
loc = {
|
@@ -1312,7 +1334,7 @@ parse = Gibbon.parse = (function() {
|
|
1312
1334
|
return AST.func(loc, name.value, args);
|
1313
1335
|
});
|
1314
1336
|
component = expr.or(func).skip(lines);
|
1315
|
-
nonPairedFlow = seq(
|
1337
|
+
nonPairedFlow = seq(component, arrow.then(component).many()).map(function(_arg) {
|
1316
1338
|
var comp, cursor, first, rest, _i, _len;
|
1317
1339
|
first = _arg[0], rest = _arg[1];
|
1318
1340
|
cursor = AST.flow(first.loc, first, null);
|
@@ -1336,7 +1358,7 @@ parse = Gibbon.parse = (function() {
|
|
1336
1358
|
return AST.flow(loc, AST.defaulted(loc, body, alternative), null);
|
1337
1359
|
});
|
1338
1360
|
}));
|
1339
|
-
commaSepFlows = seq(
|
1361
|
+
commaSepFlows = seq(flow.skip(seq(opt(comma, lines))).many(), opt(flow)).map(function(_arg) {
|
1340
1362
|
var els, final;
|
1341
1363
|
els = _arg[0], final = _arg[1];
|
1342
1364
|
if (final) {
|
@@ -1344,24 +1366,24 @@ parse = Gibbon.parse = (function() {
|
|
1344
1366
|
}
|
1345
1367
|
return els;
|
1346
1368
|
});
|
1347
|
-
metadata = seq(
|
1369
|
+
metadata = seq(label, labelVal).map(function(key, text) {
|
1348
1370
|
return AST.metadata(spanLoc(key, text), key.value, text.value);
|
1349
1371
|
});
|
1350
1372
|
definition = lazy(function() {
|
1351
|
-
return seq(
|
1373
|
+
return seq(metadata.many(), name, define.then(innerFrame)).map(function(_arg) {
|
1352
1374
|
var fl, loc, md, n, _ref5;
|
1353
1375
|
md = _arg[0], n = _arg[1], fl = _arg[2];
|
1354
1376
|
loc = spanLoc(((_ref5 = md[0]) != null ? _ref5.loc : void 0) || n, fl);
|
1355
1377
|
return AST.definition(loc, md, n.value, fl);
|
1356
1378
|
});
|
1357
1379
|
});
|
1358
|
-
frame = seq(
|
1380
|
+
frame = seq(definition.many(), flow).map(function(_arg) {
|
1359
1381
|
var defs, flow, loc;
|
1360
1382
|
defs = _arg[0], flow = _arg[1];
|
1361
1383
|
loc = spanLoc((defs[0] || flow).loc, flow.loc);
|
1362
1384
|
return AST.frame(loc, defs, flow);
|
1363
1385
|
});
|
1364
|
-
parenFrame = seq(
|
1386
|
+
parenFrame = seq(lparen, frame, rparen, lines).map(function(_arg) {
|
1365
1387
|
var fr, l, r, _;
|
1366
1388
|
l = _arg[0], fr = _arg[1], r = _arg[2], _ = _arg[3];
|
1367
1389
|
fr.loc = spanLoc(l, r);
|
@@ -1381,7 +1403,7 @@ parse = Gibbon.parse = (function() {
|
|
1381
1403
|
});
|
1382
1404
|
wildType = wildcard.result(TypeAST.wildcard());
|
1383
1405
|
listType = lazy(function() {
|
1384
|
-
return seq(
|
1406
|
+
return seq(lbrack, type, rbrack).map(function(_arg) {
|
1385
1407
|
var t, _, __;
|
1386
1408
|
_ = _arg[0], t = _arg[1], __ = _arg[2];
|
1387
1409
|
return TypeAST.list(t);
|
@@ -1401,12 +1423,12 @@ parse = Gibbon.parse = (function() {
|
|
1401
1423
|
return TypeAST.pair(first, second);
|
1402
1424
|
});
|
1403
1425
|
});
|
1404
|
-
arrowType = seq(
|
1426
|
+
arrowType = seq(type, arrow, type).map(function(_arg) {
|
1405
1427
|
var first, second, _;
|
1406
1428
|
first = _arg[0], _ = _arg[1], second = _arg[2];
|
1407
1429
|
return TypeAST.arrow(first, second);
|
1408
1430
|
});
|
1409
|
-
signature = seq(
|
1431
|
+
signature = seq(name, type.many(), tassign.then(arrowType)).map(function(_arg) {
|
1410
1432
|
var argTypes, ftype, name;
|
1411
1433
|
name = _arg[0], argTypes = _arg[1], ftype = _arg[2];
|
1412
1434
|
return TypeAST.func(ftype.from, argTypes, ftype.to);
|
@@ -1420,13 +1442,20 @@ parse = Gibbon.parse = (function() {
|
|
1420
1442
|
throw 'can only parse strings';
|
1421
1443
|
}
|
1422
1444
|
};
|
1445
|
+
handleResult = function(result) {
|
1446
|
+
if (result.status) {
|
1447
|
+
return result.value;
|
1448
|
+
} else {
|
1449
|
+
throw new Error(Parsimmon.formatError(result));
|
1450
|
+
}
|
1451
|
+
};
|
1423
1452
|
parse = function(str) {
|
1424
1453
|
assertString(str);
|
1425
|
-
return program.parse(str);
|
1454
|
+
return handleResult(program.parse(str));
|
1426
1455
|
};
|
1427
1456
|
parse.type = function(str) {
|
1428
1457
|
assertString(str);
|
1429
|
-
return fullSignature.parse(str);
|
1458
|
+
return handleResult(fullSignature.parse(str));
|
1430
1459
|
};
|
1431
1460
|
return parse;
|
1432
1461
|
})();
|
@@ -3522,36 +3551,157 @@ Gibbon.optimize = (function() {
|
|
3522
3551
|
});
|
3523
3552
|
};
|
3524
3553
|
insertBindings = (function() {
|
3525
|
-
var findLastCommon, genSubstitutions, makeCrumbs,
|
3554
|
+
var SubstTree, findLastCommon, genSubstitutions, insertSubstitutions, makeCrumbs, _ref10;
|
3555
|
+
SubstTree = (function(_super) {
|
3556
|
+
__extends(SubstTree, _super);
|
3557
|
+
|
3558
|
+
function SubstTree() {
|
3559
|
+
_ref10 = SubstTree.__super__.constructor.apply(this, arguments);
|
3560
|
+
return _ref10;
|
3561
|
+
}
|
3562
|
+
|
3563
|
+
SubstTree.variants({
|
3564
|
+
subst: ['bindings', 'expr']
|
3565
|
+
});
|
3566
|
+
|
3567
|
+
SubstTree.prototype.toCore = function() {
|
3568
|
+
return this.__toCore || (this.__toCore = this.expr.map(function(x) {
|
3569
|
+
return x.toCore();
|
3570
|
+
}));
|
3571
|
+
};
|
3572
|
+
|
3573
|
+
SubstTree.prototype.inspect = function() {
|
3574
|
+
var e;
|
3575
|
+
if (!this.bindings.length) {
|
3576
|
+
return this.expr.inspect();
|
3577
|
+
}
|
3578
|
+
return "(subst [" + (((function() {
|
3579
|
+
var _i, _len, _ref11, _results;
|
3580
|
+
_ref11 = this.bindings;
|
3581
|
+
_results = [];
|
3582
|
+
for (_i = 0, _len = _ref11.length; _i < _len; _i++) {
|
3583
|
+
e = _ref11[_i];
|
3584
|
+
_results.push(e.inspect());
|
3585
|
+
}
|
3586
|
+
return _results;
|
3587
|
+
}).call(this)).join(' ')) + "] " + (this.expr.inspect()) + ")";
|
3588
|
+
};
|
3589
|
+
|
3590
|
+
SubstTree.prototype.map = function(f) {
|
3591
|
+
var e;
|
3592
|
+
return SubstTree.subst((function() {
|
3593
|
+
var _i, _len, _ref11, _results;
|
3594
|
+
_ref11 = this.bindings;
|
3595
|
+
_results = [];
|
3596
|
+
for (_i = 0, _len = _ref11.length; _i < _len; _i++) {
|
3597
|
+
e = _ref11[_i];
|
3598
|
+
_results.push(e.map(f));
|
3599
|
+
}
|
3600
|
+
return _results;
|
3601
|
+
}).call(this), this.expr.map(f));
|
3602
|
+
};
|
3603
|
+
|
3604
|
+
SubstTree.prototype.substituteWith = function(names, bindableExprs) {
|
3605
|
+
var bindable, core, hash, i, _i, _len;
|
3606
|
+
core = this.toCore();
|
3607
|
+
hash = core.hash();
|
3608
|
+
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3609
|
+
bindable = bindableExprs[i];
|
3610
|
+
if (hash === bindable.toCore().hash()) {
|
3611
|
+
return SubstTree.unit(Core.variable(names[i]));
|
3612
|
+
}
|
3613
|
+
}
|
3614
|
+
return this.map(function(x) {
|
3615
|
+
return x.substituteWith(names, bindableExprs);
|
3616
|
+
});
|
3617
|
+
};
|
3618
|
+
|
3619
|
+
SubstTree.prototype.simplify = function() {
|
3620
|
+
var bindableExprs, expr;
|
3621
|
+
bindableExprs = this.bindings;
|
3622
|
+
expr = this.expr;
|
3623
|
+
return expr.cases({
|
3624
|
+
rescue: function() {
|
3625
|
+
return SubstTree.unit(this.map(function(x) {
|
3626
|
+
return insertSubstitutions(x.toCore());
|
3627
|
+
}));
|
3628
|
+
},
|
3629
|
+
squishList: function(list) {
|
3630
|
+
list = list.toCore();
|
3631
|
+
if (list._tag !== 'list') {
|
3632
|
+
throw 'invalid squish';
|
3633
|
+
}
|
3634
|
+
return SubstTree.unit(Core.squishList(SubstTree.unit(list.map(insertSubstitutions))));
|
3635
|
+
},
|
3636
|
+
other: function() {
|
3637
|
+
var bindable, i, names, out, substituted, _, _i, _len;
|
3638
|
+
substituted = expr.map(function(t) {
|
3639
|
+
return t.simplify();
|
3640
|
+
});
|
3641
|
+
names = (function() {
|
3642
|
+
var _i, _len, _results;
|
3643
|
+
_results = [];
|
3644
|
+
for (_i = 0, _len = bindableExprs.length; _i < _len; _i++) {
|
3645
|
+
_ = bindableExprs[_i];
|
3646
|
+
_results.push(nameGen('b'));
|
3647
|
+
}
|
3648
|
+
return _results;
|
3649
|
+
})();
|
3650
|
+
if (!bindableExprs.length) {
|
3651
|
+
return SubstTree.unit(substituted);
|
3652
|
+
}
|
3653
|
+
out = SubstTree.unit(substituted).substituteWith(names, bindableExprs);
|
3654
|
+
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3655
|
+
bindable = bindableExprs[i];
|
3656
|
+
out = SubstTree.unit(Core.bind(names[i], bindable, out));
|
3657
|
+
}
|
3658
|
+
DEBUG.log("=> " + (out.inspect()));
|
3659
|
+
return out;
|
3660
|
+
}
|
3661
|
+
});
|
3662
|
+
};
|
3663
|
+
|
3664
|
+
SubstTree.unit = function(expr) {
|
3665
|
+
return SubstTree.subst([], expr);
|
3666
|
+
};
|
3667
|
+
|
3668
|
+
return SubstTree;
|
3669
|
+
|
3670
|
+
})(Variant);
|
3526
3671
|
makeCrumbs = function(trace) {
|
3527
3672
|
return trace.mapArray(function(e) {
|
3528
3673
|
return e.hash();
|
3529
3674
|
}).reverse();
|
3530
3675
|
};
|
3531
3676
|
genSubstitutions = function(expr) {
|
3532
|
-
var
|
3677
|
+
var occurrences, queue, recurse, substitutions;
|
3533
3678
|
occurrences = new ObjHash;
|
3534
3679
|
substitutions = new Hash;
|
3535
3680
|
queue = [[expr, List.empty()]];
|
3536
3681
|
while (queue.length) {
|
3537
|
-
|
3538
|
-
|
3539
|
-
|
3540
|
-
|
3541
|
-
|
3542
|
-
occurrences.get(expr).push(makeCrumbs(trace));
|
3543
|
-
} else {
|
3544
|
-
occurrences.set(expr, [makeCrumbs(trace)]);
|
3545
|
-
newTrace = trace.cons(expr);
|
3546
|
-
if ((_ref11 = expr._tag) === 'rescue' || _ref11 === 'squishList') {
|
3547
|
-
continue;
|
3682
|
+
(function(_arg) {
|
3683
|
+
var expr, newTrace, sub, trace, _i, _len, _ref11, _ref12, _results;
|
3684
|
+
expr = _arg[0], trace = _arg[1];
|
3685
|
+
if (expr.isSimple() || expr.alwaysFails()) {
|
3686
|
+
return;
|
3548
3687
|
}
|
3549
|
-
|
3550
|
-
|
3551
|
-
|
3552
|
-
|
3688
|
+
if (occurrences.has(expr)) {
|
3689
|
+
return occurrences.get(expr).push(makeCrumbs(trace));
|
3690
|
+
} else {
|
3691
|
+
occurrences.set(expr, [makeCrumbs(trace)]);
|
3692
|
+
newTrace = trace.cons(expr);
|
3693
|
+
if ((_ref11 = expr._tag) === 'rescue' || _ref11 === 'squishList') {
|
3694
|
+
return;
|
3695
|
+
}
|
3696
|
+
_ref12 = expr.subtrees();
|
3697
|
+
_results = [];
|
3698
|
+
for (_i = 0, _len = _ref12.length; _i < _len; _i++) {
|
3699
|
+
sub = _ref12[_i];
|
3700
|
+
_results.push(queue.push([sub, newTrace]));
|
3701
|
+
}
|
3702
|
+
return _results;
|
3553
3703
|
}
|
3554
|
-
}
|
3704
|
+
})(queue.shift());
|
3555
3705
|
}
|
3556
3706
|
occurrences.each(function(expr, crumbs) {
|
3557
3707
|
var insertionPoint;
|
@@ -3564,7 +3714,22 @@ Gibbon.optimize = (function() {
|
|
3564
3714
|
});
|
3565
3715
|
return substitutions.get(insertionPoint).push(expr);
|
3566
3716
|
});
|
3567
|
-
return
|
3717
|
+
return (recurse = function(expr) {
|
3718
|
+
var bindableExprs, e;
|
3719
|
+
bindableExprs = substitutions.get(expr.hash());
|
3720
|
+
if (!bindableExprs) {
|
3721
|
+
return SubstTree.unit(expr.map(recurse));
|
3722
|
+
}
|
3723
|
+
return SubstTree.subst((function() {
|
3724
|
+
var _i, _len, _results;
|
3725
|
+
_results = [];
|
3726
|
+
for (_i = 0, _len = bindableExprs.length; _i < _len; _i++) {
|
3727
|
+
e = bindableExprs[_i];
|
3728
|
+
_results.push(recurse(e));
|
3729
|
+
}
|
3730
|
+
return _results;
|
3731
|
+
})(), expr.map(recurse));
|
3732
|
+
})(expr);
|
3568
3733
|
};
|
3569
3734
|
findLastCommon = function(_arg) {
|
3570
3735
|
var i, last, refCrumb, reference, rest, testCrumbs, _i, _j, _len, _len1;
|
@@ -3582,66 +3747,11 @@ Gibbon.optimize = (function() {
|
|
3582
3747
|
}
|
3583
3748
|
return refCrumb;
|
3584
3749
|
};
|
3585
|
-
|
3586
|
-
|
3587
|
-
return (recurse = function(expr) {
|
3588
|
-
var bindable, bindableExprs, i, names, out, recurseInner, _, _i, _len;
|
3589
|
-
bindableExprs = substitutions.get(expr.hash());
|
3590
|
-
if (!bindableExprs) {
|
3591
|
-
return expr.map(recurse);
|
3592
|
-
}
|
3593
|
-
names = (function() {
|
3594
|
-
var _i, _len, _results;
|
3595
|
-
_results = [];
|
3596
|
-
for (_i = 0, _len = bindableExprs.length; _i < _len; _i++) {
|
3597
|
-
_ = bindableExprs[_i];
|
3598
|
-
_results.push(nameGen('b'));
|
3599
|
-
}
|
3600
|
-
return _results;
|
3601
|
-
})();
|
3602
|
-
DEBUG(function() {
|
3603
|
-
var bindable, i, _i, _len, _results;
|
3604
|
-
_results = [];
|
3605
|
-
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3606
|
-
bindable = bindableExprs[i];
|
3607
|
-
_results.push(DEBUG.log("binding " + (bindable.inspect()) + " as " + names[i]));
|
3608
|
-
}
|
3609
|
-
return _results;
|
3610
|
-
});
|
3611
|
-
out = (recurseInner = function(boundExpr) {
|
3612
|
-
var bindable, hash, i, _i, _len;
|
3613
|
-
hash = boundExpr.hash();
|
3614
|
-
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3615
|
-
bindable = bindableExprs[i];
|
3616
|
-
if (hash === bindable.hash()) {
|
3617
|
-
return Core.variable(names[i]);
|
3618
|
-
}
|
3619
|
-
}
|
3620
|
-
return boundExpr.cases({
|
3621
|
-
rescue: function(expr, default_) {
|
3622
|
-
return Core.rescue(insertBindings(expr), insertBindings(default_));
|
3623
|
-
},
|
3624
|
-
squishList: function(list) {
|
3625
|
-
if (list._tag !== 'list') {
|
3626
|
-
throw 'invalid squish';
|
3627
|
-
}
|
3628
|
-
return Core.squishList(list.map(insertBindings));
|
3629
|
-
},
|
3630
|
-
other: function() {
|
3631
|
-
return this.map(recurseInner);
|
3632
|
-
}
|
3633
|
-
});
|
3634
|
-
})(expr);
|
3635
|
-
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3636
|
-
bindable = bindableExprs[i];
|
3637
|
-
out = Core.bind(names[i], bindable, out);
|
3638
|
-
}
|
3639
|
-
DEBUG.log("=> " + (out.inspect()));
|
3640
|
-
return out.map(recurse);
|
3641
|
-
})(expr);
|
3750
|
+
insertSubstitutions = function(expr) {
|
3751
|
+
return genSubstitutions(expr).simplify();
|
3642
3752
|
};
|
3643
3753
|
return function(expr) {
|
3644
|
-
return
|
3754
|
+
return insertSubstitutions(expr).toCore();
|
3645
3755
|
};
|
3646
3756
|
})();
|
3647
3757
|
return function(expr) {
|
@@ -5066,7 +5176,7 @@ Gibbon.reduce = (function() {
|
|
5066
5176
|
})();
|
5067
5177
|
|
5068
5178
|
Gibbon.JS = JS = (function(_super) {
|
5069
|
-
var inspectString,
|
5179
|
+
var inspectString, validIdent;
|
5070
5180
|
|
5071
5181
|
__extends(JS, _super);
|
5072
5182
|
|
@@ -5095,15 +5205,6 @@ Gibbon.JS = JS = (function(_super) {
|
|
5095
5205
|
varDecl: ['name']
|
5096
5206
|
});
|
5097
5207
|
|
5098
|
-
oldBlock = JS.block;
|
5099
|
-
|
5100
|
-
JS.block = function(s) {
|
5101
|
-
if (!isArray(s)) {
|
5102
|
-
throw 'lol';
|
5103
|
-
}
|
5104
|
-
return oldBlock(s);
|
5105
|
-
};
|
5106
|
-
|
5107
5208
|
JS.prototype.toFunction = function() {
|
5108
5209
|
return this.cases({
|
5109
5210
|
func: function(name, args, block) {
|
@@ -116,46 +116,53 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
116
116
|
}
|
117
117
|
}
|
118
118
|
|
119
|
-
function
|
120
|
-
|
121
|
-
|
119
|
+
function assertParser(p) {
|
120
|
+
if (!(p instanceof Parser)) throw new Error('not a parser: '+p);
|
121
|
+
}
|
122
|
+
|
123
|
+
var formatError = Parsimmon.formatError = function(stream, error) {
|
124
|
+
var expected = error.expected;
|
125
|
+
var i = error.index;
|
122
126
|
|
123
127
|
if (i === stream.length) {
|
124
|
-
|
125
|
-
}
|
126
|
-
else {
|
127
|
-
var prefix = (i > 0 ? "'..." : "'");
|
128
|
-
var suffix = (stream.length - i > 12 ? "...'" : "'");
|
129
|
-
var message = 'expected ' + expected + ' at character ' + i + ', got '
|
130
|
-
+ prefix + stream.slice(i, i+12) + suffix;
|
128
|
+
return 'expected ' + expected + ', got the end of the string';
|
131
129
|
}
|
132
|
-
|
133
|
-
|
130
|
+
|
131
|
+
var prefix = (i > 0 ? "'..." : "'");
|
132
|
+
var suffix = (stream.length - i > 12 ? "...'" : "'");
|
133
|
+
return (
|
134
|
+
'expected ' + expected + ' at character ' + i + ', got ' +
|
135
|
+
prefix + stream.slice(i, i+12) + suffix
|
136
|
+
);
|
137
|
+
};
|
134
138
|
|
135
139
|
_.init = function(body) { this._ = body; };
|
136
140
|
|
137
141
|
_.parse = function(stream) {
|
138
142
|
var result = this.skip(eof)._(stream, 0);
|
139
143
|
|
140
|
-
return result.status ?
|
144
|
+
return result.status ? {
|
145
|
+
status: true,
|
146
|
+
value: result.value
|
147
|
+
} : {
|
148
|
+
status: false,
|
149
|
+
index: result.furthest,
|
150
|
+
expected: result.expected
|
151
|
+
};
|
141
152
|
};
|
142
153
|
|
143
154
|
// -*- primitive combinators -*- //
|
144
155
|
_.or = function(alternative) {
|
145
|
-
return alt(
|
156
|
+
return alt(this, alternative);
|
146
157
|
};
|
147
158
|
|
148
159
|
_.then = function(next) {
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
var result = self._(stream, i);
|
153
|
-
|
154
|
-
if (!result.status) return result;
|
160
|
+
if (typeof next === 'function') {
|
161
|
+
throw new Error('chaining features of .then are no longer supported');
|
162
|
+
}
|
155
163
|
|
156
|
-
|
157
|
-
|
158
|
-
});
|
164
|
+
assertParser(next);
|
165
|
+
return seq(this, next).map(function(results) { return results[1]; });
|
159
166
|
};
|
160
167
|
|
161
168
|
// -*- optimized iterative combinators -*- //
|
@@ -257,7 +264,7 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
257
264
|
_.atMost = function(n) { return this.times(0, n); };
|
258
265
|
_.atLeast = function(n) {
|
259
266
|
var self = this;
|
260
|
-
return seq(
|
267
|
+
return seq(this.times(n), this.many()).map(function(results) {
|
261
268
|
return results[0].concat(results[1]);
|
262
269
|
});
|
263
270
|
};
|
@@ -272,11 +279,11 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
272
279
|
};
|
273
280
|
|
274
281
|
_.skip = function(next) {
|
275
|
-
return seq(
|
282
|
+
return seq(this, next).map(function(results) { return results[0]; });
|
276
283
|
};
|
277
284
|
|
278
285
|
_.mark = function() {
|
279
|
-
return seq(
|
286
|
+
return seq(index, this, index).map(function(results) {
|
280
287
|
return { start: results[0], value: results[1], end: results[2] };
|
281
288
|
});
|
282
289
|
};
|
@@ -357,12 +364,15 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
357
364
|
};
|
358
365
|
|
359
366
|
// [Parser a] -> Parser [a]
|
360
|
-
var seq = Parsimmon.seq = function(
|
367
|
+
var seq = Parsimmon.seq = function() {
|
368
|
+
var parsers = [].slice.call(arguments);
|
369
|
+
var numParsers = parsers.length;
|
370
|
+
|
361
371
|
return Parser(function(stream, i) {
|
362
372
|
var result;
|
363
|
-
var accum = new Array(
|
373
|
+
var accum = new Array(numParsers);
|
364
374
|
|
365
|
-
for (var j = 0; j <
|
375
|
+
for (var j = 0; j < numParsers; j += 1) {
|
366
376
|
result = furthestBacktrackFor(parsers[j]._(stream, i), result);
|
367
377
|
if (!result.status) return result;
|
368
378
|
accum[j] = result.value
|
@@ -373,7 +383,11 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
373
383
|
});
|
374
384
|
};
|
375
385
|
|
376
|
-
var alt = Parsimmon.alt = function(
|
386
|
+
var alt = Parsimmon.alt = function() {
|
387
|
+
var parsers = [].slice.call(arguments);
|
388
|
+
var numParsers = parsers.length;
|
389
|
+
if (numParsers === 0) return fail('zero alternates')
|
390
|
+
|
377
391
|
return Parser(function(stream, i) {
|
378
392
|
var result;
|
379
393
|
for (var j = 0; j < parsers.length; j += 1) {
|
@@ -398,13 +412,21 @@ Parsimmon.Parser = P(function(_, _super, Parser) {
|
|
398
412
|
_.of = Parser.of = Parsimmon.of = succeed
|
399
413
|
|
400
414
|
_.ap = function(other) {
|
401
|
-
return seq(
|
415
|
+
return seq(this, other).map(function(results) {
|
402
416
|
return results[0](results[1]);
|
403
417
|
});
|
404
418
|
};
|
405
419
|
|
406
420
|
//- Monad
|
407
|
-
_.chain =
|
421
|
+
_.chain = function(f) {
|
422
|
+
var self = this;
|
423
|
+
return Parser(function(stream, i) {
|
424
|
+
var result = self._(stream, i);
|
425
|
+
if (!result.status) return result;
|
426
|
+
var nextParser = f(result.value);
|
427
|
+
return furthestBacktrackFor(nextParser._(stream, result.index), result);
|
428
|
+
});
|
429
|
+
};
|
408
430
|
});
|
409
431
|
return Parsimmon;
|
410
432
|
})()
|
@@ -1135,7 +1157,7 @@ Gibbon.TypeAST = TypeAST = (function(_super) {
|
|
1135
1157
|
})(Variant);
|
1136
1158
|
|
1137
1159
|
parse = Gibbon.parse = (function() {
|
1138
|
-
var accessor, accessorExpr, arrow, arrowType, assertString, blankLines, blockExpr, blockType, comma, commaSepFlows, comment, component, concrete, decimal, decimalExpr, defaulted, define, definition, expr, fail, flow, fraction, fractionExpr, frame, freeFrame, fullSignature, func, funcPlaceholder, identifier, innerFrame, integer, integerExpr, isString, label, labelVal, lazy, lbrace, lbrack, lexeme, lexical, lexicalExpr, lines, listExpr, listType, lparen, lsplat, metadata, multiline, name, nonDefaultedFlow, nonPairedFlow, numericExpr, opt, pair, parenFlow, parenFrame, parenType, percent, percentExpr, program, query, queryArg, queryExpr, rbrace, rbrack, regex, rparen, rsplat, seq, signature, simpleType, singletonFlow, spanLoc, squishListExpr, str, string, stringExpr, substExpr, succeed, tag, tassign, type, typeVar, variable, whitespace, wildType, wildcard, withLoc,
|
1160
|
+
var accessor, accessorExpr, arrow, arrowType, assertString, blankLines, blockExpr, blockType, comma, commaSepFlows, comment, component, concrete, decimal, decimalExpr, defaulted, define, definition, expr, fail, flow, fraction, fractionExpr, frame, freeFrame, fullSignature, func, funcPlaceholder, handleResult, identifier, innerFrame, integer, integerExpr, isString, label, labelVal, lazy, lbrace, lbrack, lexeme, lexical, lexicalExpr, lines, listExpr, listType, lparen, lsplat, metadata, multiline, name, nonDefaultedFlow, nonPairedFlow, numericExpr, opt, pair, parenFlow, parenFrame, parenType, percent, percentExpr, program, query, queryArg, queryExpr, rbrace, rbrack, regex, rparen, rsplat, seq, signature, simpleType, singletonFlow, spanLoc, squishListExpr, str, string, stringExpr, substExpr, succeed, tag, tassign, type, typeVar, variable, whitespace, wildType, wildcard, withLoc,
|
1139
1161
|
_this = this;
|
1140
1162
|
tag = function(name, parser) {
|
1141
1163
|
return Parsimmon.Parser(function(stream, i) {
|
@@ -1235,9 +1257,9 @@ parse = Gibbon.parse = (function() {
|
|
1235
1257
|
lexicalExpr = withLoc(lexical, function(loc, name) {
|
1236
1258
|
return AST.lexical(loc, name, []);
|
1237
1259
|
});
|
1238
|
-
queryExpr = query.
|
1260
|
+
queryExpr = query.chain(function(q) {
|
1239
1261
|
var args;
|
1240
|
-
args = seq(
|
1262
|
+
args = seq(lbrack, queryArg.many(), rbrack).map(function(_arg) {
|
1241
1263
|
var a, args, loc, r, _;
|
1242
1264
|
_ = _arg[0], args = _arg[1], r = _arg[2];
|
1243
1265
|
loc = spanLoc(q, r);
|
@@ -1258,28 +1280,28 @@ parse = Gibbon.parse = (function() {
|
|
1258
1280
|
return lparen.then(flow).skip(rparen);
|
1259
1281
|
});
|
1260
1282
|
substExpr = lazy(function() {
|
1261
|
-
return seq(
|
1283
|
+
return seq(lparen, flow, rparen).map(function(_arg) {
|
1262
1284
|
var fl, l, r;
|
1263
1285
|
l = _arg[0], fl = _arg[1], r = _arg[2];
|
1264
1286
|
return AST.subst(spanLoc(l, r), fl);
|
1265
1287
|
});
|
1266
1288
|
});
|
1267
1289
|
listExpr = lazy(function() {
|
1268
|
-
return seq(
|
1290
|
+
return seq(lbrack, commaSepFlows, rbrack).map(function(_arg) {
|
1269
1291
|
var els, l, r;
|
1270
1292
|
l = _arg[0], els = _arg[1], r = _arg[2];
|
1271
1293
|
return AST.list(spanLoc(l, r), els, false);
|
1272
1294
|
});
|
1273
1295
|
});
|
1274
1296
|
squishListExpr = lazy(function() {
|
1275
|
-
return seq(
|
1297
|
+
return seq(lsplat, commaSepFlows, rsplat).map(function(_arg) {
|
1276
1298
|
var els, l, r;
|
1277
1299
|
l = _arg[0], els = _arg[1], r = _arg[2];
|
1278
1300
|
return AST.list(spanLoc(l, r), els, true);
|
1279
1301
|
});
|
1280
1302
|
});
|
1281
1303
|
blockExpr = lazy(function() {
|
1282
|
-
return seq(
|
1304
|
+
return seq(lbrace, flow, rbrace).map(function(_arg) {
|
1283
1305
|
var flow, l, r;
|
1284
1306
|
l = _arg[0], flow = _arg[1], r = _arg[2];
|
1285
1307
|
return AST.block(spanLoc(l, r), flow);
|
@@ -1289,7 +1311,7 @@ parse = Gibbon.parse = (function() {
|
|
1289
1311
|
singletonFlow = expr.map(function(e) {
|
1290
1312
|
return AST.flow(e.loc, e, null);
|
1291
1313
|
});
|
1292
|
-
func = seq(
|
1314
|
+
func = seq(name, parenFlow.or(singletonFlow).many()).map(function(_arg) {
|
1293
1315
|
var args, loc, name;
|
1294
1316
|
name = _arg[0], args = _arg[1];
|
1295
1317
|
loc = {
|
@@ -1302,7 +1324,7 @@ parse = Gibbon.parse = (function() {
|
|
1302
1324
|
return AST.func(loc, name.value, args);
|
1303
1325
|
});
|
1304
1326
|
component = expr.or(func).skip(lines);
|
1305
|
-
nonPairedFlow = seq(
|
1327
|
+
nonPairedFlow = seq(component, arrow.then(component).many()).map(function(_arg) {
|
1306
1328
|
var comp, cursor, first, rest, _i, _len;
|
1307
1329
|
first = _arg[0], rest = _arg[1];
|
1308
1330
|
cursor = AST.flow(first.loc, first, null);
|
@@ -1326,7 +1348,7 @@ parse = Gibbon.parse = (function() {
|
|
1326
1348
|
return AST.flow(loc, AST.defaulted(loc, body, alternative), null);
|
1327
1349
|
});
|
1328
1350
|
}));
|
1329
|
-
commaSepFlows = seq(
|
1351
|
+
commaSepFlows = seq(flow.skip(seq(opt(comma, lines))).many(), opt(flow)).map(function(_arg) {
|
1330
1352
|
var els, final;
|
1331
1353
|
els = _arg[0], final = _arg[1];
|
1332
1354
|
if (final) {
|
@@ -1334,24 +1356,24 @@ parse = Gibbon.parse = (function() {
|
|
1334
1356
|
}
|
1335
1357
|
return els;
|
1336
1358
|
});
|
1337
|
-
metadata = seq(
|
1359
|
+
metadata = seq(label, labelVal).map(function(key, text) {
|
1338
1360
|
return AST.metadata(spanLoc(key, text), key.value, text.value);
|
1339
1361
|
});
|
1340
1362
|
definition = lazy(function() {
|
1341
|
-
return seq(
|
1363
|
+
return seq(metadata.many(), name, define.then(innerFrame)).map(function(_arg) {
|
1342
1364
|
var fl, loc, md, n, _ref5;
|
1343
1365
|
md = _arg[0], n = _arg[1], fl = _arg[2];
|
1344
1366
|
loc = spanLoc(((_ref5 = md[0]) != null ? _ref5.loc : void 0) || n, fl);
|
1345
1367
|
return AST.definition(loc, md, n.value, fl);
|
1346
1368
|
});
|
1347
1369
|
});
|
1348
|
-
frame = seq(
|
1370
|
+
frame = seq(definition.many(), flow).map(function(_arg) {
|
1349
1371
|
var defs, flow, loc;
|
1350
1372
|
defs = _arg[0], flow = _arg[1];
|
1351
1373
|
loc = spanLoc((defs[0] || flow).loc, flow.loc);
|
1352
1374
|
return AST.frame(loc, defs, flow);
|
1353
1375
|
});
|
1354
|
-
parenFrame = seq(
|
1376
|
+
parenFrame = seq(lparen, frame, rparen, lines).map(function(_arg) {
|
1355
1377
|
var fr, l, r, _;
|
1356
1378
|
l = _arg[0], fr = _arg[1], r = _arg[2], _ = _arg[3];
|
1357
1379
|
fr.loc = spanLoc(l, r);
|
@@ -1371,7 +1393,7 @@ parse = Gibbon.parse = (function() {
|
|
1371
1393
|
});
|
1372
1394
|
wildType = wildcard.result(TypeAST.wildcard());
|
1373
1395
|
listType = lazy(function() {
|
1374
|
-
return seq(
|
1396
|
+
return seq(lbrack, type, rbrack).map(function(_arg) {
|
1375
1397
|
var t, _, __;
|
1376
1398
|
_ = _arg[0], t = _arg[1], __ = _arg[2];
|
1377
1399
|
return TypeAST.list(t);
|
@@ -1391,12 +1413,12 @@ parse = Gibbon.parse = (function() {
|
|
1391
1413
|
return TypeAST.pair(first, second);
|
1392
1414
|
});
|
1393
1415
|
});
|
1394
|
-
arrowType = seq(
|
1416
|
+
arrowType = seq(type, arrow, type).map(function(_arg) {
|
1395
1417
|
var first, second, _;
|
1396
1418
|
first = _arg[0], _ = _arg[1], second = _arg[2];
|
1397
1419
|
return TypeAST.arrow(first, second);
|
1398
1420
|
});
|
1399
|
-
signature = seq(
|
1421
|
+
signature = seq(name, type.many(), tassign.then(arrowType)).map(function(_arg) {
|
1400
1422
|
var argTypes, ftype, name;
|
1401
1423
|
name = _arg[0], argTypes = _arg[1], ftype = _arg[2];
|
1402
1424
|
return TypeAST.func(ftype.from, argTypes, ftype.to);
|
@@ -1410,13 +1432,20 @@ parse = Gibbon.parse = (function() {
|
|
1410
1432
|
throw 'can only parse strings';
|
1411
1433
|
}
|
1412
1434
|
};
|
1435
|
+
handleResult = function(result) {
|
1436
|
+
if (result.status) {
|
1437
|
+
return result.value;
|
1438
|
+
} else {
|
1439
|
+
throw new Error(Parsimmon.formatError(result));
|
1440
|
+
}
|
1441
|
+
};
|
1413
1442
|
parse = function(str) {
|
1414
1443
|
assertString(str);
|
1415
|
-
return program.parse(str);
|
1444
|
+
return handleResult(program.parse(str));
|
1416
1445
|
};
|
1417
1446
|
parse.type = function(str) {
|
1418
1447
|
assertString(str);
|
1419
|
-
return fullSignature.parse(str);
|
1448
|
+
return handleResult(fullSignature.parse(str));
|
1420
1449
|
};
|
1421
1450
|
return parse;
|
1422
1451
|
})();
|
@@ -3490,36 +3519,157 @@ Gibbon.optimize = (function() {
|
|
3490
3519
|
});
|
3491
3520
|
};
|
3492
3521
|
insertBindings = (function() {
|
3493
|
-
var findLastCommon, genSubstitutions, makeCrumbs,
|
3522
|
+
var SubstTree, findLastCommon, genSubstitutions, insertSubstitutions, makeCrumbs, _ref10;
|
3523
|
+
SubstTree = (function(_super) {
|
3524
|
+
__extends(SubstTree, _super);
|
3525
|
+
|
3526
|
+
function SubstTree() {
|
3527
|
+
_ref10 = SubstTree.__super__.constructor.apply(this, arguments);
|
3528
|
+
return _ref10;
|
3529
|
+
}
|
3530
|
+
|
3531
|
+
SubstTree.variants({
|
3532
|
+
subst: ['bindings', 'expr']
|
3533
|
+
});
|
3534
|
+
|
3535
|
+
SubstTree.prototype.toCore = function() {
|
3536
|
+
return this.__toCore || (this.__toCore = this.expr.map(function(x) {
|
3537
|
+
return x.toCore();
|
3538
|
+
}));
|
3539
|
+
};
|
3540
|
+
|
3541
|
+
SubstTree.prototype.inspect = function() {
|
3542
|
+
var e;
|
3543
|
+
if (!this.bindings.length) {
|
3544
|
+
return this.expr.inspect();
|
3545
|
+
}
|
3546
|
+
return "(subst [" + (((function() {
|
3547
|
+
var _i, _len, _ref11, _results;
|
3548
|
+
_ref11 = this.bindings;
|
3549
|
+
_results = [];
|
3550
|
+
for (_i = 0, _len = _ref11.length; _i < _len; _i++) {
|
3551
|
+
e = _ref11[_i];
|
3552
|
+
_results.push(e.inspect());
|
3553
|
+
}
|
3554
|
+
return _results;
|
3555
|
+
}).call(this)).join(' ')) + "] " + (this.expr.inspect()) + ")";
|
3556
|
+
};
|
3557
|
+
|
3558
|
+
SubstTree.prototype.map = function(f) {
|
3559
|
+
var e;
|
3560
|
+
return SubstTree.subst((function() {
|
3561
|
+
var _i, _len, _ref11, _results;
|
3562
|
+
_ref11 = this.bindings;
|
3563
|
+
_results = [];
|
3564
|
+
for (_i = 0, _len = _ref11.length; _i < _len; _i++) {
|
3565
|
+
e = _ref11[_i];
|
3566
|
+
_results.push(e.map(f));
|
3567
|
+
}
|
3568
|
+
return _results;
|
3569
|
+
}).call(this), this.expr.map(f));
|
3570
|
+
};
|
3571
|
+
|
3572
|
+
SubstTree.prototype.substituteWith = function(names, bindableExprs) {
|
3573
|
+
var bindable, core, hash, i, _i, _len;
|
3574
|
+
core = this.toCore();
|
3575
|
+
hash = core.hash();
|
3576
|
+
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3577
|
+
bindable = bindableExprs[i];
|
3578
|
+
if (hash === bindable.toCore().hash()) {
|
3579
|
+
return SubstTree.unit(Core.variable(names[i]));
|
3580
|
+
}
|
3581
|
+
}
|
3582
|
+
return this.map(function(x) {
|
3583
|
+
return x.substituteWith(names, bindableExprs);
|
3584
|
+
});
|
3585
|
+
};
|
3586
|
+
|
3587
|
+
SubstTree.prototype.simplify = function() {
|
3588
|
+
var bindableExprs, expr;
|
3589
|
+
bindableExprs = this.bindings;
|
3590
|
+
expr = this.expr;
|
3591
|
+
return expr.cases({
|
3592
|
+
rescue: function() {
|
3593
|
+
return SubstTree.unit(this.map(function(x) {
|
3594
|
+
return insertSubstitutions(x.toCore());
|
3595
|
+
}));
|
3596
|
+
},
|
3597
|
+
squishList: function(list) {
|
3598
|
+
list = list.toCore();
|
3599
|
+
if (list._tag !== 'list') {
|
3600
|
+
throw 'invalid squish';
|
3601
|
+
}
|
3602
|
+
return SubstTree.unit(Core.squishList(SubstTree.unit(list.map(insertSubstitutions))));
|
3603
|
+
},
|
3604
|
+
other: function() {
|
3605
|
+
var bindable, i, names, out, substituted, _, _i, _len;
|
3606
|
+
substituted = expr.map(function(t) {
|
3607
|
+
return t.simplify();
|
3608
|
+
});
|
3609
|
+
names = (function() {
|
3610
|
+
var _i, _len, _results;
|
3611
|
+
_results = [];
|
3612
|
+
for (_i = 0, _len = bindableExprs.length; _i < _len; _i++) {
|
3613
|
+
_ = bindableExprs[_i];
|
3614
|
+
_results.push(nameGen('b'));
|
3615
|
+
}
|
3616
|
+
return _results;
|
3617
|
+
})();
|
3618
|
+
if (!bindableExprs.length) {
|
3619
|
+
return SubstTree.unit(substituted);
|
3620
|
+
}
|
3621
|
+
out = SubstTree.unit(substituted).substituteWith(names, bindableExprs);
|
3622
|
+
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3623
|
+
bindable = bindableExprs[i];
|
3624
|
+
out = SubstTree.unit(Core.bind(names[i], bindable, out));
|
3625
|
+
}
|
3626
|
+
|
3627
|
+
return out;
|
3628
|
+
}
|
3629
|
+
});
|
3630
|
+
};
|
3631
|
+
|
3632
|
+
SubstTree.unit = function(expr) {
|
3633
|
+
return SubstTree.subst([], expr);
|
3634
|
+
};
|
3635
|
+
|
3636
|
+
return SubstTree;
|
3637
|
+
|
3638
|
+
})(Variant);
|
3494
3639
|
makeCrumbs = function(trace) {
|
3495
3640
|
return trace.mapArray(function(e) {
|
3496
3641
|
return e.hash();
|
3497
3642
|
}).reverse();
|
3498
3643
|
};
|
3499
3644
|
genSubstitutions = function(expr) {
|
3500
|
-
var
|
3645
|
+
var occurrences, queue, recurse, substitutions;
|
3501
3646
|
occurrences = new ObjHash;
|
3502
3647
|
substitutions = new Hash;
|
3503
3648
|
queue = [[expr, List.empty()]];
|
3504
3649
|
while (queue.length) {
|
3505
|
-
|
3506
|
-
|
3507
|
-
|
3508
|
-
|
3509
|
-
|
3510
|
-
occurrences.get(expr).push(makeCrumbs(trace));
|
3511
|
-
} else {
|
3512
|
-
occurrences.set(expr, [makeCrumbs(trace)]);
|
3513
|
-
newTrace = trace.cons(expr);
|
3514
|
-
if ((_ref11 = expr._tag) === 'rescue' || _ref11 === 'squishList') {
|
3515
|
-
continue;
|
3650
|
+
(function(_arg) {
|
3651
|
+
var expr, newTrace, sub, trace, _i, _len, _ref11, _ref12, _results;
|
3652
|
+
expr = _arg[0], trace = _arg[1];
|
3653
|
+
if (expr.isSimple() || expr.alwaysFails()) {
|
3654
|
+
return;
|
3516
3655
|
}
|
3517
|
-
|
3518
|
-
|
3519
|
-
|
3520
|
-
|
3656
|
+
if (occurrences.has(expr)) {
|
3657
|
+
return occurrences.get(expr).push(makeCrumbs(trace));
|
3658
|
+
} else {
|
3659
|
+
occurrences.set(expr, [makeCrumbs(trace)]);
|
3660
|
+
newTrace = trace.cons(expr);
|
3661
|
+
if ((_ref11 = expr._tag) === 'rescue' || _ref11 === 'squishList') {
|
3662
|
+
return;
|
3663
|
+
}
|
3664
|
+
_ref12 = expr.subtrees();
|
3665
|
+
_results = [];
|
3666
|
+
for (_i = 0, _len = _ref12.length; _i < _len; _i++) {
|
3667
|
+
sub = _ref12[_i];
|
3668
|
+
_results.push(queue.push([sub, newTrace]));
|
3669
|
+
}
|
3670
|
+
return _results;
|
3521
3671
|
}
|
3522
|
-
}
|
3672
|
+
})(queue.shift());
|
3523
3673
|
}
|
3524
3674
|
occurrences.each(function(expr, crumbs) {
|
3525
3675
|
var insertionPoint;
|
@@ -3532,7 +3682,22 @@ Gibbon.optimize = (function() {
|
|
3532
3682
|
});
|
3533
3683
|
return substitutions.get(insertionPoint).push(expr);
|
3534
3684
|
});
|
3535
|
-
return
|
3685
|
+
return (recurse = function(expr) {
|
3686
|
+
var bindableExprs, e;
|
3687
|
+
bindableExprs = substitutions.get(expr.hash());
|
3688
|
+
if (!bindableExprs) {
|
3689
|
+
return SubstTree.unit(expr.map(recurse));
|
3690
|
+
}
|
3691
|
+
return SubstTree.subst((function() {
|
3692
|
+
var _i, _len, _results;
|
3693
|
+
_results = [];
|
3694
|
+
for (_i = 0, _len = bindableExprs.length; _i < _len; _i++) {
|
3695
|
+
e = bindableExprs[_i];
|
3696
|
+
_results.push(recurse(e));
|
3697
|
+
}
|
3698
|
+
return _results;
|
3699
|
+
})(), expr.map(recurse));
|
3700
|
+
})(expr);
|
3536
3701
|
};
|
3537
3702
|
findLastCommon = function(_arg) {
|
3538
3703
|
var i, last, refCrumb, reference, rest, testCrumbs, _i, _j, _len, _len1;
|
@@ -3550,58 +3715,11 @@ Gibbon.optimize = (function() {
|
|
3550
3715
|
}
|
3551
3716
|
return refCrumb;
|
3552
3717
|
};
|
3553
|
-
|
3554
|
-
|
3555
|
-
return (recurse = function(expr) {
|
3556
|
-
var bindable, bindableExprs, i, names, out, recurseInner, _, _i, _len;
|
3557
|
-
bindableExprs = substitutions.get(expr.hash());
|
3558
|
-
if (!bindableExprs) {
|
3559
|
-
return expr.map(recurse);
|
3560
|
-
}
|
3561
|
-
names = (function() {
|
3562
|
-
var _i, _len, _results;
|
3563
|
-
_results = [];
|
3564
|
-
for (_i = 0, _len = bindableExprs.length; _i < _len; _i++) {
|
3565
|
-
_ = bindableExprs[_i];
|
3566
|
-
_results.push(nameGen('b'));
|
3567
|
-
}
|
3568
|
-
return _results;
|
3569
|
-
})();
|
3570
|
-
|
3571
|
-
out = (recurseInner = function(boundExpr) {
|
3572
|
-
var bindable, hash, i, _i, _len;
|
3573
|
-
hash = boundExpr.hash();
|
3574
|
-
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3575
|
-
bindable = bindableExprs[i];
|
3576
|
-
if (hash === bindable.hash()) {
|
3577
|
-
return Core.variable(names[i]);
|
3578
|
-
}
|
3579
|
-
}
|
3580
|
-
return boundExpr.cases({
|
3581
|
-
rescue: function(expr, default_) {
|
3582
|
-
return Core.rescue(insertBindings(expr), insertBindings(default_));
|
3583
|
-
},
|
3584
|
-
squishList: function(list) {
|
3585
|
-
if (list._tag !== 'list') {
|
3586
|
-
throw 'invalid squish';
|
3587
|
-
}
|
3588
|
-
return Core.squishList(list.map(insertBindings));
|
3589
|
-
},
|
3590
|
-
other: function() {
|
3591
|
-
return this.map(recurseInner);
|
3592
|
-
}
|
3593
|
-
});
|
3594
|
-
})(expr);
|
3595
|
-
for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
|
3596
|
-
bindable = bindableExprs[i];
|
3597
|
-
out = Core.bind(names[i], bindable, out);
|
3598
|
-
}
|
3599
|
-
|
3600
|
-
return out.map(recurse);
|
3601
|
-
})(expr);
|
3718
|
+
insertSubstitutions = function(expr) {
|
3719
|
+
return genSubstitutions(expr).simplify();
|
3602
3720
|
};
|
3603
3721
|
return function(expr) {
|
3604
|
-
return
|
3722
|
+
return insertSubstitutions(expr).toCore();
|
3605
3723
|
};
|
3606
3724
|
})();
|
3607
3725
|
return function(expr) {
|
@@ -5026,7 +5144,7 @@ Gibbon.reduce = (function() {
|
|
5026
5144
|
})();
|
5027
5145
|
|
5028
5146
|
Gibbon.JS = JS = (function(_super) {
|
5029
|
-
var inspectString,
|
5147
|
+
var inspectString, validIdent;
|
5030
5148
|
|
5031
5149
|
__extends(JS, _super);
|
5032
5150
|
|
@@ -5055,15 +5173,6 @@ Gibbon.JS = JS = (function(_super) {
|
|
5055
5173
|
varDecl: ['name']
|
5056
5174
|
});
|
5057
5175
|
|
5058
|
-
oldBlock = JS.block;
|
5059
|
-
|
5060
|
-
JS.block = function(s) {
|
5061
|
-
if (!isArray(s)) {
|
5062
|
-
throw 'lol';
|
5063
|
-
}
|
5064
|
-
return oldBlock(s);
|
5065
|
-
};
|
5066
|
-
|
5067
5176
|
JS.prototype.toFunction = function() {
|
5068
5177
|
return this.cases({
|
5069
5178
|
func: function(name, args, block) {
|
data/vendor/gibbon/package.json
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goodguide-gibbon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay Adkisson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Run and analyze gibbon code from ruby or a browser (via a ruby app).
|
14
14
|
email:
|
@@ -45,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
45
|
version: '0'
|
46
46
|
requirements: []
|
47
47
|
rubyforge_project: goodguide-gibbon
|
48
|
-
rubygems_version: 2.2.
|
48
|
+
rubygems_version: 2.2.2
|
49
49
|
signing_key:
|
50
50
|
specification_version: 4
|
51
51
|
summary: Ruby bindings for the gibbon data language
|