dust-rails 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  //
2
- // Dust - Asynchronous Templating v0.3.0
2
+ // Dust - Asynchronous Templating v1.0.0
3
3
  // http://akdubya.github.com/dustjs
4
4
  //
5
5
  // Copyright (c) 2010, Aleksander Williams
@@ -8,6 +8,12 @@
8
8
 
9
9
  var dust = {};
10
10
 
11
+ function getGlobal(){
12
+ return (function(){
13
+ return this.dust;
14
+ }).call(null);
15
+ }
16
+
11
17
  (function(dust) {
12
18
 
13
19
  dust.cache = {};
@@ -75,9 +81,15 @@ if (Array.isArray) {
75
81
  };
76
82
  }
77
83
 
78
- dust.nextTick = function(callback) {
79
- setTimeout(callback, 0);
80
- }
84
+ dust.nextTick = (function() {
85
+ if (typeof process !== "undefined") {
86
+ return process.nextTick;
87
+ } else {
88
+ return function(callback) {
89
+ setTimeout(callback,0);
90
+ }
91
+ }
92
+ } )();
81
93
 
82
94
  dust.isEmpty = function(value) {
83
95
  if (dust.isArray(value) && !value.length) return true;
@@ -106,8 +118,10 @@ dust.filters = {
106
118
  h: function(value) { return dust.escapeHtml(value); },
107
119
  j: function(value) { return dust.escapeJs(value); },
108
120
  u: encodeURI,
109
- uc: encodeURIComponent
110
- }
121
+ uc: encodeURIComponent,
122
+ js: function(value) { if (!JSON) { return value; } return JSON.stringify(value); },
123
+ jp: function(value) { if (!JSON) { return value; } return JSON.parse(value); }
124
+ };
111
125
 
112
126
  function Context(stack, global, blocks) {
113
127
  this.stack = stack;
@@ -117,14 +131,14 @@ function Context(stack, global, blocks) {
117
131
 
118
132
  dust.makeBase = function(global) {
119
133
  return new Context(new Stack(), global);
120
- }
134
+ };
121
135
 
122
136
  Context.wrap = function(context) {
123
137
  if (context instanceof Context) {
124
138
  return context;
125
139
  }
126
140
  return new Context(new Stack(context));
127
- }
141
+ };
128
142
 
129
143
  Context.prototype.get = function(key) {
130
144
  var ctx = this.stack, value;
@@ -146,7 +160,6 @@ Context.prototype.getPath = function(cur, down) {
146
160
  len = down.length;
147
161
 
148
162
  if (cur && len === 0) return ctx.head;
149
- if (!ctx.isObject) return undefined;
150
163
  ctx = ctx.head;
151
164
  var i = 0;
152
165
  while(ctx && i < len) {
@@ -168,7 +181,12 @@ Context.prototype.current = function() {
168
181
  return this.stack.head;
169
182
  };
170
183
 
171
- Context.prototype.getBlock = function(key) {
184
+ Context.prototype.getBlock = function(key, chk, ctx) {
185
+ if (typeof key === "function") {
186
+ key = key(chk, ctx).data;
187
+ chk.data = "";
188
+ }
189
+
172
190
  var blocks = this.blocks;
173
191
 
174
192
  if (!blocks) return;
@@ -177,7 +195,7 @@ Context.prototype.getBlock = function(key) {
177
195
  fn = blocks[len][key];
178
196
  if (fn) return fn;
179
197
  }
180
- }
198
+ };
181
199
 
182
200
  Context.prototype.shiftBlocks = function(locals) {
183
201
  var blocks = this.blocks;
@@ -191,7 +209,7 @@ Context.prototype.shiftBlocks = function(locals) {
191
209
  return new Context(this.stack, this.global, newBlocks);
192
210
  }
193
211
  return this;
194
- }
212
+ };
195
213
 
196
214
  function Stack(head, tail, idx, len) {
197
215
  this.tail = tail;
@@ -224,7 +242,7 @@ Stub.prototype.flush = function() {
224
242
  this.head = chunk;
225
243
  }
226
244
  this.callback(null, this.out);
227
- }
245
+ };
228
246
 
229
247
  function Stream() {
230
248
  this.head = new Chunk(this);
@@ -247,23 +265,46 @@ Stream.prototype.flush = function() {
247
265
  this.head = chunk;
248
266
  }
249
267
  this.emit('end');
250
- }
268
+ };
251
269
 
252
270
  Stream.prototype.emit = function(type, data) {
253
- var events = this.events;
254
-
255
- if (events && events[type]) {
256
- events[type](data);
271
+ if (!this.events) return false;
272
+ var handler = this.events[type];
273
+ if (!handler) return false;
274
+ if (typeof handler == 'function') {
275
+ handler(data);
276
+ } else {
277
+ var listeners = handler.slice(0);
278
+ for (var i = 0, l = listeners.length; i < l; i++) {
279
+ listeners[i](data);
280
+ }
257
281
  }
258
- }
282
+ };
259
283
 
260
284
  Stream.prototype.on = function(type, callback) {
261
285
  if (!this.events) {
262
286
  this.events = {};
263
287
  }
264
- this.events[type] = callback;
288
+ if (!this.events[type]) {
289
+ this.events[type] = callback;
290
+ } else if(typeof this.events[type] === 'function') {
291
+ this.events[type] = [this.events[type], callback];
292
+ } else {
293
+ this.events[type].push(callback);
294
+ }
265
295
  return this;
266
- }
296
+ };
297
+
298
+ Stream.prototype.pipe = function(stream) {
299
+ this.on("data", function(data) {
300
+ stream.write(data, "utf8");
301
+ }).on("end", function() {
302
+ stream.end();
303
+ }).on("error", function(err) {
304
+ stream.error(err);
305
+ });
306
+ return this;
307
+ };
267
308
 
268
309
  function Chunk(root, next, taps) {
269
310
  this.root = root;
@@ -281,7 +322,7 @@ Chunk.prototype.write = function(data) {
281
322
  }
282
323
  this.data += data;
283
324
  return this;
284
- }
325
+ };
285
326
 
286
327
  Chunk.prototype.end = function(data) {
287
328
  if (data) {
@@ -290,7 +331,7 @@ Chunk.prototype.end = function(data) {
290
331
  this.flushable = true;
291
332
  this.root.flush();
292
333
  return this;
293
- }
334
+ };
294
335
 
295
336
  Chunk.prototype.map = function(callback) {
296
337
  var cursor = new Chunk(this.root, this.next, this.taps),
@@ -300,7 +341,7 @@ Chunk.prototype.map = function(callback) {
300
341
  this.flushable = true;
301
342
  callback(branch);
302
343
  return cursor;
303
- }
344
+ };
304
345
 
305
346
  Chunk.prototype.tap = function(tap) {
306
347
  var taps = this.taps;
@@ -311,20 +352,22 @@ Chunk.prototype.tap = function(tap) {
311
352
  this.taps = new Tap(tap);
312
353
  }
313
354
  return this;
314
- }
355
+ };
315
356
 
316
357
  Chunk.prototype.untap = function() {
317
358
  this.taps = this.taps.tail;
318
359
  return this;
319
- }
360
+ };
320
361
 
321
362
  Chunk.prototype.render = function(body, context) {
322
363
  return body(this, context);
323
- }
364
+ };
324
365
 
325
366
  Chunk.prototype.reference = function(elem, context, auto, filters) {
326
367
  if (typeof elem === "function") {
327
- elem = elem(this, context, null, {auto: auto, filters: filters});
368
+ elem.isReference = true;
369
+ // Changed the function calling to use apply with the current context to make sure that "this" is wat we expect it to be inside the function
370
+ elem = elem.apply(context.current(), [this, context, null, {auto: auto, filters: filters}]);
328
371
  if (elem instanceof Chunk) {
329
372
  return elem;
330
373
  }
@@ -338,7 +381,7 @@ Chunk.prototype.reference = function(elem, context, auto, filters) {
338
381
 
339
382
  Chunk.prototype.section = function(elem, context, bodies, params) {
340
383
  if (typeof elem === "function") {
341
- elem = elem(this, context, bodies, params);
384
+ elem = elem.apply(context.current(), [this, context, bodies, params]);
342
385
  if (elem instanceof Chunk) {
343
386
  return elem;
344
387
  }
@@ -354,15 +397,26 @@ Chunk.prototype.section = function(elem, context, bodies, params) {
354
397
  if (dust.isArray(elem)) {
355
398
  if (body) {
356
399
  var len = elem.length, chunk = this;
400
+ context.stack.head['$len'] = len;
357
401
  for (var i=0; i<len; i++) {
402
+ context.stack.head['$idx'] = i;
358
403
  chunk = body(chunk, context.push(elem[i], i, len));
359
404
  }
405
+ context.stack.head['$idx'] = undefined;
406
+ context.stack.head['$len'] = undefined;
360
407
  return chunk;
361
408
  }
362
409
  } else if (elem === true) {
363
410
  if (body) return body(this, context);
364
411
  } else if (elem || elem === 0) {
365
- if (body) return body(this, context.push(elem));
412
+ if (body) {
413
+ context.stack.head['$idx'] = 0;
414
+ context.stack.head['$len'] = 1;
415
+ chunk = body(this, context.push(elem));
416
+ context.stack.head['$idx'] = undefined;
417
+ context.stack.head['$len'] = undefined;
418
+ return chunk;
419
+ }
366
420
  } else if (skip) {
367
421
  return skip(this, context);
368
422
  }
@@ -379,7 +433,7 @@ Chunk.prototype.exists = function(elem, context, bodies) {
379
433
  return skip(this, context);
380
434
  }
381
435
  return this;
382
- }
436
+ };
383
437
 
384
438
  Chunk.prototype.notexists = function(elem, context, bodies) {
385
439
  var body = bodies.block,
@@ -391,7 +445,7 @@ Chunk.prototype.notexists = function(elem, context, bodies) {
391
445
  return skip(this, context);
392
446
  }
393
447
  return this;
394
- }
448
+ };
395
449
 
396
450
  Chunk.prototype.block = function(elem, context, bodies) {
397
451
  var body = bodies.block;
@@ -406,7 +460,17 @@ Chunk.prototype.block = function(elem, context, bodies) {
406
460
  return this;
407
461
  };
408
462
 
409
- Chunk.prototype.partial = function(elem, context) {
463
+ Chunk.prototype.partial = function(elem, context, params) {
464
+ var ctx = context.stack, tempHead = ctx.head;
465
+ if (params){
466
+ //put the params context second to match what section does. {.} matches the current context without parameters
467
+ //remove head
468
+ context = context.rebase(ctx.tail);
469
+ //put params on
470
+ context = context.push(params);
471
+ //reattach the head
472
+ context = context.push(tempHead);
473
+ }
410
474
  if (typeof elem === "function") {
411
475
  return this.capture(elem, context, function(name, chunk) {
412
476
  dust.load(name, chunk, context).end();
@@ -438,19 +502,6 @@ Chunk.prototype.setError = function(err) {
438
502
  return this;
439
503
  };
440
504
 
441
- dust.helpers = {
442
- sep: function(chunk, context, bodies) {
443
- if (context.stack.index === context.stack.of - 1) {
444
- return chunk;
445
- }
446
- return bodies.block(chunk, context);
447
- },
448
-
449
- idx: function(chunk, context, bodies) {
450
- return bodies.block(chunk, context.push(context.stack.index));
451
- }
452
- }
453
-
454
505
  function Tap(head, tail) {
455
506
  this.head = head;
456
507
  this.tail = tail;
@@ -470,18 +521,19 @@ Tap.prototype.go = function(value) {
470
521
  return value;
471
522
  };
472
523
 
473
- var HCHARS = new RegExp(/[&<>\"]/),
524
+ var HCHARS = new RegExp(/[&<>\"\']/),
474
525
  AMP = /&/g,
475
526
  LT = /</g,
476
527
  GT = />/g,
477
- QUOT = /\"/g;
528
+ QUOT = /\"/g,
529
+ SQUOT = /\'/g;
478
530
 
479
531
  dust.escapeHtml = function(s) {
480
532
  if (typeof s === "string") {
481
533
  if (!HCHARS.test(s)) {
482
534
  return s;
483
535
  }
484
- return s.replace(AMP,'&amp;').replace(LT,'&lt;').replace(GT,'&gt;').replace(QUOT,'&quot;');
536
+ return s.replace(AMP,'&amp;').replace(LT,'&lt;').replace(GT,'&gt;').replace(QUOT,'&quot;').replace(SQUOT, '&#39;');
485
537
  }
486
538
  return s;
487
539
  };
@@ -515,16 +567,216 @@ dust.escapeJs = function(s) {
515
567
  })(dust);
516
568
 
517
569
  if (typeof exports !== "undefined") {
570
+ //TODO: Remove the helpers from dust core in the next release.
571
+ dust.helpers = require("./dust-helpers").helpers;
518
572
  if (typeof process !== "undefined") {
519
573
  require('./server')(dust);
520
574
  }
521
575
  module.exports = dust;
522
576
  }
577
+ (function(dust){
578
+
579
+ /* make a safe version of console if it is not available
580
+ * currently supporting:
581
+ * _console.log
582
+ * */
583
+ var _console = (typeof console !== 'undefined')? console: {
584
+ log: function(){
585
+ /* a noop*/
586
+ }
587
+ };
588
+
589
+ function isSelect(context) {
590
+ var value = context.current();
591
+ return typeof value === "object" && value.isSelect === true;
592
+ }
593
+
594
+ function filter(chunk, context, bodies, params, filter) {
595
+ var params = params || {},
596
+ actual,
597
+ expected;
598
+ if (params.key) {
599
+ actual = helpers.tap(params.key, chunk, context);
600
+ } else if (isSelect(context)) {
601
+ actual = context.current().selectKey;
602
+ if (context.current().isResolved) {
603
+ filter = function() { return false; };
604
+ }
605
+ } else {
606
+ throw "No key specified for filter and no key found in context from select statement";
607
+ }
608
+ expected = helpers.tap(params.value, chunk, context);
609
+ if (filter(expected, coerce(actual, params.type, context))) {
610
+ if (isSelect(context)) {
611
+ context.current().isResolved = true;
612
+ }
613
+ return chunk.render(bodies.block, context);
614
+ } else if (bodies['else']) {
615
+ return chunk.render(bodies['else'], context);
616
+ }
617
+
618
+ return chunk.write('');
619
+ }
620
+
621
+ function coerce (value, type, context) {
622
+ if (value) {
623
+ switch (type || typeof(value)) {
624
+ case 'number': return +value;
625
+ case 'string': return String(value);
626
+ case 'boolean': return Boolean(value);
627
+ case 'date': return new Date(value);
628
+ case 'context': return context.get(value);
629
+ }
630
+ }
631
+
632
+ return value;
633
+ }
634
+
635
+ var helpers = {
636
+
637
+ sep: function(chunk, context, bodies) {
638
+ if (context.stack.index === context.stack.of - 1) {
639
+ return chunk;
640
+ }
641
+ return bodies.block(chunk, context);
642
+ },
643
+
644
+ idx: function(chunk, context, bodies) {
645
+ return bodies.block(chunk, context.push(context.stack.index));
646
+ },
647
+
648
+ contextDump: function(chunk, context, bodies) {
649
+ _console.log(JSON.stringify(context.stack));
650
+ return chunk;
651
+ },
652
+
653
+ // Utility helping to resolve dust references in the given chunk
654
+ tap: function( input, chunk, context ){
655
+ // return given input if there is no dust reference to resolve
656
+ var output = input;
657
+ // dust compiles a string to function, if there are references
658
+ if( typeof input === "function"){
659
+ if( ( typeof input.isReference !== "undefined" ) && ( input.isReference === true ) ){ // just a plain function, not a dust `body` function
660
+ output = input();
661
+ } else {
662
+ output = '';
663
+ chunk.tap(function(data){
664
+ output += data;
665
+ return '';
666
+ }).render(input, context).untap();
667
+ if( output === '' ){
668
+ output = false;
669
+ }
670
+ }
671
+ }
672
+ return output;
673
+ },
674
+
675
+ /**
676
+ if helper
677
+ @param cond, either a string literal value or a dust reference
678
+ a string literal value, is enclosed in double quotes, e.g. cond="2>3"
679
+ a dust reference is also enclosed in double quotes, e.g. cond="'{val}'' > 3"
680
+ cond argument should evaluate to a valid javascript expression
681
+ **/
682
+
683
+ "if": function( chunk, context, bodies, params ){
684
+ if( params && params.cond ){
685
+ var cond = params.cond;
686
+ cond = this.tap(cond, chunk, context);
687
+ // eval expressions with given dust references
688
+ if( eval( cond ) ){
689
+ return chunk.render( bodies.block, context );
690
+ }
691
+ if( bodies['else'] ){
692
+ return chunk.render( bodies['else'], context );
693
+ }
694
+ }
695
+ // no condition
696
+ else {
697
+ _console.log( "No condition given in the if helper!" );
698
+ }
699
+ return chunk;
700
+ },
701
+
702
+ /**
703
+ select/eq/lt/lte/gt/gte/default helper
704
+ @param key, either a string literal value or a dust reference
705
+ a string literal value, is enclosed in double quotes, e.g. key="foo"
706
+ a dust reference may or may not be enclosed in double quotes, e.g. key="{val}" and key=val are both valid
707
+ @param type (optiona), supported types are number, boolean, string, date, context, defaults to string
708
+ **/
709
+ select: function(chunk, context, bodies, params) {
710
+ if( params && params.key){
711
+ // returns given input as output, if the input is not a dust reference, else does a context lookup
712
+ var key = this.tap(params.key, chunk, context);
713
+ return chunk.render(bodies.block, context.push({ isSelect: true, isResolved: false, selectKey: key }));
714
+ }
715
+ // no key
716
+ else {
717
+ _console.log( "No key given in the select helper!" );
718
+ }
719
+ return chunk;
720
+ },
721
+
722
+ eq: function(chunk, context, bodies, params) {
723
+ return filter(chunk, context, bodies, params, function(expected, actual) { return actual === expected; });
724
+ },
725
+
726
+ lt: function(chunk, context, bodies, params) {
727
+ return filter(chunk, context, bodies, params, function(expected, actual) { return actual < expected; });
728
+ },
729
+
730
+ lte: function(chunk, context, bodies, params) {
731
+ return filter(chunk, context, bodies, params, function(expected, actual) { return actual <= expected; });
732
+ },
733
+
734
+ gt: function(chunk, context, bodies, params) {
735
+ return filter(chunk, context, bodies, params, function(expected, actual) { return actual > expected; });
736
+ },
737
+
738
+ gte: function(chunk, context, bodies, params) {
739
+ return filter(chunk, context, bodies, params, function(expected, actual) { return actual >= expected; });
740
+ },
741
+
742
+ "default": function(chunk, context, bodies, params) {
743
+ return filter(chunk, context, bodies, params, function(expected, actual) { return true; });
744
+ },
745
+ size: function( chunk, context, bodies, params ) {
746
+ var subject = params.subject;
747
+ var value = 0;
748
+ if (!subject) { //undefined, "", 0
749
+ value = 0;
750
+ } else if(dust.isArray(subject)) { //array
751
+ value = subject.length;
752
+ } else if (!isNaN(subject)) { //numeric values
753
+ value = subject;
754
+ } else if (Object(subject) === subject) { //object test
755
+ var nr = 0;
756
+ for(var k in subject) if(Object.hasOwnProperty.call(subject,k)) nr++;
757
+ value = nr;
758
+ } else {
759
+ value = (subject + '').length; //any other value (strings etc.)
760
+ }
761
+ return chunk.write(value);
762
+ }
763
+ };
764
+
765
+ dust.helpers = helpers;
766
+
767
+ })(typeof exports !== 'undefined' ? exports : getGlobal());
523
768
  (function(dust) {
524
769
 
525
770
  dust.compile = function(source, name) {
526
- var ast = filterAST(dust.parse(source));
527
- return compile(ast, name);
771
+ try {
772
+ var ast = filterAST(dust.parse(source));
773
+ return compile(ast, name);
774
+ }
775
+ catch(err)
776
+ {
777
+ if(!err.line || !err.column) throw err;
778
+ throw new SyntaxError(err.message + " At line : " + err.line + ", column : " + err.column);
779
+ }
528
780
  };
529
781
 
530
782
  function filterAST(ast) {
@@ -639,7 +891,7 @@ function compileBlocks(context) {
639
891
  blocks = context.blocks;
640
892
 
641
893
  for (var name in blocks) {
642
- out.push(name + ":" + blocks[name]);
894
+ out.push("'" + name + "':" + blocks[name]);
643
895
  }
644
896
  if (out.length) {
645
897
  context.blocks = "ctx=ctx.shiftBlocks(blocks);";
@@ -718,12 +970,20 @@ dust.nodes = {
718
970
  },
719
971
 
720
972
  "+": function(context, node) {
721
- return ".block(ctx.getBlock("
973
+ if(typeof(node[1].text) === "undefined" && typeof(node[4]) === "undefined"){
974
+ return ".block(ctx.getBlock("
975
+ + dust.compileNode(context, node[1])
976
+ + ",chk, ctx)," + dust.compileNode(context, node[2]) + ", {},"
977
+ + dust.compileNode(context, node[3])
978
+ + ")";
979
+ }else {
980
+ return ".block(ctx.getBlock("
722
981
  + escape(node[1].text)
723
982
  + ")," + dust.compileNode(context, node[2]) + ","
724
983
  + dust.compileNode(context, node[4]) + ","
725
984
  + dust.compileNode(context, node[3])
726
985
  + ")";
986
+ }
727
987
  },
728
988
 
729
989
  "@": function(context, node) {
@@ -762,7 +1022,8 @@ dust.nodes = {
762
1022
  partial: function(context, node) {
763
1023
  return ".partial("
764
1024
  + dust.compileNode(context, node[1])
765
- + "," + dust.compileNode(context, node[2]) + ")";
1025
+ + "," + dust.compileNode(context, node[2])
1026
+ + "," + dust.compileNode(context, node[3]) + ")";
766
1027
  },
767
1028
 
768
1029
  context: function(context, node) {
@@ -838,11 +1099,38 @@ var escape = (typeof JSON === "undefined")
838
1099
  ? function(str) { return "\"" + dust.escapeJs(str) + "\"" }
839
1100
  : JSON.stringify;
840
1101
 
841
- })(typeof exports !== 'undefined' ? exports : window.dust);
1102
+ })(typeof exports !== 'undefined' ? exports : getGlobal());
842
1103
  (function(dust){
843
1104
 
844
1105
  var parser = (function(){
845
- /* Generated by PEG.js (http://pegjs.majda.cz/). */
1106
+ /*
1107
+ * Generated by PEG.js 0.7.0.
1108
+ *
1109
+ * http://pegjs.majda.cz/
1110
+ */
1111
+
1112
+ function quote(s) {
1113
+ /*
1114
+ * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
1115
+ * string literal except for the closing quote character, backslash,
1116
+ * carriage return, line separator, paragraph separator, and line feed.
1117
+ * Any character may appear in the form of an escape sequence.
1118
+ *
1119
+ * For portability, we also escape escape all control and non-ASCII
1120
+ * characters. Note that "\0" and "\v" escape sequences are not used
1121
+ * because JSHint does not like the first and IE the second.
1122
+ */
1123
+ return '"' + s
1124
+ .replace(/\\/g, '\\\\') // backslash
1125
+ .replace(/"/g, '\\"') // closing quote character
1126
+ .replace(/\x08/g, '\\b') // backspace
1127
+ .replace(/\t/g, '\\t') // horizontal tab
1128
+ .replace(/\n/g, '\\n') // line feed
1129
+ .replace(/\f/g, '\\f') // form feed
1130
+ .replace(/\r/g, '\\r') // carriage return
1131
+ .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape)
1132
+ + '"';
1133
+ }
846
1134
 
847
1135
  var result = {
848
1136
  /*
@@ -851,12 +1139,53 @@ var parser = (function(){
851
1139
  * which the parser was generated (see |PEG.buildParser|). If the parsing is
852
1140
  * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
853
1141
  */
854
- parse: function(input) {
855
- var pos = 0;
856
- var reportMatchFailures = true;
857
- var rightmostMatchFailuresPos = 0;
858
- var rightmostMatchFailuresExpected = [];
859
- var cache = {};
1142
+ parse: function(input, startRule) {
1143
+ var parseFunctions = {
1144
+ "body": parse_body,
1145
+ "part": parse_part,
1146
+ "section": parse_section,
1147
+ "sec_tag_start": parse_sec_tag_start,
1148
+ "end_tag": parse_end_tag,
1149
+ "context": parse_context,
1150
+ "params": parse_params,
1151
+ "bodies": parse_bodies,
1152
+ "reference": parse_reference,
1153
+ "partial": parse_partial,
1154
+ "filters": parse_filters,
1155
+ "special": parse_special,
1156
+ "identifier": parse_identifier,
1157
+ "number": parse_number,
1158
+ "frac": parse_frac,
1159
+ "integer": parse_integer,
1160
+ "path": parse_path,
1161
+ "key": parse_key,
1162
+ "array": parse_array,
1163
+ "array_part": parse_array_part,
1164
+ "inline": parse_inline,
1165
+ "inline_part": parse_inline_part,
1166
+ "buffer": parse_buffer,
1167
+ "literal": parse_literal,
1168
+ "esc": parse_esc,
1169
+ "comment": parse_comment,
1170
+ "tag": parse_tag,
1171
+ "ld": parse_ld,
1172
+ "rd": parse_rd,
1173
+ "eol": parse_eol,
1174
+ "ws": parse_ws
1175
+ };
1176
+
1177
+ if (startRule !== undefined) {
1178
+ if (parseFunctions[startRule] === undefined) {
1179
+ throw new Error("Invalid rule name: " + quote(startRule) + ".");
1180
+ }
1181
+ } else {
1182
+ startRule = "body";
1183
+ }
1184
+
1185
+ var pos = { offset: 0, line: 1, column: 1, seenCR: false };
1186
+ var reportFailures = 0;
1187
+ var rightmostFailuresPos = { offset: 0, line: 1, column: 1, seenCR: false };
1188
+ var rightmostFailuresExpected = [];
860
1189
 
861
1190
  function padLeft(input, padding, length) {
862
1191
  var result = input;
@@ -871,2284 +1200,2398 @@ var parser = (function(){
871
1200
 
872
1201
  function escape(ch) {
873
1202
  var charCode = ch.charCodeAt(0);
1203
+ var escapeChar;
1204
+ var length;
874
1205
 
875
- if (charCode < 0xFF) {
876
- var escapeChar = 'x';
877
- var length = 2;
1206
+ if (charCode <= 0xFF) {
1207
+ escapeChar = 'x';
1208
+ length = 2;
878
1209
  } else {
879
- var escapeChar = 'u';
880
- var length = 4;
1210
+ escapeChar = 'u';
1211
+ length = 4;
881
1212
  }
882
1213
 
883
1214
  return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
884
1215
  }
885
1216
 
886
- function quote(s) {
887
- /*
888
- * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
889
- * string literal except for the closing quote character, backslash,
890
- * carriage return, line separator, paragraph separator, and line feed.
891
- * Any character may appear in the form of an escape sequence.
892
- */
893
- return '"' + s
894
- .replace(/\\/g, '\\\\') // backslash
895
- .replace(/"/g, '\\"') // closing quote character
896
- .replace(/\r/g, '\\r') // carriage return
897
- .replace(/\n/g, '\\n') // line feed
898
- .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters
899
- + '"';
1217
+ function clone(object) {
1218
+ var result = {};
1219
+ for (var key in object) {
1220
+ result[key] = object[key];
1221
+ }
1222
+ return result;
1223
+ }
1224
+
1225
+ function advance(pos, n) {
1226
+ var endOffset = pos.offset + n;
1227
+
1228
+ for (var offset = pos.offset; offset < endOffset; offset++) {
1229
+ var ch = input.charAt(offset);
1230
+ if (ch === "\n") {
1231
+ if (!pos.seenCR) { pos.line++; }
1232
+ pos.column = 1;
1233
+ pos.seenCR = false;
1234
+ } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
1235
+ pos.line++;
1236
+ pos.column = 1;
1237
+ pos.seenCR = true;
1238
+ } else {
1239
+ pos.column++;
1240
+ pos.seenCR = false;
1241
+ }
1242
+ }
1243
+
1244
+ pos.offset += n;
900
1245
  }
901
1246
 
902
1247
  function matchFailed(failure) {
903
- if (pos < rightmostMatchFailuresPos) {
1248
+ if (pos.offset < rightmostFailuresPos.offset) {
904
1249
  return;
905
1250
  }
906
1251
 
907
- if (pos > rightmostMatchFailuresPos) {
908
- rightmostMatchFailuresPos = pos;
909
- rightmostMatchFailuresExpected = [];
1252
+ if (pos.offset > rightmostFailuresPos.offset) {
1253
+ rightmostFailuresPos = clone(pos);
1254
+ rightmostFailuresExpected = [];
910
1255
  }
911
1256
 
912
- rightmostMatchFailuresExpected.push(failure);
1257
+ rightmostFailuresExpected.push(failure);
913
1258
  }
914
1259
 
915
1260
  function parse_body() {
916
- var cacheKey = "body" + '@' + pos;
917
- var cachedResult = cache[cacheKey];
918
- if (cachedResult) {
919
- pos = cachedResult.nextPos;
920
- return cachedResult.result;
921
- }
922
-
923
-
924
- var result1 = [];
925
- var result2 = parse_part();
926
- while (result2 !== null) {
927
- result1.push(result2);
928
- var result2 = parse_part();
929
- }
930
- var result0 = result1 !== null
931
- ? (function(p) { return ["body"].concat(p) })(result1)
932
- : null;
1261
+ var result0, result1;
1262
+ var pos0;
933
1263
 
934
-
935
-
936
- cache[cacheKey] = {
937
- nextPos: pos,
938
- result: result0
939
- };
1264
+ pos0 = clone(pos);
1265
+ result0 = [];
1266
+ result1 = parse_part();
1267
+ while (result1 !== null) {
1268
+ result0.push(result1);
1269
+ result1 = parse_part();
1270
+ }
1271
+ if (result0 !== null) {
1272
+ result0 = (function(offset, line, column, p) { return ["body"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0);
1273
+ }
1274
+ if (result0 === null) {
1275
+ pos = clone(pos0);
1276
+ }
940
1277
  return result0;
941
1278
  }
942
1279
 
943
1280
  function parse_part() {
944
- var cacheKey = "part" + '@' + pos;
945
- var cachedResult = cache[cacheKey];
946
- if (cachedResult) {
947
- pos = cachedResult.nextPos;
948
- return cachedResult.result;
949
- }
950
-
951
-
952
- var result6 = parse_comment();
953
- if (result6 !== null) {
954
- var result0 = result6;
955
- } else {
956
- var result5 = parse_section();
957
- if (result5 !== null) {
958
- var result0 = result5;
959
- } else {
960
- var result4 = parse_partial();
961
- if (result4 !== null) {
962
- var result0 = result4;
963
- } else {
964
- var result3 = parse_special();
965
- if (result3 !== null) {
966
- var result0 = result3;
967
- } else {
968
- var result2 = parse_reference();
969
- if (result2 !== null) {
970
- var result0 = result2;
971
- } else {
972
- var result1 = parse_buffer();
973
- if (result1 !== null) {
974
- var result0 = result1;
975
- } else {
976
- var result0 = null;;
977
- };
978
- };
979
- };
980
- };
981
- };
1281
+ var result0;
1282
+
1283
+ result0 = parse_comment();
1284
+ if (result0 === null) {
1285
+ result0 = parse_section();
1286
+ if (result0 === null) {
1287
+ result0 = parse_partial();
1288
+ if (result0 === null) {
1289
+ result0 = parse_special();
1290
+ if (result0 === null) {
1291
+ result0 = parse_reference();
1292
+ if (result0 === null) {
1293
+ result0 = parse_buffer();
1294
+ }
1295
+ }
1296
+ }
1297
+ }
982
1298
  }
983
-
984
-
985
-
986
- cache[cacheKey] = {
987
- nextPos: pos,
988
- result: result0
989
- };
990
1299
  return result0;
991
1300
  }
992
1301
 
993
1302
  function parse_section() {
994
- var cacheKey = "section" + '@' + pos;
995
- var cachedResult = cache[cacheKey];
996
- if (cachedResult) {
997
- pos = cachedResult.nextPos;
998
- return cachedResult.result;
999
- }
1000
-
1001
- var savedReportMatchFailures = reportMatchFailures;
1002
- reportMatchFailures = false;
1003
- var savedPos1 = pos;
1004
- var result8 = parse_sec_tag_start();
1005
- if (result8 !== null) {
1006
- var result9 = parse_rd();
1007
- if (result9 !== null) {
1008
- var result10 = parse_body();
1009
- if (result10 !== null) {
1010
- var result11 = parse_bodies();
1011
- if (result11 !== null) {
1012
- var result12 = parse_end_tag();
1013
- if (result12 !== null) {
1014
- var result13 = (function() {return result8[1].text === result12.text})() ? '' : null;
1015
- if (result13 !== null) {
1016
- var result7 = [result8, result9, result10, result11, result12, result13];
1303
+ var result0, result1, result2, result3, result4, result5, result6;
1304
+ var pos0, pos1;
1305
+
1306
+ reportFailures++;
1307
+ pos0 = clone(pos);
1308
+ pos1 = clone(pos);
1309
+ result0 = parse_sec_tag_start();
1310
+ if (result0 !== null) {
1311
+ result1 = [];
1312
+ result2 = parse_ws();
1313
+ while (result2 !== null) {
1314
+ result1.push(result2);
1315
+ result2 = parse_ws();
1316
+ }
1317
+ if (result1 !== null) {
1318
+ result2 = parse_rd();
1319
+ if (result2 !== null) {
1320
+ result3 = parse_body();
1321
+ if (result3 !== null) {
1322
+ result4 = parse_bodies();
1323
+ if (result4 !== null) {
1324
+ result5 = parse_end_tag();
1325
+ if (result5 !== null) {
1326
+ result6 = (function(offset, line, column, t, b, e, n) { return t[1].text === n.text;})(pos.offset, pos.line, pos.column, result0, result3, result4, result5) ? "" : null;
1327
+ if (result6 !== null) {
1328
+ result0 = [result0, result1, result2, result3, result4, result5, result6];
1329
+ } else {
1330
+ result0 = null;
1331
+ pos = clone(pos1);
1332
+ }
1017
1333
  } else {
1018
- var result7 = null;
1019
- pos = savedPos1;
1334
+ result0 = null;
1335
+ pos = clone(pos1);
1020
1336
  }
1021
1337
  } else {
1022
- var result7 = null;
1023
- pos = savedPos1;
1338
+ result0 = null;
1339
+ pos = clone(pos1);
1024
1340
  }
1025
1341
  } else {
1026
- var result7 = null;
1027
- pos = savedPos1;
1342
+ result0 = null;
1343
+ pos = clone(pos1);
1028
1344
  }
1029
1345
  } else {
1030
- var result7 = null;
1031
- pos = savedPos1;
1346
+ result0 = null;
1347
+ pos = clone(pos1);
1032
1348
  }
1033
1349
  } else {
1034
- var result7 = null;
1035
- pos = savedPos1;
1350
+ result0 = null;
1351
+ pos = clone(pos1);
1036
1352
  }
1037
1353
  } else {
1038
- var result7 = null;
1039
- pos = savedPos1;
1040
- }
1041
- var result6 = result7 !== null
1042
- ? (function(t, b, e, n) { e.push(["param", ["literal", "block"], b]); t.push(e); return t })(result7[0], result7[2], result7[3], result7[4])
1043
- : null;
1044
- if (result6 !== null) {
1045
- var result0 = result6;
1046
- } else {
1047
- var savedPos0 = pos;
1048
- var result3 = parse_sec_tag_start();
1049
- if (result3 !== null) {
1050
- if (input.substr(pos, 1) === "/") {
1051
- var result4 = "/";
1052
- pos += 1;
1053
- } else {
1054
- var result4 = null;
1055
- if (reportMatchFailures) {
1056
- matchFailed("\"/\"");
1057
- }
1354
+ result0 = null;
1355
+ pos = clone(pos1);
1356
+ }
1357
+ if (result0 !== null) {
1358
+ result0 = (function(offset, line, column, t, b, e, n) { e.push(["param", ["literal", "block"], b]); t.push(e); return t })(pos0.offset, pos0.line, pos0.column, result0[0], result0[3], result0[4], result0[5]);
1359
+ }
1360
+ if (result0 === null) {
1361
+ pos = clone(pos0);
1362
+ }
1363
+ if (result0 === null) {
1364
+ pos0 = clone(pos);
1365
+ pos1 = clone(pos);
1366
+ result0 = parse_sec_tag_start();
1367
+ if (result0 !== null) {
1368
+ result1 = [];
1369
+ result2 = parse_ws();
1370
+ while (result2 !== null) {
1371
+ result1.push(result2);
1372
+ result2 = parse_ws();
1058
1373
  }
1059
- if (result4 !== null) {
1060
- var result5 = parse_rd();
1061
- if (result5 !== null) {
1062
- var result2 = [result3, result4, result5];
1374
+ if (result1 !== null) {
1375
+ if (input.charCodeAt(pos.offset) === 47) {
1376
+ result2 = "/";
1377
+ advance(pos, 1);
1378
+ } else {
1379
+ result2 = null;
1380
+ if (reportFailures === 0) {
1381
+ matchFailed("\"/\"");
1382
+ }
1383
+ }
1384
+ if (result2 !== null) {
1385
+ result3 = parse_rd();
1386
+ if (result3 !== null) {
1387
+ result0 = [result0, result1, result2, result3];
1388
+ } else {
1389
+ result0 = null;
1390
+ pos = clone(pos1);
1391
+ }
1063
1392
  } else {
1064
- var result2 = null;
1065
- pos = savedPos0;
1393
+ result0 = null;
1394
+ pos = clone(pos1);
1066
1395
  }
1067
1396
  } else {
1068
- var result2 = null;
1069
- pos = savedPos0;
1397
+ result0 = null;
1398
+ pos = clone(pos1);
1070
1399
  }
1071
1400
  } else {
1072
- var result2 = null;
1073
- pos = savedPos0;
1401
+ result0 = null;
1402
+ pos = clone(pos1);
1403
+ }
1404
+ if (result0 !== null) {
1405
+ result0 = (function(offset, line, column, t) { t.push(["bodies"]); return t })(pos0.offset, pos0.line, pos0.column, result0[0]);
1406
+ }
1407
+ if (result0 === null) {
1408
+ pos = clone(pos0);
1074
1409
  }
1075
- var result1 = result2 !== null
1076
- ? (function(t) { t.push(["bodies"]); return t })(result2[0])
1077
- : null;
1078
- if (result1 !== null) {
1079
- var result0 = result1;
1080
- } else {
1081
- var result0 = null;;
1082
- };
1083
1410
  }
1084
- reportMatchFailures = savedReportMatchFailures;
1085
- if (reportMatchFailures && result0 === null) {
1411
+ reportFailures--;
1412
+ if (reportFailures === 0 && result0 === null) {
1086
1413
  matchFailed("section");
1087
1414
  }
1088
-
1089
- cache[cacheKey] = {
1090
- nextPos: pos,
1091
- result: result0
1092
- };
1093
1415
  return result0;
1094
1416
  }
1095
1417
 
1096
1418
  function parse_sec_tag_start() {
1097
- var cacheKey = "sec_tag_start" + '@' + pos;
1098
- var cachedResult = cache[cacheKey];
1099
- if (cachedResult) {
1100
- pos = cachedResult.nextPos;
1101
- return cachedResult.result;
1102
- }
1103
-
1104
-
1105
- var savedPos0 = pos;
1106
- var result2 = parse_ld();
1107
- if (result2 !== null) {
1108
- if (input.substr(pos).match(/^[#?^<+@%]/) !== null) {
1109
- var result3 = input.charAt(pos);
1110
- pos++;
1419
+ var result0, result1, result2, result3, result4, result5;
1420
+ var pos0, pos1;
1421
+
1422
+ pos0 = clone(pos);
1423
+ pos1 = clone(pos);
1424
+ result0 = parse_ld();
1425
+ if (result0 !== null) {
1426
+ if (/^[#?^<+@%]/.test(input.charAt(pos.offset))) {
1427
+ result1 = input.charAt(pos.offset);
1428
+ advance(pos, 1);
1111
1429
  } else {
1112
- var result3 = null;
1113
- if (reportMatchFailures) {
1430
+ result1 = null;
1431
+ if (reportFailures === 0) {
1114
1432
  matchFailed("[#?^<+@%]");
1115
1433
  }
1116
1434
  }
1117
- if (result3 !== null) {
1118
- var result4 = parse_identifier();
1119
- if (result4 !== null) {
1120
- var result5 = parse_context();
1121
- if (result5 !== null) {
1122
- var result6 = parse_params();
1123
- if (result6 !== null) {
1124
- var result1 = [result2, result3, result4, result5, result6];
1435
+ if (result1 !== null) {
1436
+ result2 = [];
1437
+ result3 = parse_ws();
1438
+ while (result3 !== null) {
1439
+ result2.push(result3);
1440
+ result3 = parse_ws();
1441
+ }
1442
+ if (result2 !== null) {
1443
+ result3 = parse_identifier();
1444
+ if (result3 !== null) {
1445
+ result4 = parse_context();
1446
+ if (result4 !== null) {
1447
+ result5 = parse_params();
1448
+ if (result5 !== null) {
1449
+ result0 = [result0, result1, result2, result3, result4, result5];
1450
+ } else {
1451
+ result0 = null;
1452
+ pos = clone(pos1);
1453
+ }
1125
1454
  } else {
1126
- var result1 = null;
1127
- pos = savedPos0;
1455
+ result0 = null;
1456
+ pos = clone(pos1);
1128
1457
  }
1129
1458
  } else {
1130
- var result1 = null;
1131
- pos = savedPos0;
1459
+ result0 = null;
1460
+ pos = clone(pos1);
1132
1461
  }
1133
1462
  } else {
1134
- var result1 = null;
1135
- pos = savedPos0;
1463
+ result0 = null;
1464
+ pos = clone(pos1);
1136
1465
  }
1137
1466
  } else {
1138
- var result1 = null;
1139
- pos = savedPos0;
1467
+ result0 = null;
1468
+ pos = clone(pos1);
1140
1469
  }
1141
1470
  } else {
1142
- var result1 = null;
1143
- pos = savedPos0;
1471
+ result0 = null;
1472
+ pos = clone(pos1);
1473
+ }
1474
+ if (result0 !== null) {
1475
+ result0 = (function(offset, line, column, t, n, c, p) { return [t, n, c, p] })(pos0.offset, pos0.line, pos0.column, result0[1], result0[3], result0[4], result0[5]);
1476
+ }
1477
+ if (result0 === null) {
1478
+ pos = clone(pos0);
1144
1479
  }
1145
- var result0 = result1 !== null
1146
- ? (function(t, n, c, p) { return [t, n, c, p] })(result1[1], result1[2], result1[3], result1[4])
1147
- : null;
1148
-
1149
-
1150
-
1151
- cache[cacheKey] = {
1152
- nextPos: pos,
1153
- result: result0
1154
- };
1155
1480
  return result0;
1156
1481
  }
1157
1482
 
1158
1483
  function parse_end_tag() {
1159
- var cacheKey = "end_tag" + '@' + pos;
1160
- var cachedResult = cache[cacheKey];
1161
- if (cachedResult) {
1162
- pos = cachedResult.nextPos;
1163
- return cachedResult.result;
1164
- }
1165
-
1166
- var savedReportMatchFailures = reportMatchFailures;
1167
- reportMatchFailures = false;
1168
- var savedPos0 = pos;
1169
- var result2 = parse_ld();
1170
- if (result2 !== null) {
1171
- if (input.substr(pos, 1) === "/") {
1172
- var result3 = "/";
1173
- pos += 1;
1484
+ var result0, result1, result2, result3, result4, result5;
1485
+ var pos0, pos1;
1486
+
1487
+ reportFailures++;
1488
+ pos0 = clone(pos);
1489
+ pos1 = clone(pos);
1490
+ result0 = parse_ld();
1491
+ if (result0 !== null) {
1492
+ if (input.charCodeAt(pos.offset) === 47) {
1493
+ result1 = "/";
1494
+ advance(pos, 1);
1174
1495
  } else {
1175
- var result3 = null;
1176
- if (reportMatchFailures) {
1496
+ result1 = null;
1497
+ if (reportFailures === 0) {
1177
1498
  matchFailed("\"/\"");
1178
1499
  }
1179
1500
  }
1180
- if (result3 !== null) {
1181
- var result4 = parse_identifier();
1182
- if (result4 !== null) {
1183
- var result5 = parse_rd();
1184
- if (result5 !== null) {
1185
- var result1 = [result2, result3, result4, result5];
1501
+ if (result1 !== null) {
1502
+ result2 = [];
1503
+ result3 = parse_ws();
1504
+ while (result3 !== null) {
1505
+ result2.push(result3);
1506
+ result3 = parse_ws();
1507
+ }
1508
+ if (result2 !== null) {
1509
+ result3 = parse_identifier();
1510
+ if (result3 !== null) {
1511
+ result4 = [];
1512
+ result5 = parse_ws();
1513
+ while (result5 !== null) {
1514
+ result4.push(result5);
1515
+ result5 = parse_ws();
1516
+ }
1517
+ if (result4 !== null) {
1518
+ result5 = parse_rd();
1519
+ if (result5 !== null) {
1520
+ result0 = [result0, result1, result2, result3, result4, result5];
1521
+ } else {
1522
+ result0 = null;
1523
+ pos = clone(pos1);
1524
+ }
1525
+ } else {
1526
+ result0 = null;
1527
+ pos = clone(pos1);
1528
+ }
1186
1529
  } else {
1187
- var result1 = null;
1188
- pos = savedPos0;
1530
+ result0 = null;
1531
+ pos = clone(pos1);
1189
1532
  }
1190
1533
  } else {
1191
- var result1 = null;
1192
- pos = savedPos0;
1534
+ result0 = null;
1535
+ pos = clone(pos1);
1193
1536
  }
1194
1537
  } else {
1195
- var result1 = null;
1196
- pos = savedPos0;
1538
+ result0 = null;
1539
+ pos = clone(pos1);
1197
1540
  }
1198
1541
  } else {
1199
- var result1 = null;
1200
- pos = savedPos0;
1201
- }
1202
- var result0 = result1 !== null
1203
- ? (function(n) { return n })(result1[2])
1204
- : null;
1205
- reportMatchFailures = savedReportMatchFailures;
1206
- if (reportMatchFailures && result0 === null) {
1542
+ result0 = null;
1543
+ pos = clone(pos1);
1544
+ }
1545
+ if (result0 !== null) {
1546
+ result0 = (function(offset, line, column, n) { return n })(pos0.offset, pos0.line, pos0.column, result0[3]);
1547
+ }
1548
+ if (result0 === null) {
1549
+ pos = clone(pos0);
1550
+ }
1551
+ reportFailures--;
1552
+ if (reportFailures === 0 && result0 === null) {
1207
1553
  matchFailed("end tag");
1208
1554
  }
1209
-
1210
- cache[cacheKey] = {
1211
- nextPos: pos,
1212
- result: result0
1213
- };
1214
1555
  return result0;
1215
1556
  }
1216
1557
 
1217
1558
  function parse_context() {
1218
- var cacheKey = "context" + '@' + pos;
1219
- var cachedResult = cache[cacheKey];
1220
- if (cachedResult) {
1221
- pos = cachedResult.nextPos;
1222
- return cachedResult.result;
1223
- }
1224
-
1225
-
1226
- var savedPos0 = pos;
1227
- if (input.substr(pos, 1) === ":") {
1228
- var result4 = ":";
1229
- pos += 1;
1559
+ var result0, result1;
1560
+ var pos0, pos1, pos2;
1561
+
1562
+ pos0 = clone(pos);
1563
+ pos1 = clone(pos);
1564
+ pos2 = clone(pos);
1565
+ if (input.charCodeAt(pos.offset) === 58) {
1566
+ result0 = ":";
1567
+ advance(pos, 1);
1230
1568
  } else {
1231
- var result4 = null;
1232
- if (reportMatchFailures) {
1569
+ result0 = null;
1570
+ if (reportFailures === 0) {
1233
1571
  matchFailed("\":\"");
1234
1572
  }
1235
1573
  }
1236
- if (result4 !== null) {
1237
- var result5 = parse_identifier();
1238
- if (result5 !== null) {
1239
- var result3 = [result4, result5];
1574
+ if (result0 !== null) {
1575
+ result1 = parse_identifier();
1576
+ if (result1 !== null) {
1577
+ result0 = [result0, result1];
1240
1578
  } else {
1241
- var result3 = null;
1242
- pos = savedPos0;
1579
+ result0 = null;
1580
+ pos = clone(pos2);
1243
1581
  }
1244
1582
  } else {
1245
- var result3 = null;
1246
- pos = savedPos0;
1247
- }
1248
- var result2 = result3 !== null
1249
- ? (function(n) {return n})(result3[1])
1250
- : null;
1251
- var result1 = result2 !== null ? result2 : '';
1252
- var result0 = result1 !== null
1253
- ? (function(n) { return n ? ["context", n] : ["context"] })(result1)
1254
- : null;
1255
-
1256
-
1257
-
1258
- cache[cacheKey] = {
1259
- nextPos: pos,
1260
- result: result0
1261
- };
1583
+ result0 = null;
1584
+ pos = clone(pos2);
1585
+ }
1586
+ if (result0 !== null) {
1587
+ result0 = (function(offset, line, column, n) {return n})(pos1.offset, pos1.line, pos1.column, result0[1]);
1588
+ }
1589
+ if (result0 === null) {
1590
+ pos = clone(pos1);
1591
+ }
1592
+ result0 = result0 !== null ? result0 : "";
1593
+ if (result0 !== null) {
1594
+ result0 = (function(offset, line, column, n) { return n ? ["context", n] : ["context"] })(pos0.offset, pos0.line, pos0.column, result0);
1595
+ }
1596
+ if (result0 === null) {
1597
+ pos = clone(pos0);
1598
+ }
1262
1599
  return result0;
1263
1600
  }
1264
1601
 
1265
1602
  function parse_params() {
1266
- var cacheKey = "params" + '@' + pos;
1267
- var cachedResult = cache[cacheKey];
1268
- if (cachedResult) {
1269
- pos = cachedResult.nextPos;
1270
- return cachedResult.result;
1271
- }
1272
-
1273
- var savedReportMatchFailures = reportMatchFailures;
1274
- reportMatchFailures = false;
1275
- var result1 = [];
1276
- var savedPos0 = pos;
1277
- var result4 = parse_ws();
1278
- if (result4 !== null) {
1279
- var result5 = parse_key();
1280
- if (result5 !== null) {
1281
- if (input.substr(pos, 1) === "=") {
1282
- var result6 = "=";
1283
- pos += 1;
1284
- } else {
1285
- var result6 = null;
1286
- if (reportMatchFailures) {
1287
- matchFailed("\"=\"");
1603
+ var result0, result1, result2, result3, result4;
1604
+ var pos0, pos1, pos2;
1605
+
1606
+ reportFailures++;
1607
+ pos0 = clone(pos);
1608
+ result0 = [];
1609
+ pos1 = clone(pos);
1610
+ pos2 = clone(pos);
1611
+ result2 = parse_ws();
1612
+ if (result2 !== null) {
1613
+ result1 = [];
1614
+ while (result2 !== null) {
1615
+ result1.push(result2);
1616
+ result2 = parse_ws();
1617
+ }
1618
+ } else {
1619
+ result1 = null;
1620
+ }
1621
+ if (result1 !== null) {
1622
+ result2 = parse_key();
1623
+ if (result2 !== null) {
1624
+ if (input.charCodeAt(pos.offset) === 61) {
1625
+ result3 = "=";
1626
+ advance(pos, 1);
1627
+ } else {
1628
+ result3 = null;
1629
+ if (reportFailures === 0) {
1630
+ matchFailed("\"=\"");
1288
1631
  }
1289
1632
  }
1290
- if (result6 !== null) {
1291
- var result9 = parse_identifier();
1292
- if (result9 !== null) {
1293
- var result7 = result9;
1294
- } else {
1295
- var result8 = parse_inline();
1296
- if (result8 !== null) {
1297
- var result7 = result8;
1298
- } else {
1299
- var result7 = null;;
1300
- };
1633
+ if (result3 !== null) {
1634
+ result4 = parse_number();
1635
+ if (result4 === null) {
1636
+ result4 = parse_identifier();
1637
+ if (result4 === null) {
1638
+ result4 = parse_inline();
1639
+ }
1301
1640
  }
1302
- if (result7 !== null) {
1303
- var result3 = [result4, result5, result6, result7];
1641
+ if (result4 !== null) {
1642
+ result1 = [result1, result2, result3, result4];
1304
1643
  } else {
1305
- var result3 = null;
1306
- pos = savedPos0;
1644
+ result1 = null;
1645
+ pos = clone(pos2);
1307
1646
  }
1308
1647
  } else {
1309
- var result3 = null;
1310
- pos = savedPos0;
1648
+ result1 = null;
1649
+ pos = clone(pos2);
1311
1650
  }
1312
1651
  } else {
1313
- var result3 = null;
1314
- pos = savedPos0;
1652
+ result1 = null;
1653
+ pos = clone(pos2);
1315
1654
  }
1316
1655
  } else {
1317
- var result3 = null;
1318
- pos = savedPos0;
1319
- }
1320
- var result2 = result3 !== null
1321
- ? (function(k, v) {return ["param", ["literal", k], v]})(result3[1], result3[3])
1322
- : null;
1323
- while (result2 !== null) {
1324
- result1.push(result2);
1325
- var savedPos0 = pos;
1326
- var result4 = parse_ws();
1327
- if (result4 !== null) {
1328
- var result5 = parse_key();
1329
- if (result5 !== null) {
1330
- if (input.substr(pos, 1) === "=") {
1331
- var result6 = "=";
1332
- pos += 1;
1656
+ result1 = null;
1657
+ pos = clone(pos2);
1658
+ }
1659
+ if (result1 !== null) {
1660
+ result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[1], result1[3]);
1661
+ }
1662
+ if (result1 === null) {
1663
+ pos = clone(pos1);
1664
+ }
1665
+ while (result1 !== null) {
1666
+ result0.push(result1);
1667
+ pos1 = clone(pos);
1668
+ pos2 = clone(pos);
1669
+ result2 = parse_ws();
1670
+ if (result2 !== null) {
1671
+ result1 = [];
1672
+ while (result2 !== null) {
1673
+ result1.push(result2);
1674
+ result2 = parse_ws();
1675
+ }
1676
+ } else {
1677
+ result1 = null;
1678
+ }
1679
+ if (result1 !== null) {
1680
+ result2 = parse_key();
1681
+ if (result2 !== null) {
1682
+ if (input.charCodeAt(pos.offset) === 61) {
1683
+ result3 = "=";
1684
+ advance(pos, 1);
1333
1685
  } else {
1334
- var result6 = null;
1335
- if (reportMatchFailures) {
1686
+ result3 = null;
1687
+ if (reportFailures === 0) {
1336
1688
  matchFailed("\"=\"");
1337
1689
  }
1338
1690
  }
1339
- if (result6 !== null) {
1340
- var result9 = parse_identifier();
1341
- if (result9 !== null) {
1342
- var result7 = result9;
1343
- } else {
1344
- var result8 = parse_inline();
1345
- if (result8 !== null) {
1346
- var result7 = result8;
1347
- } else {
1348
- var result7 = null;;
1349
- };
1691
+ if (result3 !== null) {
1692
+ result4 = parse_number();
1693
+ if (result4 === null) {
1694
+ result4 = parse_identifier();
1695
+ if (result4 === null) {
1696
+ result4 = parse_inline();
1697
+ }
1350
1698
  }
1351
- if (result7 !== null) {
1352
- var result3 = [result4, result5, result6, result7];
1699
+ if (result4 !== null) {
1700
+ result1 = [result1, result2, result3, result4];
1353
1701
  } else {
1354
- var result3 = null;
1355
- pos = savedPos0;
1702
+ result1 = null;
1703
+ pos = clone(pos2);
1356
1704
  }
1357
1705
  } else {
1358
- var result3 = null;
1359
- pos = savedPos0;
1706
+ result1 = null;
1707
+ pos = clone(pos2);
1360
1708
  }
1361
1709
  } else {
1362
- var result3 = null;
1363
- pos = savedPos0;
1710
+ result1 = null;
1711
+ pos = clone(pos2);
1364
1712
  }
1365
1713
  } else {
1366
- var result3 = null;
1367
- pos = savedPos0;
1368
- }
1369
- var result2 = result3 !== null
1370
- ? (function(k, v) {return ["param", ["literal", k], v]})(result3[1], result3[3])
1371
- : null;
1372
- }
1373
- var result0 = result1 !== null
1374
- ? (function(p) { return ["params"].concat(p) })(result1)
1375
- : null;
1376
- reportMatchFailures = savedReportMatchFailures;
1377
- if (reportMatchFailures && result0 === null) {
1714
+ result1 = null;
1715
+ pos = clone(pos2);
1716
+ }
1717
+ if (result1 !== null) {
1718
+ result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[1], result1[3]);
1719
+ }
1720
+ if (result1 === null) {
1721
+ pos = clone(pos1);
1722
+ }
1723
+ }
1724
+ if (result0 !== null) {
1725
+ result0 = (function(offset, line, column, p) { return ["params"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0);
1726
+ }
1727
+ if (result0 === null) {
1728
+ pos = clone(pos0);
1729
+ }
1730
+ reportFailures--;
1731
+ if (reportFailures === 0 && result0 === null) {
1378
1732
  matchFailed("params");
1379
1733
  }
1380
-
1381
- cache[cacheKey] = {
1382
- nextPos: pos,
1383
- result: result0
1384
- };
1385
1734
  return result0;
1386
1735
  }
1387
1736
 
1388
1737
  function parse_bodies() {
1389
- var cacheKey = "bodies" + '@' + pos;
1390
- var cachedResult = cache[cacheKey];
1391
- if (cachedResult) {
1392
- pos = cachedResult.nextPos;
1393
- return cachedResult.result;
1394
- }
1395
-
1396
- var savedReportMatchFailures = reportMatchFailures;
1397
- reportMatchFailures = false;
1398
- var result1 = [];
1399
- var savedPos0 = pos;
1400
- var result4 = parse_ld();
1401
- if (result4 !== null) {
1402
- if (input.substr(pos, 1) === ":") {
1403
- var result5 = ":";
1404
- pos += 1;
1738
+ var result0, result1, result2, result3, result4, result5;
1739
+ var pos0, pos1, pos2;
1740
+
1741
+ reportFailures++;
1742
+ pos0 = clone(pos);
1743
+ result0 = [];
1744
+ pos1 = clone(pos);
1745
+ pos2 = clone(pos);
1746
+ result1 = parse_ld();
1747
+ if (result1 !== null) {
1748
+ if (input.charCodeAt(pos.offset) === 58) {
1749
+ result2 = ":";
1750
+ advance(pos, 1);
1405
1751
  } else {
1406
- var result5 = null;
1407
- if (reportMatchFailures) {
1752
+ result2 = null;
1753
+ if (reportFailures === 0) {
1408
1754
  matchFailed("\":\"");
1409
1755
  }
1410
1756
  }
1411
- if (result5 !== null) {
1412
- var result6 = parse_key();
1413
- if (result6 !== null) {
1414
- var result7 = parse_rd();
1415
- if (result7 !== null) {
1416
- var result8 = parse_body();
1417
- if (result8 !== null) {
1418
- var result3 = [result4, result5, result6, result7, result8];
1757
+ if (result2 !== null) {
1758
+ result3 = parse_key();
1759
+ if (result3 !== null) {
1760
+ result4 = parse_rd();
1761
+ if (result4 !== null) {
1762
+ result5 = parse_body();
1763
+ if (result5 !== null) {
1764
+ result1 = [result1, result2, result3, result4, result5];
1419
1765
  } else {
1420
- var result3 = null;
1421
- pos = savedPos0;
1766
+ result1 = null;
1767
+ pos = clone(pos2);
1422
1768
  }
1423
1769
  } else {
1424
- var result3 = null;
1425
- pos = savedPos0;
1770
+ result1 = null;
1771
+ pos = clone(pos2);
1426
1772
  }
1427
1773
  } else {
1428
- var result3 = null;
1429
- pos = savedPos0;
1774
+ result1 = null;
1775
+ pos = clone(pos2);
1430
1776
  }
1431
1777
  } else {
1432
- var result3 = null;
1433
- pos = savedPos0;
1778
+ result1 = null;
1779
+ pos = clone(pos2);
1434
1780
  }
1435
1781
  } else {
1436
- var result3 = null;
1437
- pos = savedPos0;
1438
- }
1439
- var result2 = result3 !== null
1440
- ? (function(k, v) {return ["param", ["literal", k], v]})(result3[2], result3[4])
1441
- : null;
1442
- while (result2 !== null) {
1443
- result1.push(result2);
1444
- var savedPos0 = pos;
1445
- var result4 = parse_ld();
1446
- if (result4 !== null) {
1447
- if (input.substr(pos, 1) === ":") {
1448
- var result5 = ":";
1449
- pos += 1;
1782
+ result1 = null;
1783
+ pos = clone(pos2);
1784
+ }
1785
+ if (result1 !== null) {
1786
+ result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[2], result1[4]);
1787
+ }
1788
+ if (result1 === null) {
1789
+ pos = clone(pos1);
1790
+ }
1791
+ while (result1 !== null) {
1792
+ result0.push(result1);
1793
+ pos1 = clone(pos);
1794
+ pos2 = clone(pos);
1795
+ result1 = parse_ld();
1796
+ if (result1 !== null) {
1797
+ if (input.charCodeAt(pos.offset) === 58) {
1798
+ result2 = ":";
1799
+ advance(pos, 1);
1450
1800
  } else {
1451
- var result5 = null;
1452
- if (reportMatchFailures) {
1801
+ result2 = null;
1802
+ if (reportFailures === 0) {
1453
1803
  matchFailed("\":\"");
1454
1804
  }
1455
1805
  }
1456
- if (result5 !== null) {
1457
- var result6 = parse_key();
1458
- if (result6 !== null) {
1459
- var result7 = parse_rd();
1460
- if (result7 !== null) {
1461
- var result8 = parse_body();
1462
- if (result8 !== null) {
1463
- var result3 = [result4, result5, result6, result7, result8];
1806
+ if (result2 !== null) {
1807
+ result3 = parse_key();
1808
+ if (result3 !== null) {
1809
+ result4 = parse_rd();
1810
+ if (result4 !== null) {
1811
+ result5 = parse_body();
1812
+ if (result5 !== null) {
1813
+ result1 = [result1, result2, result3, result4, result5];
1464
1814
  } else {
1465
- var result3 = null;
1466
- pos = savedPos0;
1815
+ result1 = null;
1816
+ pos = clone(pos2);
1467
1817
  }
1468
1818
  } else {
1469
- var result3 = null;
1470
- pos = savedPos0;
1819
+ result1 = null;
1820
+ pos = clone(pos2);
1471
1821
  }
1472
1822
  } else {
1473
- var result3 = null;
1474
- pos = savedPos0;
1823
+ result1 = null;
1824
+ pos = clone(pos2);
1475
1825
  }
1476
1826
  } else {
1477
- var result3 = null;
1478
- pos = savedPos0;
1827
+ result1 = null;
1828
+ pos = clone(pos2);
1479
1829
  }
1480
1830
  } else {
1481
- var result3 = null;
1482
- pos = savedPos0;
1483
- }
1484
- var result2 = result3 !== null
1485
- ? (function(k, v) {return ["param", ["literal", k], v]})(result3[2], result3[4])
1486
- : null;
1487
- }
1488
- var result0 = result1 !== null
1489
- ? (function(p) { return ["bodies"].concat(p) })(result1)
1490
- : null;
1491
- reportMatchFailures = savedReportMatchFailures;
1492
- if (reportMatchFailures && result0 === null) {
1831
+ result1 = null;
1832
+ pos = clone(pos2);
1833
+ }
1834
+ if (result1 !== null) {
1835
+ result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[2], result1[4]);
1836
+ }
1837
+ if (result1 === null) {
1838
+ pos = clone(pos1);
1839
+ }
1840
+ }
1841
+ if (result0 !== null) {
1842
+ result0 = (function(offset, line, column, p) { return ["bodies"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0);
1843
+ }
1844
+ if (result0 === null) {
1845
+ pos = clone(pos0);
1846
+ }
1847
+ reportFailures--;
1848
+ if (reportFailures === 0 && result0 === null) {
1493
1849
  matchFailed("bodies");
1494
1850
  }
1495
-
1496
- cache[cacheKey] = {
1497
- nextPos: pos,
1498
- result: result0
1499
- };
1500
1851
  return result0;
1501
1852
  }
1502
1853
 
1503
1854
  function parse_reference() {
1504
- var cacheKey = "reference" + '@' + pos;
1505
- var cachedResult = cache[cacheKey];
1506
- if (cachedResult) {
1507
- pos = cachedResult.nextPos;
1508
- return cachedResult.result;
1509
- }
1510
-
1511
- var savedReportMatchFailures = reportMatchFailures;
1512
- reportMatchFailures = false;
1513
- var savedPos0 = pos;
1514
- var result2 = parse_ld();
1515
- if (result2 !== null) {
1516
- var result3 = parse_identifier();
1517
- if (result3 !== null) {
1518
- var result4 = parse_filters();
1519
- if (result4 !== null) {
1520
- var result5 = parse_rd();
1521
- if (result5 !== null) {
1522
- var result1 = [result2, result3, result4, result5];
1855
+ var result0, result1, result2, result3;
1856
+ var pos0, pos1;
1857
+
1858
+ reportFailures++;
1859
+ pos0 = clone(pos);
1860
+ pos1 = clone(pos);
1861
+ result0 = parse_ld();
1862
+ if (result0 !== null) {
1863
+ result1 = parse_identifier();
1864
+ if (result1 !== null) {
1865
+ result2 = parse_filters();
1866
+ if (result2 !== null) {
1867
+ result3 = parse_rd();
1868
+ if (result3 !== null) {
1869
+ result0 = [result0, result1, result2, result3];
1523
1870
  } else {
1524
- var result1 = null;
1525
- pos = savedPos0;
1871
+ result0 = null;
1872
+ pos = clone(pos1);
1526
1873
  }
1527
1874
  } else {
1528
- var result1 = null;
1529
- pos = savedPos0;
1875
+ result0 = null;
1876
+ pos = clone(pos1);
1530
1877
  }
1531
1878
  } else {
1532
- var result1 = null;
1533
- pos = savedPos0;
1879
+ result0 = null;
1880
+ pos = clone(pos1);
1534
1881
  }
1535
1882
  } else {
1536
- var result1 = null;
1537
- pos = savedPos0;
1538
- }
1539
- var result0 = result1 !== null
1540
- ? (function(n, f) { return ["reference", n, f] })(result1[1], result1[2])
1541
- : null;
1542
- reportMatchFailures = savedReportMatchFailures;
1543
- if (reportMatchFailures && result0 === null) {
1883
+ result0 = null;
1884
+ pos = clone(pos1);
1885
+ }
1886
+ if (result0 !== null) {
1887
+ result0 = (function(offset, line, column, n, f) { return ["reference", n, f] })(pos0.offset, pos0.line, pos0.column, result0[1], result0[2]);
1888
+ }
1889
+ if (result0 === null) {
1890
+ pos = clone(pos0);
1891
+ }
1892
+ reportFailures--;
1893
+ if (reportFailures === 0 && result0 === null) {
1544
1894
  matchFailed("reference");
1545
1895
  }
1546
-
1547
- cache[cacheKey] = {
1548
- nextPos: pos,
1549
- result: result0
1550
- };
1551
1896
  return result0;
1552
1897
  }
1553
1898
 
1554
1899
  function parse_partial() {
1555
- var cacheKey = "partial" + '@' + pos;
1556
- var cachedResult = cache[cacheKey];
1557
- if (cachedResult) {
1558
- pos = cachedResult.nextPos;
1559
- return cachedResult.result;
1560
- }
1561
-
1562
- var savedReportMatchFailures = reportMatchFailures;
1563
- reportMatchFailures = false;
1564
- var savedPos0 = pos;
1565
- var result2 = parse_ld();
1566
- if (result2 !== null) {
1567
- if (input.substr(pos, 1) === ">") {
1568
- var result3 = ">";
1569
- pos += 1;
1900
+ var result0, result1, result2, result3, result4, result5, result6, result7;
1901
+ var pos0, pos1, pos2;
1902
+
1903
+ reportFailures++;
1904
+ pos0 = clone(pos);
1905
+ pos1 = clone(pos);
1906
+ result0 = parse_ld();
1907
+ if (result0 !== null) {
1908
+ if (input.charCodeAt(pos.offset) === 62) {
1909
+ result1 = ">";
1910
+ advance(pos, 1);
1570
1911
  } else {
1571
- var result3 = null;
1572
- if (reportMatchFailures) {
1912
+ result1 = null;
1913
+ if (reportFailures === 0) {
1573
1914
  matchFailed("\">\"");
1574
1915
  }
1575
1916
  }
1576
- if (result3 !== null) {
1577
- var result10 = parse_key();
1578
- var result9 = result10 !== null
1579
- ? (function(k) {return ["literal", k]})(result10)
1580
- : null;
1581
- if (result9 !== null) {
1582
- var result4 = result9;
1917
+ if (result1 === null) {
1918
+ if (input.charCodeAt(pos.offset) === 43) {
1919
+ result1 = "+";
1920
+ advance(pos, 1);
1583
1921
  } else {
1584
- var result8 = parse_inline();
1585
- if (result8 !== null) {
1586
- var result4 = result8;
1587
- } else {
1588
- var result4 = null;;
1589
- };
1590
- }
1591
- if (result4 !== null) {
1592
- var result5 = parse_context();
1593
- if (result5 !== null) {
1594
- if (input.substr(pos, 1) === "/") {
1595
- var result6 = "/";
1596
- pos += 1;
1597
- } else {
1598
- var result6 = null;
1599
- if (reportMatchFailures) {
1600
- matchFailed("\"/\"");
1922
+ result1 = null;
1923
+ if (reportFailures === 0) {
1924
+ matchFailed("\"+\"");
1925
+ }
1926
+ }
1927
+ }
1928
+ if (result1 !== null) {
1929
+ pos2 = clone(pos);
1930
+ result2 = parse_key();
1931
+ if (result2 !== null) {
1932
+ result2 = (function(offset, line, column, k) {return ["literal", k]})(pos2.offset, pos2.line, pos2.column, result2);
1933
+ }
1934
+ if (result2 === null) {
1935
+ pos = clone(pos2);
1936
+ }
1937
+ if (result2 === null) {
1938
+ result2 = parse_inline();
1939
+ }
1940
+ if (result2 !== null) {
1941
+ result3 = parse_context();
1942
+ if (result3 !== null) {
1943
+ result4 = parse_params();
1944
+ if (result4 !== null) {
1945
+ result5 = [];
1946
+ result6 = parse_ws();
1947
+ while (result6 !== null) {
1948
+ result5.push(result6);
1949
+ result6 = parse_ws();
1601
1950
  }
1602
- }
1603
- if (result6 !== null) {
1604
- var result7 = parse_rd();
1605
- if (result7 !== null) {
1606
- var result1 = [result2, result3, result4, result5, result6, result7];
1951
+ if (result5 !== null) {
1952
+ if (input.charCodeAt(pos.offset) === 47) {
1953
+ result6 = "/";
1954
+ advance(pos, 1);
1955
+ } else {
1956
+ result6 = null;
1957
+ if (reportFailures === 0) {
1958
+ matchFailed("\"/\"");
1959
+ }
1960
+ }
1961
+ if (result6 !== null) {
1962
+ result7 = parse_rd();
1963
+ if (result7 !== null) {
1964
+ result0 = [result0, result1, result2, result3, result4, result5, result6, result7];
1965
+ } else {
1966
+ result0 = null;
1967
+ pos = clone(pos1);
1968
+ }
1969
+ } else {
1970
+ result0 = null;
1971
+ pos = clone(pos1);
1972
+ }
1607
1973
  } else {
1608
- var result1 = null;
1609
- pos = savedPos0;
1974
+ result0 = null;
1975
+ pos = clone(pos1);
1610
1976
  }
1611
1977
  } else {
1612
- var result1 = null;
1613
- pos = savedPos0;
1978
+ result0 = null;
1979
+ pos = clone(pos1);
1614
1980
  }
1615
1981
  } else {
1616
- var result1 = null;
1617
- pos = savedPos0;
1982
+ result0 = null;
1983
+ pos = clone(pos1);
1618
1984
  }
1619
1985
  } else {
1620
- var result1 = null;
1621
- pos = savedPos0;
1986
+ result0 = null;
1987
+ pos = clone(pos1);
1622
1988
  }
1623
1989
  } else {
1624
- var result1 = null;
1625
- pos = savedPos0;
1990
+ result0 = null;
1991
+ pos = clone(pos1);
1626
1992
  }
1627
1993
  } else {
1628
- var result1 = null;
1629
- pos = savedPos0;
1630
- }
1631
- var result0 = result1 !== null
1632
- ? (function(n, c) { return ["partial", n, c] })(result1[2], result1[3])
1633
- : null;
1634
- reportMatchFailures = savedReportMatchFailures;
1635
- if (reportMatchFailures && result0 === null) {
1994
+ result0 = null;
1995
+ pos = clone(pos1);
1996
+ }
1997
+ if (result0 !== null) {
1998
+ result0 = (function(offset, line, column, s, n, c, p) { var key = (s ===">")? "partial" : s; return [key, n, c, p] })(pos0.offset, pos0.line, pos0.column, result0[1], result0[2], result0[3], result0[4]);
1999
+ }
2000
+ if (result0 === null) {
2001
+ pos = clone(pos0);
2002
+ }
2003
+ reportFailures--;
2004
+ if (reportFailures === 0 && result0 === null) {
1636
2005
  matchFailed("partial");
1637
2006
  }
1638
-
1639
- cache[cacheKey] = {
1640
- nextPos: pos,
1641
- result: result0
1642
- };
1643
2007
  return result0;
1644
2008
  }
1645
2009
 
1646
2010
  function parse_filters() {
1647
- var cacheKey = "filters" + '@' + pos;
1648
- var cachedResult = cache[cacheKey];
1649
- if (cachedResult) {
1650
- pos = cachedResult.nextPos;
1651
- return cachedResult.result;
1652
- }
1653
-
1654
- var savedReportMatchFailures = reportMatchFailures;
1655
- reportMatchFailures = false;
1656
- var result1 = [];
1657
- var savedPos0 = pos;
1658
- if (input.substr(pos, 1) === "|") {
1659
- var result4 = "|";
1660
- pos += 1;
2011
+ var result0, result1, result2;
2012
+ var pos0, pos1, pos2;
2013
+
2014
+ reportFailures++;
2015
+ pos0 = clone(pos);
2016
+ result0 = [];
2017
+ pos1 = clone(pos);
2018
+ pos2 = clone(pos);
2019
+ if (input.charCodeAt(pos.offset) === 124) {
2020
+ result1 = "|";
2021
+ advance(pos, 1);
1661
2022
  } else {
1662
- var result4 = null;
1663
- if (reportMatchFailures) {
2023
+ result1 = null;
2024
+ if (reportFailures === 0) {
1664
2025
  matchFailed("\"|\"");
1665
2026
  }
1666
2027
  }
1667
- if (result4 !== null) {
1668
- var result5 = parse_key();
1669
- if (result5 !== null) {
1670
- var result3 = [result4, result5];
2028
+ if (result1 !== null) {
2029
+ result2 = parse_key();
2030
+ if (result2 !== null) {
2031
+ result1 = [result1, result2];
1671
2032
  } else {
1672
- var result3 = null;
1673
- pos = savedPos0;
2033
+ result1 = null;
2034
+ pos = clone(pos2);
1674
2035
  }
1675
2036
  } else {
1676
- var result3 = null;
1677
- pos = savedPos0;
1678
- }
1679
- var result2 = result3 !== null
1680
- ? (function(n) {return n})(result3[1])
1681
- : null;
1682
- while (result2 !== null) {
1683
- result1.push(result2);
1684
- var savedPos0 = pos;
1685
- if (input.substr(pos, 1) === "|") {
1686
- var result4 = "|";
1687
- pos += 1;
2037
+ result1 = null;
2038
+ pos = clone(pos2);
2039
+ }
2040
+ if (result1 !== null) {
2041
+ result1 = (function(offset, line, column, n) {return n})(pos1.offset, pos1.line, pos1.column, result1[1]);
2042
+ }
2043
+ if (result1 === null) {
2044
+ pos = clone(pos1);
2045
+ }
2046
+ while (result1 !== null) {
2047
+ result0.push(result1);
2048
+ pos1 = clone(pos);
2049
+ pos2 = clone(pos);
2050
+ if (input.charCodeAt(pos.offset) === 124) {
2051
+ result1 = "|";
2052
+ advance(pos, 1);
1688
2053
  } else {
1689
- var result4 = null;
1690
- if (reportMatchFailures) {
2054
+ result1 = null;
2055
+ if (reportFailures === 0) {
1691
2056
  matchFailed("\"|\"");
1692
2057
  }
1693
2058
  }
1694
- if (result4 !== null) {
1695
- var result5 = parse_key();
1696
- if (result5 !== null) {
1697
- var result3 = [result4, result5];
2059
+ if (result1 !== null) {
2060
+ result2 = parse_key();
2061
+ if (result2 !== null) {
2062
+ result1 = [result1, result2];
1698
2063
  } else {
1699
- var result3 = null;
1700
- pos = savedPos0;
2064
+ result1 = null;
2065
+ pos = clone(pos2);
1701
2066
  }
1702
2067
  } else {
1703
- var result3 = null;
1704
- pos = savedPos0;
1705
- }
1706
- var result2 = result3 !== null
1707
- ? (function(n) {return n})(result3[1])
1708
- : null;
1709
- }
1710
- var result0 = result1 !== null
1711
- ? (function(f) { return ["filters"].concat(f) })(result1)
1712
- : null;
1713
- reportMatchFailures = savedReportMatchFailures;
1714
- if (reportMatchFailures && result0 === null) {
2068
+ result1 = null;
2069
+ pos = clone(pos2);
2070
+ }
2071
+ if (result1 !== null) {
2072
+ result1 = (function(offset, line, column, n) {return n})(pos1.offset, pos1.line, pos1.column, result1[1]);
2073
+ }
2074
+ if (result1 === null) {
2075
+ pos = clone(pos1);
2076
+ }
2077
+ }
2078
+ if (result0 !== null) {
2079
+ result0 = (function(offset, line, column, f) { return ["filters"].concat(f) })(pos0.offset, pos0.line, pos0.column, result0);
2080
+ }
2081
+ if (result0 === null) {
2082
+ pos = clone(pos0);
2083
+ }
2084
+ reportFailures--;
2085
+ if (reportFailures === 0 && result0 === null) {
1715
2086
  matchFailed("filters");
1716
2087
  }
1717
-
1718
- cache[cacheKey] = {
1719
- nextPos: pos,
1720
- result: result0
1721
- };
1722
2088
  return result0;
1723
2089
  }
1724
2090
 
1725
2091
  function parse_special() {
1726
- var cacheKey = "special" + '@' + pos;
1727
- var cachedResult = cache[cacheKey];
1728
- if (cachedResult) {
1729
- pos = cachedResult.nextPos;
1730
- return cachedResult.result;
1731
- }
1732
-
1733
- var savedReportMatchFailures = reportMatchFailures;
1734
- reportMatchFailures = false;
1735
- var savedPos0 = pos;
1736
- var result2 = parse_ld();
1737
- if (result2 !== null) {
1738
- if (input.substr(pos, 1) === "~") {
1739
- var result3 = "~";
1740
- pos += 1;
2092
+ var result0, result1, result2, result3;
2093
+ var pos0, pos1;
2094
+
2095
+ reportFailures++;
2096
+ pos0 = clone(pos);
2097
+ pos1 = clone(pos);
2098
+ result0 = parse_ld();
2099
+ if (result0 !== null) {
2100
+ if (input.charCodeAt(pos.offset) === 126) {
2101
+ result1 = "~";
2102
+ advance(pos, 1);
1741
2103
  } else {
1742
- var result3 = null;
1743
- if (reportMatchFailures) {
2104
+ result1 = null;
2105
+ if (reportFailures === 0) {
1744
2106
  matchFailed("\"~\"");
1745
2107
  }
1746
2108
  }
1747
- if (result3 !== null) {
1748
- var result4 = parse_key();
1749
- if (result4 !== null) {
1750
- var result5 = parse_rd();
1751
- if (result5 !== null) {
1752
- var result1 = [result2, result3, result4, result5];
2109
+ if (result1 !== null) {
2110
+ result2 = parse_key();
2111
+ if (result2 !== null) {
2112
+ result3 = parse_rd();
2113
+ if (result3 !== null) {
2114
+ result0 = [result0, result1, result2, result3];
1753
2115
  } else {
1754
- var result1 = null;
1755
- pos = savedPos0;
2116
+ result0 = null;
2117
+ pos = clone(pos1);
1756
2118
  }
1757
2119
  } else {
1758
- var result1 = null;
1759
- pos = savedPos0;
2120
+ result0 = null;
2121
+ pos = clone(pos1);
1760
2122
  }
1761
2123
  } else {
1762
- var result1 = null;
1763
- pos = savedPos0;
2124
+ result0 = null;
2125
+ pos = clone(pos1);
1764
2126
  }
1765
2127
  } else {
1766
- var result1 = null;
1767
- pos = savedPos0;
1768
- }
1769
- var result0 = result1 !== null
1770
- ? (function(k) { return ["special", k] })(result1[2])
1771
- : null;
1772
- reportMatchFailures = savedReportMatchFailures;
1773
- if (reportMatchFailures && result0 === null) {
2128
+ result0 = null;
2129
+ pos = clone(pos1);
2130
+ }
2131
+ if (result0 !== null) {
2132
+ result0 = (function(offset, line, column, k) { return ["special", k] })(pos0.offset, pos0.line, pos0.column, result0[2]);
2133
+ }
2134
+ if (result0 === null) {
2135
+ pos = clone(pos0);
2136
+ }
2137
+ reportFailures--;
2138
+ if (reportFailures === 0 && result0 === null) {
1774
2139
  matchFailed("special");
1775
2140
  }
1776
-
1777
- cache[cacheKey] = {
1778
- nextPos: pos,
1779
- result: result0
1780
- };
1781
2141
  return result0;
1782
2142
  }
1783
2143
 
1784
2144
  function parse_identifier() {
1785
- var cacheKey = "identifier" + '@' + pos;
1786
- var cachedResult = cache[cacheKey];
1787
- if (cachedResult) {
1788
- pos = cachedResult.nextPos;
1789
- return cachedResult.result;
1790
- }
1791
-
1792
- var savedReportMatchFailures = reportMatchFailures;
1793
- reportMatchFailures = false;
1794
- var result4 = parse_path();
1795
- var result3 = result4 !== null
1796
- ? (function(p) { return wrap(["path"].concat(p), cacheKey) })(result4)
1797
- : null;
1798
- if (result3 !== null) {
1799
- var result0 = result3;
1800
- } else {
1801
- var result2 = parse_key();
1802
- var result1 = result2 !== null
1803
- ? (function(k) { return wrap(["key", k], cacheKey) })(result2)
1804
- : null;
1805
- if (result1 !== null) {
1806
- var result0 = result1;
1807
- } else {
1808
- var result0 = null;;
1809
- };
2145
+ var result0;
2146
+ var pos0;
2147
+
2148
+ reportFailures++;
2149
+ pos0 = clone(pos);
2150
+ result0 = parse_path();
2151
+ if (result0 !== null) {
2152
+ result0 = (function(offset, line, column, p) { var arr = ["path"].concat(p); arr.text = p[1].join('.'); return arr; })(pos0.offset, pos0.line, pos0.column, result0);
2153
+ }
2154
+ if (result0 === null) {
2155
+ pos = clone(pos0);
2156
+ }
2157
+ if (result0 === null) {
2158
+ pos0 = clone(pos);
2159
+ result0 = parse_key();
2160
+ if (result0 !== null) {
2161
+ result0 = (function(offset, line, column, k) { var arr = ["key", k]; arr.text = k; return arr; })(pos0.offset, pos0.line, pos0.column, result0);
2162
+ }
2163
+ if (result0 === null) {
2164
+ pos = clone(pos0);
2165
+ }
1810
2166
  }
1811
- reportMatchFailures = savedReportMatchFailures;
1812
- if (reportMatchFailures && result0 === null) {
2167
+ reportFailures--;
2168
+ if (reportFailures === 0 && result0 === null) {
1813
2169
  matchFailed("identifier");
1814
2170
  }
1815
-
1816
- cache[cacheKey] = {
1817
- nextPos: pos,
1818
- result: result0
1819
- };
1820
2171
  return result0;
1821
2172
  }
1822
2173
 
1823
- function parse_path() {
1824
- var cacheKey = "path" + '@' + pos;
1825
- var cachedResult = cache[cacheKey];
1826
- if (cachedResult) {
1827
- pos = cachedResult.nextPos;
1828
- return cachedResult.result;
1829
- }
2174
+ function parse_number() {
2175
+ var result0;
2176
+ var pos0;
1830
2177
 
1831
- var savedReportMatchFailures = reportMatchFailures;
1832
- reportMatchFailures = false;
1833
- var savedPos0 = pos;
1834
- var result11 = parse_key();
1835
- var result5 = result11 !== null ? result11 : '';
1836
- if (result5 !== null) {
1837
- var savedPos1 = pos;
1838
- if (input.substr(pos, 1) === ".") {
1839
- var result9 = ".";
1840
- pos += 1;
2178
+ reportFailures++;
2179
+ pos0 = clone(pos);
2180
+ result0 = parse_frac();
2181
+ if (result0 === null) {
2182
+ result0 = parse_integer();
2183
+ }
2184
+ if (result0 !== null) {
2185
+ result0 = (function(offset, line, column, n) { return ['literal', n]; })(pos0.offset, pos0.line, pos0.column, result0);
2186
+ }
2187
+ if (result0 === null) {
2188
+ pos = clone(pos0);
2189
+ }
2190
+ reportFailures--;
2191
+ if (reportFailures === 0 && result0 === null) {
2192
+ matchFailed("number");
2193
+ }
2194
+ return result0;
2195
+ }
2196
+
2197
+ function parse_frac() {
2198
+ var result0, result1, result2, result3;
2199
+ var pos0, pos1;
2200
+
2201
+ reportFailures++;
2202
+ pos0 = clone(pos);
2203
+ pos1 = clone(pos);
2204
+ result0 = parse_integer();
2205
+ if (result0 !== null) {
2206
+ if (input.charCodeAt(pos.offset) === 46) {
2207
+ result1 = ".";
2208
+ advance(pos, 1);
1841
2209
  } else {
1842
- var result9 = null;
1843
- if (reportMatchFailures) {
2210
+ result1 = null;
2211
+ if (reportFailures === 0) {
1844
2212
  matchFailed("\".\"");
1845
2213
  }
1846
2214
  }
1847
- if (result9 !== null) {
1848
- var result10 = parse_key();
1849
- if (result10 !== null) {
1850
- var result8 = [result9, result10];
2215
+ if (result1 !== null) {
2216
+ result3 = parse_integer();
2217
+ if (result3 !== null) {
2218
+ result2 = [];
2219
+ while (result3 !== null) {
2220
+ result2.push(result3);
2221
+ result3 = parse_integer();
2222
+ }
2223
+ } else {
2224
+ result2 = null;
2225
+ }
2226
+ if (result2 !== null) {
2227
+ result0 = [result0, result1, result2];
1851
2228
  } else {
1852
- var result8 = null;
1853
- pos = savedPos1;
2229
+ result0 = null;
2230
+ pos = clone(pos1);
1854
2231
  }
1855
2232
  } else {
1856
- var result8 = null;
1857
- pos = savedPos1;
1858
- }
1859
- var result7 = result8 !== null
1860
- ? (function(k) {return k})(result8[1])
1861
- : null;
1862
- if (result7 !== null) {
1863
- var result6 = [];
1864
- while (result7 !== null) {
1865
- result6.push(result7);
1866
- var savedPos1 = pos;
1867
- if (input.substr(pos, 1) === ".") {
1868
- var result9 = ".";
1869
- pos += 1;
1870
- } else {
1871
- var result9 = null;
1872
- if (reportMatchFailures) {
1873
- matchFailed("\".\"");
1874
- }
2233
+ result0 = null;
2234
+ pos = clone(pos1);
2235
+ }
2236
+ } else {
2237
+ result0 = null;
2238
+ pos = clone(pos1);
2239
+ }
2240
+ if (result0 !== null) {
2241
+ result0 = (function(offset, line, column, l, r) { return parseFloat(l + "." + r.join('')); })(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
2242
+ }
2243
+ if (result0 === null) {
2244
+ pos = clone(pos0);
2245
+ }
2246
+ reportFailures--;
2247
+ if (reportFailures === 0 && result0 === null) {
2248
+ matchFailed("frac");
2249
+ }
2250
+ return result0;
2251
+ }
2252
+
2253
+ function parse_integer() {
2254
+ var result0, result1;
2255
+ var pos0;
2256
+
2257
+ reportFailures++;
2258
+ pos0 = clone(pos);
2259
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
2260
+ result1 = input.charAt(pos.offset);
2261
+ advance(pos, 1);
2262
+ } else {
2263
+ result1 = null;
2264
+ if (reportFailures === 0) {
2265
+ matchFailed("[0-9]");
2266
+ }
2267
+ }
2268
+ if (result1 !== null) {
2269
+ result0 = [];
2270
+ while (result1 !== null) {
2271
+ result0.push(result1);
2272
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
2273
+ result1 = input.charAt(pos.offset);
2274
+ advance(pos, 1);
2275
+ } else {
2276
+ result1 = null;
2277
+ if (reportFailures === 0) {
2278
+ matchFailed("[0-9]");
1875
2279
  }
1876
- if (result9 !== null) {
1877
- var result10 = parse_key();
1878
- if (result10 !== null) {
1879
- var result8 = [result9, result10];
1880
- } else {
1881
- var result8 = null;
1882
- pos = savedPos1;
1883
- }
1884
- } else {
1885
- var result8 = null;
1886
- pos = savedPos1;
2280
+ }
2281
+ }
2282
+ } else {
2283
+ result0 = null;
2284
+ }
2285
+ if (result0 !== null) {
2286
+ result0 = (function(offset, line, column, digits) { return parseInt(digits.join(""), 10); })(pos0.offset, pos0.line, pos0.column, result0);
2287
+ }
2288
+ if (result0 === null) {
2289
+ pos = clone(pos0);
2290
+ }
2291
+ reportFailures--;
2292
+ if (reportFailures === 0 && result0 === null) {
2293
+ matchFailed("integer");
2294
+ }
2295
+ return result0;
2296
+ }
2297
+
2298
+ function parse_path() {
2299
+ var result0, result1, result2;
2300
+ var pos0, pos1;
2301
+
2302
+ reportFailures++;
2303
+ pos0 = clone(pos);
2304
+ pos1 = clone(pos);
2305
+ result0 = parse_key();
2306
+ result0 = result0 !== null ? result0 : "";
2307
+ if (result0 !== null) {
2308
+ result2 = parse_array_part();
2309
+ if (result2 === null) {
2310
+ result2 = parse_array();
2311
+ }
2312
+ if (result2 !== null) {
2313
+ result1 = [];
2314
+ while (result2 !== null) {
2315
+ result1.push(result2);
2316
+ result2 = parse_array_part();
2317
+ if (result2 === null) {
2318
+ result2 = parse_array();
1887
2319
  }
1888
- var result7 = result8 !== null
1889
- ? (function(k) {return k})(result8[1])
1890
- : null;
1891
2320
  }
1892
2321
  } else {
1893
- var result6 = null;
2322
+ result1 = null;
1894
2323
  }
1895
- if (result6 !== null) {
1896
- var result4 = [result5, result6];
2324
+ if (result1 !== null) {
2325
+ result0 = [result0, result1];
1897
2326
  } else {
1898
- var result4 = null;
1899
- pos = savedPos0;
2327
+ result0 = null;
2328
+ pos = clone(pos1);
1900
2329
  }
1901
2330
  } else {
1902
- var result4 = null;
1903
- pos = savedPos0;
1904
- }
1905
- var result3 = result4 !== null
1906
- ? (function(k, d) {
1907
- if (k) { d.unshift(k); return [false, d]; }
1908
- return [true, d];
1909
- })(result4[0], result4[1])
1910
- : null;
1911
- if (result3 !== null) {
1912
- var result0 = result3;
1913
- } else {
1914
- if (input.substr(pos, 1) === ".") {
1915
- var result2 = ".";
1916
- pos += 1;
2331
+ result0 = null;
2332
+ pos = clone(pos1);
2333
+ }
2334
+ if (result0 !== null) {
2335
+ result0 = (function(offset, line, column, k, d) {
2336
+ d = d[0];
2337
+ if (k && d) {
2338
+ d.unshift(k);
2339
+ return [false, d];
2340
+ }
2341
+ return [true, d];
2342
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2343
+ }
2344
+ if (result0 === null) {
2345
+ pos = clone(pos0);
2346
+ }
2347
+ if (result0 === null) {
2348
+ pos0 = clone(pos);
2349
+ pos1 = clone(pos);
2350
+ if (input.charCodeAt(pos.offset) === 46) {
2351
+ result0 = ".";
2352
+ advance(pos, 1);
1917
2353
  } else {
1918
- var result2 = null;
1919
- if (reportMatchFailures) {
2354
+ result0 = null;
2355
+ if (reportFailures === 0) {
1920
2356
  matchFailed("\".\"");
1921
2357
  }
1922
2358
  }
1923
- var result1 = result2 !== null
1924
- ? (function() { return [true, []] })()
1925
- : null;
1926
- if (result1 !== null) {
1927
- var result0 = result1;
2359
+ if (result0 !== null) {
2360
+ result1 = [];
2361
+ result2 = parse_array_part();
2362
+ if (result2 === null) {
2363
+ result2 = parse_array();
2364
+ }
2365
+ while (result2 !== null) {
2366
+ result1.push(result2);
2367
+ result2 = parse_array_part();
2368
+ if (result2 === null) {
2369
+ result2 = parse_array();
2370
+ }
2371
+ }
2372
+ if (result1 !== null) {
2373
+ result0 = [result0, result1];
2374
+ } else {
2375
+ result0 = null;
2376
+ pos = clone(pos1);
2377
+ }
1928
2378
  } else {
1929
- var result0 = null;;
1930
- };
2379
+ result0 = null;
2380
+ pos = clone(pos1);
2381
+ }
2382
+ if (result0 !== null) {
2383
+ result0 = (function(offset, line, column, d) {
2384
+ if (d.length > 0) {
2385
+ return [true, d[0]];
2386
+ }
2387
+ return [true, []]
2388
+ })(pos0.offset, pos0.line, pos0.column, result0[1]);
2389
+ }
2390
+ if (result0 === null) {
2391
+ pos = clone(pos0);
2392
+ }
1931
2393
  }
1932
- reportMatchFailures = savedReportMatchFailures;
1933
- if (reportMatchFailures && result0 === null) {
2394
+ reportFailures--;
2395
+ if (reportFailures === 0 && result0 === null) {
1934
2396
  matchFailed("path");
1935
2397
  }
1936
-
1937
- cache[cacheKey] = {
1938
- nextPos: pos,
1939
- result: result0
1940
- };
1941
2398
  return result0;
1942
2399
  }
1943
2400
 
1944
2401
  function parse_key() {
1945
- var cacheKey = "key" + '@' + pos;
1946
- var cachedResult = cache[cacheKey];
1947
- if (cachedResult) {
1948
- pos = cachedResult.nextPos;
1949
- return cachedResult.result;
1950
- }
1951
-
1952
- var savedReportMatchFailures = reportMatchFailures;
1953
- reportMatchFailures = false;
1954
- var savedPos0 = pos;
1955
- if (input.substr(pos).match(/^[a-zA-Z_$]/) !== null) {
1956
- var result2 = input.charAt(pos);
1957
- pos++;
2402
+ var result0, result1, result2;
2403
+ var pos0, pos1;
2404
+
2405
+ reportFailures++;
2406
+ pos0 = clone(pos);
2407
+ pos1 = clone(pos);
2408
+ if (/^[a-zA-Z_$]/.test(input.charAt(pos.offset))) {
2409
+ result0 = input.charAt(pos.offset);
2410
+ advance(pos, 1);
1958
2411
  } else {
1959
- var result2 = null;
1960
- if (reportMatchFailures) {
2412
+ result0 = null;
2413
+ if (reportFailures === 0) {
1961
2414
  matchFailed("[a-zA-Z_$]");
1962
2415
  }
1963
2416
  }
1964
- if (result2 !== null) {
1965
- var result3 = [];
1966
- if (input.substr(pos).match(/^[0-9a-zA-Z_$]/) !== null) {
1967
- var result4 = input.charAt(pos);
1968
- pos++;
2417
+ if (result0 !== null) {
2418
+ result1 = [];
2419
+ if (/^[0-9a-zA-Z_$\-]/.test(input.charAt(pos.offset))) {
2420
+ result2 = input.charAt(pos.offset);
2421
+ advance(pos, 1);
1969
2422
  } else {
1970
- var result4 = null;
1971
- if (reportMatchFailures) {
1972
- matchFailed("[0-9a-zA-Z_$]");
2423
+ result2 = null;
2424
+ if (reportFailures === 0) {
2425
+ matchFailed("[0-9a-zA-Z_$\\-]");
1973
2426
  }
1974
2427
  }
1975
- while (result4 !== null) {
1976
- result3.push(result4);
1977
- if (input.substr(pos).match(/^[0-9a-zA-Z_$]/) !== null) {
1978
- var result4 = input.charAt(pos);
1979
- pos++;
2428
+ while (result2 !== null) {
2429
+ result1.push(result2);
2430
+ if (/^[0-9a-zA-Z_$\-]/.test(input.charAt(pos.offset))) {
2431
+ result2 = input.charAt(pos.offset);
2432
+ advance(pos, 1);
1980
2433
  } else {
1981
- var result4 = null;
1982
- if (reportMatchFailures) {
1983
- matchFailed("[0-9a-zA-Z_$]");
2434
+ result2 = null;
2435
+ if (reportFailures === 0) {
2436
+ matchFailed("[0-9a-zA-Z_$\\-]");
1984
2437
  }
1985
2438
  }
1986
2439
  }
1987
- if (result3 !== null) {
1988
- var result1 = [result2, result3];
2440
+ if (result1 !== null) {
2441
+ result0 = [result0, result1];
1989
2442
  } else {
1990
- var result1 = null;
1991
- pos = savedPos0;
2443
+ result0 = null;
2444
+ pos = clone(pos1);
1992
2445
  }
1993
2446
  } else {
1994
- var result1 = null;
1995
- pos = savedPos0;
1996
- }
1997
- var result0 = result1 !== null
1998
- ? (function(h, t) { return h + t.join('') })(result1[0], result1[1])
1999
- : null;
2000
- reportMatchFailures = savedReportMatchFailures;
2001
- if (reportMatchFailures && result0 === null) {
2447
+ result0 = null;
2448
+ pos = clone(pos1);
2449
+ }
2450
+ if (result0 !== null) {
2451
+ result0 = (function(offset, line, column, h, t) { return h + t.join('') })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2452
+ }
2453
+ if (result0 === null) {
2454
+ pos = clone(pos0);
2455
+ }
2456
+ reportFailures--;
2457
+ if (reportFailures === 0 && result0 === null) {
2002
2458
  matchFailed("key");
2003
2459
  }
2004
-
2005
- cache[cacheKey] = {
2006
- nextPos: pos,
2007
- result: result0
2008
- };
2009
2460
  return result0;
2010
2461
  }
2011
2462
 
2012
- function parse_inline() {
2013
- var cacheKey = "inline" + '@' + pos;
2014
- var cachedResult = cache[cacheKey];
2015
- if (cachedResult) {
2016
- pos = cachedResult.nextPos;
2017
- return cachedResult.result;
2463
+ function parse_array() {
2464
+ var result0, result1, result2;
2465
+ var pos0, pos1, pos2, pos3;
2466
+
2467
+ reportFailures++;
2468
+ pos0 = clone(pos);
2469
+ pos1 = clone(pos);
2470
+ pos2 = clone(pos);
2471
+ pos3 = clone(pos);
2472
+ if (input.charCodeAt(pos.offset) === 91) {
2473
+ result0 = "[";
2474
+ advance(pos, 1);
2475
+ } else {
2476
+ result0 = null;
2477
+ if (reportFailures === 0) {
2478
+ matchFailed("\"[\"");
2479
+ }
2018
2480
  }
2019
-
2020
- var savedReportMatchFailures = reportMatchFailures;
2021
- reportMatchFailures = false;
2022
- var savedPos2 = pos;
2023
- if (input.substr(pos, 1) === "\"") {
2024
- var result14 = "\"";
2025
- pos += 1;
2481
+ if (result0 !== null) {
2482
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
2483
+ result2 = input.charAt(pos.offset);
2484
+ advance(pos, 1);
2485
+ } else {
2486
+ result2 = null;
2487
+ if (reportFailures === 0) {
2488
+ matchFailed("[0-9]");
2489
+ }
2490
+ }
2491
+ if (result2 !== null) {
2492
+ result1 = [];
2493
+ while (result2 !== null) {
2494
+ result1.push(result2);
2495
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
2496
+ result2 = input.charAt(pos.offset);
2497
+ advance(pos, 1);
2498
+ } else {
2499
+ result2 = null;
2500
+ if (reportFailures === 0) {
2501
+ matchFailed("[0-9]");
2502
+ }
2503
+ }
2504
+ }
2505
+ } else {
2506
+ result1 = null;
2507
+ }
2508
+ if (result1 !== null) {
2509
+ if (input.charCodeAt(pos.offset) === 93) {
2510
+ result2 = "]";
2511
+ advance(pos, 1);
2512
+ } else {
2513
+ result2 = null;
2514
+ if (reportFailures === 0) {
2515
+ matchFailed("\"]\"");
2516
+ }
2517
+ }
2518
+ if (result2 !== null) {
2519
+ result0 = [result0, result1, result2];
2520
+ } else {
2521
+ result0 = null;
2522
+ pos = clone(pos3);
2523
+ }
2524
+ } else {
2525
+ result0 = null;
2526
+ pos = clone(pos3);
2527
+ }
2528
+ } else {
2529
+ result0 = null;
2530
+ pos = clone(pos3);
2531
+ }
2532
+ if (result0 !== null) {
2533
+ result0 = (function(offset, line, column, a) {return a.join('')})(pos2.offset, pos2.line, pos2.column, result0[1]);
2534
+ }
2535
+ if (result0 === null) {
2536
+ pos = clone(pos2);
2537
+ }
2538
+ if (result0 !== null) {
2539
+ result1 = parse_array_part();
2540
+ result1 = result1 !== null ? result1 : "";
2541
+ if (result1 !== null) {
2542
+ result0 = [result0, result1];
2543
+ } else {
2544
+ result0 = null;
2545
+ pos = clone(pos1);
2546
+ }
2547
+ } else {
2548
+ result0 = null;
2549
+ pos = clone(pos1);
2550
+ }
2551
+ if (result0 !== null) {
2552
+ result0 = (function(offset, line, column, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2553
+ }
2554
+ if (result0 === null) {
2555
+ pos = clone(pos0);
2556
+ }
2557
+ reportFailures--;
2558
+ if (reportFailures === 0 && result0 === null) {
2559
+ matchFailed("array");
2560
+ }
2561
+ return result0;
2562
+ }
2563
+
2564
+ function parse_array_part() {
2565
+ var result0, result1, result2;
2566
+ var pos0, pos1, pos2, pos3;
2567
+
2568
+ reportFailures++;
2569
+ pos0 = clone(pos);
2570
+ pos1 = clone(pos);
2571
+ pos2 = clone(pos);
2572
+ pos3 = clone(pos);
2573
+ if (input.charCodeAt(pos.offset) === 46) {
2574
+ result1 = ".";
2575
+ advance(pos, 1);
2576
+ } else {
2577
+ result1 = null;
2578
+ if (reportFailures === 0) {
2579
+ matchFailed("\".\"");
2580
+ }
2581
+ }
2582
+ if (result1 !== null) {
2583
+ result2 = parse_key();
2584
+ if (result2 !== null) {
2585
+ result1 = [result1, result2];
2586
+ } else {
2587
+ result1 = null;
2588
+ pos = clone(pos3);
2589
+ }
2590
+ } else {
2591
+ result1 = null;
2592
+ pos = clone(pos3);
2593
+ }
2594
+ if (result1 !== null) {
2595
+ result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]);
2596
+ }
2597
+ if (result1 === null) {
2598
+ pos = clone(pos2);
2599
+ }
2600
+ if (result1 !== null) {
2601
+ result0 = [];
2602
+ while (result1 !== null) {
2603
+ result0.push(result1);
2604
+ pos2 = clone(pos);
2605
+ pos3 = clone(pos);
2606
+ if (input.charCodeAt(pos.offset) === 46) {
2607
+ result1 = ".";
2608
+ advance(pos, 1);
2609
+ } else {
2610
+ result1 = null;
2611
+ if (reportFailures === 0) {
2612
+ matchFailed("\".\"");
2613
+ }
2614
+ }
2615
+ if (result1 !== null) {
2616
+ result2 = parse_key();
2617
+ if (result2 !== null) {
2618
+ result1 = [result1, result2];
2619
+ } else {
2620
+ result1 = null;
2621
+ pos = clone(pos3);
2622
+ }
2623
+ } else {
2624
+ result1 = null;
2625
+ pos = clone(pos3);
2626
+ }
2627
+ if (result1 !== null) {
2628
+ result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]);
2629
+ }
2630
+ if (result1 === null) {
2631
+ pos = clone(pos2);
2632
+ }
2633
+ }
2026
2634
  } else {
2027
- var result14 = null;
2028
- if (reportMatchFailures) {
2635
+ result0 = null;
2636
+ }
2637
+ if (result0 !== null) {
2638
+ result1 = parse_array();
2639
+ result1 = result1 !== null ? result1 : "";
2640
+ if (result1 !== null) {
2641
+ result0 = [result0, result1];
2642
+ } else {
2643
+ result0 = null;
2644
+ pos = clone(pos1);
2645
+ }
2646
+ } else {
2647
+ result0 = null;
2648
+ pos = clone(pos1);
2649
+ }
2650
+ if (result0 !== null) {
2651
+ result0 = (function(offset, line, column, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2652
+ }
2653
+ if (result0 === null) {
2654
+ pos = clone(pos0);
2655
+ }
2656
+ reportFailures--;
2657
+ if (reportFailures === 0 && result0 === null) {
2658
+ matchFailed("array_part");
2659
+ }
2660
+ return result0;
2661
+ }
2662
+
2663
+ function parse_inline() {
2664
+ var result0, result1, result2;
2665
+ var pos0, pos1;
2666
+
2667
+ reportFailures++;
2668
+ pos0 = clone(pos);
2669
+ pos1 = clone(pos);
2670
+ if (input.charCodeAt(pos.offset) === 34) {
2671
+ result0 = "\"";
2672
+ advance(pos, 1);
2673
+ } else {
2674
+ result0 = null;
2675
+ if (reportFailures === 0) {
2029
2676
  matchFailed("\"\\\"\"");
2030
2677
  }
2031
2678
  }
2032
- if (result14 !== null) {
2033
- if (input.substr(pos, 1) === "\"") {
2034
- var result15 = "\"";
2035
- pos += 1;
2679
+ if (result0 !== null) {
2680
+ if (input.charCodeAt(pos.offset) === 34) {
2681
+ result1 = "\"";
2682
+ advance(pos, 1);
2036
2683
  } else {
2037
- var result15 = null;
2038
- if (reportMatchFailures) {
2684
+ result1 = null;
2685
+ if (reportFailures === 0) {
2039
2686
  matchFailed("\"\\\"\"");
2040
2687
  }
2041
2688
  }
2042
- if (result15 !== null) {
2043
- var result13 = [result14, result15];
2689
+ if (result1 !== null) {
2690
+ result0 = [result0, result1];
2044
2691
  } else {
2045
- var result13 = null;
2046
- pos = savedPos2;
2692
+ result0 = null;
2693
+ pos = clone(pos1);
2047
2694
  }
2048
2695
  } else {
2049
- var result13 = null;
2050
- pos = savedPos2;
2051
- }
2052
- var result12 = result13 !== null
2053
- ? (function() { return ["literal", ""] })()
2054
- : null;
2055
- if (result12 !== null) {
2056
- var result0 = result12;
2057
- } else {
2058
- var savedPos1 = pos;
2059
- if (input.substr(pos, 1) === "\"") {
2060
- var result9 = "\"";
2061
- pos += 1;
2696
+ result0 = null;
2697
+ pos = clone(pos1);
2698
+ }
2699
+ if (result0 !== null) {
2700
+ result0 = (function(offset, line, column) { return ["literal", ""] })(pos0.offset, pos0.line, pos0.column);
2701
+ }
2702
+ if (result0 === null) {
2703
+ pos = clone(pos0);
2704
+ }
2705
+ if (result0 === null) {
2706
+ pos0 = clone(pos);
2707
+ pos1 = clone(pos);
2708
+ if (input.charCodeAt(pos.offset) === 34) {
2709
+ result0 = "\"";
2710
+ advance(pos, 1);
2062
2711
  } else {
2063
- var result9 = null;
2064
- if (reportMatchFailures) {
2712
+ result0 = null;
2713
+ if (reportFailures === 0) {
2065
2714
  matchFailed("\"\\\"\"");
2066
2715
  }
2067
2716
  }
2068
- if (result9 !== null) {
2069
- var result10 = parse_literal();
2070
- if (result10 !== null) {
2071
- if (input.substr(pos, 1) === "\"") {
2072
- var result11 = "\"";
2073
- pos += 1;
2717
+ if (result0 !== null) {
2718
+ result1 = parse_literal();
2719
+ if (result1 !== null) {
2720
+ if (input.charCodeAt(pos.offset) === 34) {
2721
+ result2 = "\"";
2722
+ advance(pos, 1);
2074
2723
  } else {
2075
- var result11 = null;
2076
- if (reportMatchFailures) {
2724
+ result2 = null;
2725
+ if (reportFailures === 0) {
2077
2726
  matchFailed("\"\\\"\"");
2078
2727
  }
2079
2728
  }
2080
- if (result11 !== null) {
2081
- var result8 = [result9, result10, result11];
2729
+ if (result2 !== null) {
2730
+ result0 = [result0, result1, result2];
2082
2731
  } else {
2083
- var result8 = null;
2084
- pos = savedPos1;
2732
+ result0 = null;
2733
+ pos = clone(pos1);
2085
2734
  }
2086
2735
  } else {
2087
- var result8 = null;
2088
- pos = savedPos1;
2736
+ result0 = null;
2737
+ pos = clone(pos1);
2089
2738
  }
2090
2739
  } else {
2091
- var result8 = null;
2092
- pos = savedPos1;
2093
- }
2094
- var result7 = result8 !== null
2095
- ? (function(l) { return ["literal", l] })(result8[1])
2096
- : null;
2097
- if (result7 !== null) {
2098
- var result0 = result7;
2099
- } else {
2100
- var savedPos0 = pos;
2101
- if (input.substr(pos, 1) === "\"") {
2102
- var result3 = "\"";
2103
- pos += 1;
2740
+ result0 = null;
2741
+ pos = clone(pos1);
2742
+ }
2743
+ if (result0 !== null) {
2744
+ result0 = (function(offset, line, column, l) { return ["literal", l] })(pos0.offset, pos0.line, pos0.column, result0[1]);
2745
+ }
2746
+ if (result0 === null) {
2747
+ pos = clone(pos0);
2748
+ }
2749
+ if (result0 === null) {
2750
+ pos0 = clone(pos);
2751
+ pos1 = clone(pos);
2752
+ if (input.charCodeAt(pos.offset) === 34) {
2753
+ result0 = "\"";
2754
+ advance(pos, 1);
2104
2755
  } else {
2105
- var result3 = null;
2106
- if (reportMatchFailures) {
2756
+ result0 = null;
2757
+ if (reportFailures === 0) {
2107
2758
  matchFailed("\"\\\"\"");
2108
2759
  }
2109
2760
  }
2110
- if (result3 !== null) {
2111
- var result6 = parse_inline_part();
2112
- if (result6 !== null) {
2113
- var result4 = [];
2114
- while (result6 !== null) {
2115
- result4.push(result6);
2116
- var result6 = parse_inline_part();
2761
+ if (result0 !== null) {
2762
+ result2 = parse_inline_part();
2763
+ if (result2 !== null) {
2764
+ result1 = [];
2765
+ while (result2 !== null) {
2766
+ result1.push(result2);
2767
+ result2 = parse_inline_part();
2117
2768
  }
2118
2769
  } else {
2119
- var result4 = null;
2770
+ result1 = null;
2120
2771
  }
2121
- if (result4 !== null) {
2122
- if (input.substr(pos, 1) === "\"") {
2123
- var result5 = "\"";
2124
- pos += 1;
2772
+ if (result1 !== null) {
2773
+ if (input.charCodeAt(pos.offset) === 34) {
2774
+ result2 = "\"";
2775
+ advance(pos, 1);
2125
2776
  } else {
2126
- var result5 = null;
2127
- if (reportMatchFailures) {
2777
+ result2 = null;
2778
+ if (reportFailures === 0) {
2128
2779
  matchFailed("\"\\\"\"");
2129
2780
  }
2130
2781
  }
2131
- if (result5 !== null) {
2132
- var result2 = [result3, result4, result5];
2782
+ if (result2 !== null) {
2783
+ result0 = [result0, result1, result2];
2133
2784
  } else {
2134
- var result2 = null;
2135
- pos = savedPos0;
2785
+ result0 = null;
2786
+ pos = clone(pos1);
2136
2787
  }
2137
2788
  } else {
2138
- var result2 = null;
2139
- pos = savedPos0;
2789
+ result0 = null;
2790
+ pos = clone(pos1);
2140
2791
  }
2141
2792
  } else {
2142
- var result2 = null;
2143
- pos = savedPos0;
2793
+ result0 = null;
2794
+ pos = clone(pos1);
2144
2795
  }
2145
- var result1 = result2 !== null
2146
- ? (function(p) { return ["body"].concat(p) })(result2[1])
2147
- : null;
2148
- if (result1 !== null) {
2149
- var result0 = result1;
2150
- } else {
2151
- var result0 = null;;
2152
- };
2153
- };
2796
+ if (result0 !== null) {
2797
+ result0 = (function(offset, line, column, p) { return ["body"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0[1]);
2798
+ }
2799
+ if (result0 === null) {
2800
+ pos = clone(pos0);
2801
+ }
2802
+ }
2154
2803
  }
2155
- reportMatchFailures = savedReportMatchFailures;
2156
- if (reportMatchFailures && result0 === null) {
2804
+ reportFailures--;
2805
+ if (reportFailures === 0 && result0 === null) {
2157
2806
  matchFailed("inline");
2158
2807
  }
2159
-
2160
- cache[cacheKey] = {
2161
- nextPos: pos,
2162
- result: result0
2163
- };
2164
2808
  return result0;
2165
2809
  }
2166
2810
 
2167
2811
  function parse_inline_part() {
2168
- var cacheKey = "inline_part" + '@' + pos;
2169
- var cachedResult = cache[cacheKey];
2170
- if (cachedResult) {
2171
- pos = cachedResult.nextPos;
2172
- return cachedResult.result;
2173
- }
2174
-
2175
-
2176
- var result4 = parse_special();
2177
- if (result4 !== null) {
2178
- var result0 = result4;
2179
- } else {
2180
- var result3 = parse_reference();
2181
- if (result3 !== null) {
2182
- var result0 = result3;
2183
- } else {
2184
- var result2 = parse_literal();
2185
- var result1 = result2 !== null
2186
- ? (function(l) { return ["buffer", l] })(result2)
2187
- : null;
2188
- if (result1 !== null) {
2189
- var result0 = result1;
2190
- } else {
2191
- var result0 = null;;
2192
- };
2193
- };
2812
+ var result0;
2813
+ var pos0;
2814
+
2815
+ result0 = parse_special();
2816
+ if (result0 === null) {
2817
+ result0 = parse_reference();
2818
+ if (result0 === null) {
2819
+ pos0 = clone(pos);
2820
+ result0 = parse_literal();
2821
+ if (result0 !== null) {
2822
+ result0 = (function(offset, line, column, l) { return ["buffer", l] })(pos0.offset, pos0.line, pos0.column, result0);
2823
+ }
2824
+ if (result0 === null) {
2825
+ pos = clone(pos0);
2826
+ }
2827
+ }
2194
2828
  }
2195
-
2196
-
2197
-
2198
- cache[cacheKey] = {
2199
- nextPos: pos,
2200
- result: result0
2201
- };
2202
2829
  return result0;
2203
2830
  }
2204
2831
 
2205
2832
  function parse_buffer() {
2206
- var cacheKey = "buffer" + '@' + pos;
2207
- var cachedResult = cache[cacheKey];
2208
- if (cachedResult) {
2209
- pos = cachedResult.nextPos;
2210
- return cachedResult.result;
2211
- }
2212
-
2213
- var savedReportMatchFailures = reportMatchFailures;
2214
- reportMatchFailures = false;
2215
- var savedPos4 = pos;
2216
- var result14 = parse_eol();
2217
- if (result14 !== null) {
2218
- var result15 = [];
2219
- var result16 = parse_ws();
2220
- while (result16 !== null) {
2221
- result15.push(result16);
2222
- var result16 = parse_ws();
2223
- }
2224
- if (result15 !== null) {
2225
- var result13 = [result14, result15];
2833
+ var result0, result1, result2, result3, result4;
2834
+ var pos0, pos1, pos2, pos3;
2835
+
2836
+ reportFailures++;
2837
+ pos0 = clone(pos);
2838
+ pos1 = clone(pos);
2839
+ result0 = parse_eol();
2840
+ if (result0 !== null) {
2841
+ result1 = [];
2842
+ result2 = parse_ws();
2843
+ while (result2 !== null) {
2844
+ result1.push(result2);
2845
+ result2 = parse_ws();
2846
+ }
2847
+ if (result1 !== null) {
2848
+ result0 = [result0, result1];
2226
2849
  } else {
2227
- var result13 = null;
2228
- pos = savedPos4;
2850
+ result0 = null;
2851
+ pos = clone(pos1);
2229
2852
  }
2230
2853
  } else {
2231
- var result13 = null;
2232
- pos = savedPos4;
2233
- }
2234
- var result12 = result13 !== null
2235
- ? (function(e, w) { return ["format", e, w.join('')] })(result13[0], result13[1])
2236
- : null;
2237
- if (result12 !== null) {
2238
- var result0 = result12;
2239
- } else {
2240
- var savedPos0 = pos;
2241
- var savedPos3 = pos;
2242
- var savedReportMatchFailuresVar2 = reportMatchFailures;
2243
- reportMatchFailures = false;
2244
- var result11 = parse_tag();
2245
- reportMatchFailures = savedReportMatchFailuresVar2;
2246
- if (result11 === null) {
2247
- var result5 = '';
2854
+ result0 = null;
2855
+ pos = clone(pos1);
2856
+ }
2857
+ if (result0 !== null) {
2858
+ result0 = (function(offset, line, column, e, w) { return ["format", e, w.join('')] })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2859
+ }
2860
+ if (result0 === null) {
2861
+ pos = clone(pos0);
2862
+ }
2863
+ if (result0 === null) {
2864
+ pos0 = clone(pos);
2865
+ pos1 = clone(pos);
2866
+ pos2 = clone(pos);
2867
+ pos3 = clone(pos);
2868
+ reportFailures++;
2869
+ result1 = parse_tag();
2870
+ reportFailures--;
2871
+ if (result1 === null) {
2872
+ result1 = "";
2248
2873
  } else {
2249
- var result5 = null;
2250
- pos = savedPos3;
2251
- }
2252
- if (result5 !== null) {
2253
- var savedPos2 = pos;
2254
- var savedReportMatchFailuresVar1 = reportMatchFailures;
2255
- reportMatchFailures = false;
2256
- var result10 = parse_eol();
2257
- reportMatchFailures = savedReportMatchFailuresVar1;
2258
- if (result10 === null) {
2259
- var result6 = '';
2874
+ result1 = null;
2875
+ pos = clone(pos3);
2876
+ }
2877
+ if (result1 !== null) {
2878
+ pos3 = clone(pos);
2879
+ reportFailures++;
2880
+ result2 = parse_eol();
2881
+ reportFailures--;
2882
+ if (result2 === null) {
2883
+ result2 = "";
2260
2884
  } else {
2261
- var result6 = null;
2262
- pos = savedPos2;
2263
- }
2264
- if (result6 !== null) {
2265
- var savedPos1 = pos;
2266
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2267
- reportMatchFailures = false;
2268
- var result9 = parse_comment();
2269
- reportMatchFailures = savedReportMatchFailuresVar0;
2270
- if (result9 === null) {
2271
- var result7 = '';
2885
+ result2 = null;
2886
+ pos = clone(pos3);
2887
+ }
2888
+ if (result2 !== null) {
2889
+ pos3 = clone(pos);
2890
+ reportFailures++;
2891
+ result3 = parse_comment();
2892
+ reportFailures--;
2893
+ if (result3 === null) {
2894
+ result3 = "";
2272
2895
  } else {
2273
- var result7 = null;
2274
- pos = savedPos1;
2896
+ result3 = null;
2897
+ pos = clone(pos3);
2275
2898
  }
2276
- if (result7 !== null) {
2277
- if (input.length > pos) {
2278
- var result8 = input.charAt(pos);
2279
- pos++;
2899
+ if (result3 !== null) {
2900
+ if (input.length > pos.offset) {
2901
+ result4 = input.charAt(pos.offset);
2902
+ advance(pos, 1);
2280
2903
  } else {
2281
- var result8 = null;
2282
- if (reportMatchFailures) {
2283
- matchFailed('any character');
2904
+ result4 = null;
2905
+ if (reportFailures === 0) {
2906
+ matchFailed("any character");
2284
2907
  }
2285
2908
  }
2286
- if (result8 !== null) {
2287
- var result4 = [result5, result6, result7, result8];
2909
+ if (result4 !== null) {
2910
+ result1 = [result1, result2, result3, result4];
2288
2911
  } else {
2289
- var result4 = null;
2290
- pos = savedPos0;
2912
+ result1 = null;
2913
+ pos = clone(pos2);
2291
2914
  }
2292
2915
  } else {
2293
- var result4 = null;
2294
- pos = savedPos0;
2916
+ result1 = null;
2917
+ pos = clone(pos2);
2295
2918
  }
2296
2919
  } else {
2297
- var result4 = null;
2298
- pos = savedPos0;
2920
+ result1 = null;
2921
+ pos = clone(pos2);
2299
2922
  }
2300
2923
  } else {
2301
- var result4 = null;
2302
- pos = savedPos0;
2303
- }
2304
- var result3 = result4 !== null
2305
- ? (function(c) {return c})(result4[3])
2306
- : null;
2307
- if (result3 !== null) {
2308
- var result2 = [];
2309
- while (result3 !== null) {
2310
- result2.push(result3);
2311
- var savedPos0 = pos;
2312
- var savedPos3 = pos;
2313
- var savedReportMatchFailuresVar2 = reportMatchFailures;
2314
- reportMatchFailures = false;
2315
- var result11 = parse_tag();
2316
- reportMatchFailures = savedReportMatchFailuresVar2;
2317
- if (result11 === null) {
2318
- var result5 = '';
2924
+ result1 = null;
2925
+ pos = clone(pos2);
2926
+ }
2927
+ if (result1 !== null) {
2928
+ result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[3]);
2929
+ }
2930
+ if (result1 === null) {
2931
+ pos = clone(pos1);
2932
+ }
2933
+ if (result1 !== null) {
2934
+ result0 = [];
2935
+ while (result1 !== null) {
2936
+ result0.push(result1);
2937
+ pos1 = clone(pos);
2938
+ pos2 = clone(pos);
2939
+ pos3 = clone(pos);
2940
+ reportFailures++;
2941
+ result1 = parse_tag();
2942
+ reportFailures--;
2943
+ if (result1 === null) {
2944
+ result1 = "";
2319
2945
  } else {
2320
- var result5 = null;
2321
- pos = savedPos3;
2946
+ result1 = null;
2947
+ pos = clone(pos3);
2322
2948
  }
2323
- if (result5 !== null) {
2324
- var savedPos2 = pos;
2325
- var savedReportMatchFailuresVar1 = reportMatchFailures;
2326
- reportMatchFailures = false;
2327
- var result10 = parse_eol();
2328
- reportMatchFailures = savedReportMatchFailuresVar1;
2329
- if (result10 === null) {
2330
- var result6 = '';
2949
+ if (result1 !== null) {
2950
+ pos3 = clone(pos);
2951
+ reportFailures++;
2952
+ result2 = parse_eol();
2953
+ reportFailures--;
2954
+ if (result2 === null) {
2955
+ result2 = "";
2331
2956
  } else {
2332
- var result6 = null;
2333
- pos = savedPos2;
2957
+ result2 = null;
2958
+ pos = clone(pos3);
2334
2959
  }
2335
- if (result6 !== null) {
2336
- var savedPos1 = pos;
2337
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2338
- reportMatchFailures = false;
2339
- var result9 = parse_comment();
2340
- reportMatchFailures = savedReportMatchFailuresVar0;
2341
- if (result9 === null) {
2342
- var result7 = '';
2960
+ if (result2 !== null) {
2961
+ pos3 = clone(pos);
2962
+ reportFailures++;
2963
+ result3 = parse_comment();
2964
+ reportFailures--;
2965
+ if (result3 === null) {
2966
+ result3 = "";
2343
2967
  } else {
2344
- var result7 = null;
2345
- pos = savedPos1;
2968
+ result3 = null;
2969
+ pos = clone(pos3);
2346
2970
  }
2347
- if (result7 !== null) {
2348
- if (input.length > pos) {
2349
- var result8 = input.charAt(pos);
2350
- pos++;
2971
+ if (result3 !== null) {
2972
+ if (input.length > pos.offset) {
2973
+ result4 = input.charAt(pos.offset);
2974
+ advance(pos, 1);
2351
2975
  } else {
2352
- var result8 = null;
2353
- if (reportMatchFailures) {
2354
- matchFailed('any character');
2976
+ result4 = null;
2977
+ if (reportFailures === 0) {
2978
+ matchFailed("any character");
2355
2979
  }
2356
2980
  }
2357
- if (result8 !== null) {
2358
- var result4 = [result5, result6, result7, result8];
2981
+ if (result4 !== null) {
2982
+ result1 = [result1, result2, result3, result4];
2359
2983
  } else {
2360
- var result4 = null;
2361
- pos = savedPos0;
2984
+ result1 = null;
2985
+ pos = clone(pos2);
2362
2986
  }
2363
2987
  } else {
2364
- var result4 = null;
2365
- pos = savedPos0;
2988
+ result1 = null;
2989
+ pos = clone(pos2);
2366
2990
  }
2367
2991
  } else {
2368
- var result4 = null;
2369
- pos = savedPos0;
2992
+ result1 = null;
2993
+ pos = clone(pos2);
2370
2994
  }
2371
2995
  } else {
2372
- var result4 = null;
2373
- pos = savedPos0;
2996
+ result1 = null;
2997
+ pos = clone(pos2);
2998
+ }
2999
+ if (result1 !== null) {
3000
+ result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[3]);
3001
+ }
3002
+ if (result1 === null) {
3003
+ pos = clone(pos1);
2374
3004
  }
2375
- var result3 = result4 !== null
2376
- ? (function(c) {return c})(result4[3])
2377
- : null;
2378
3005
  }
2379
3006
  } else {
2380
- var result2 = null;
3007
+ result0 = null;
3008
+ }
3009
+ if (result0 !== null) {
3010
+ result0 = (function(offset, line, column, b) { return ["buffer", b.join('')] })(pos0.offset, pos0.line, pos0.column, result0);
3011
+ }
3012
+ if (result0 === null) {
3013
+ pos = clone(pos0);
2381
3014
  }
2382
- var result1 = result2 !== null
2383
- ? (function(b) { return ["buffer", b.join('')] })(result2)
2384
- : null;
2385
- if (result1 !== null) {
2386
- var result0 = result1;
2387
- } else {
2388
- var result0 = null;;
2389
- };
2390
3015
  }
2391
- reportMatchFailures = savedReportMatchFailures;
2392
- if (reportMatchFailures && result0 === null) {
3016
+ reportFailures--;
3017
+ if (reportFailures === 0 && result0 === null) {
2393
3018
  matchFailed("buffer");
2394
3019
  }
2395
-
2396
- cache[cacheKey] = {
2397
- nextPos: pos,
2398
- result: result0
2399
- };
2400
3020
  return result0;
2401
3021
  }
2402
3022
 
2403
3023
  function parse_literal() {
2404
- var cacheKey = "literal" + '@' + pos;
2405
- var cachedResult = cache[cacheKey];
2406
- if (cachedResult) {
2407
- pos = cachedResult.nextPos;
2408
- return cachedResult.result;
2409
- }
2410
-
2411
- var savedReportMatchFailures = reportMatchFailures;
2412
- reportMatchFailures = false;
2413
- var savedPos0 = pos;
2414
- var savedPos2 = pos;
2415
- var savedReportMatchFailuresVar1 = reportMatchFailures;
2416
- reportMatchFailures = false;
2417
- var result10 = parse_tag();
2418
- reportMatchFailures = savedReportMatchFailuresVar1;
2419
- if (result10 === null) {
2420
- var result4 = '';
3024
+ var result0, result1, result2;
3025
+ var pos0, pos1, pos2, pos3;
3026
+
3027
+ reportFailures++;
3028
+ pos0 = clone(pos);
3029
+ pos1 = clone(pos);
3030
+ pos2 = clone(pos);
3031
+ pos3 = clone(pos);
3032
+ reportFailures++;
3033
+ result1 = parse_tag();
3034
+ reportFailures--;
3035
+ if (result1 === null) {
3036
+ result1 = "";
2421
3037
  } else {
2422
- var result4 = null;
2423
- pos = savedPos2;
2424
- }
2425
- if (result4 !== null) {
2426
- var savedPos1 = pos;
2427
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2428
- reportMatchFailures = false;
2429
- var result9 = parse_eol();
2430
- reportMatchFailures = savedReportMatchFailuresVar0;
2431
- if (result9 === null) {
2432
- var result5 = '';
2433
- } else {
2434
- var result5 = null;
2435
- pos = savedPos1;
2436
- }
2437
- if (result5 !== null) {
2438
- var result8 = parse_esc();
2439
- if (result8 !== null) {
2440
- var result6 = result8;
3038
+ result1 = null;
3039
+ pos = clone(pos3);
3040
+ }
3041
+ if (result1 !== null) {
3042
+ result2 = parse_esc();
3043
+ if (result2 === null) {
3044
+ if (/^[^"]/.test(input.charAt(pos.offset))) {
3045
+ result2 = input.charAt(pos.offset);
3046
+ advance(pos, 1);
2441
3047
  } else {
2442
- if (input.substr(pos).match(/^[^"]/) !== null) {
2443
- var result7 = input.charAt(pos);
2444
- pos++;
2445
- } else {
2446
- var result7 = null;
2447
- if (reportMatchFailures) {
2448
- matchFailed("[^\"]");
2449
- }
3048
+ result2 = null;
3049
+ if (reportFailures === 0) {
3050
+ matchFailed("[^\"]");
2450
3051
  }
2451
- if (result7 !== null) {
2452
- var result6 = result7;
2453
- } else {
2454
- var result6 = null;;
2455
- };
2456
- }
2457
- if (result6 !== null) {
2458
- var result3 = [result4, result5, result6];
2459
- } else {
2460
- var result3 = null;
2461
- pos = savedPos0;
2462
3052
  }
3053
+ }
3054
+ if (result2 !== null) {
3055
+ result1 = [result1, result2];
2463
3056
  } else {
2464
- var result3 = null;
2465
- pos = savedPos0;
3057
+ result1 = null;
3058
+ pos = clone(pos2);
2466
3059
  }
2467
3060
  } else {
2468
- var result3 = null;
2469
- pos = savedPos0;
2470
- }
2471
- var result2 = result3 !== null
2472
- ? (function(c) {return c})(result3[2])
2473
- : null;
2474
- if (result2 !== null) {
2475
- var result1 = [];
2476
- while (result2 !== null) {
2477
- result1.push(result2);
2478
- var savedPos0 = pos;
2479
- var savedPos2 = pos;
2480
- var savedReportMatchFailuresVar1 = reportMatchFailures;
2481
- reportMatchFailures = false;
2482
- var result10 = parse_tag();
2483
- reportMatchFailures = savedReportMatchFailuresVar1;
2484
- if (result10 === null) {
2485
- var result4 = '';
3061
+ result1 = null;
3062
+ pos = clone(pos2);
3063
+ }
3064
+ if (result1 !== null) {
3065
+ result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[1]);
3066
+ }
3067
+ if (result1 === null) {
3068
+ pos = clone(pos1);
3069
+ }
3070
+ if (result1 !== null) {
3071
+ result0 = [];
3072
+ while (result1 !== null) {
3073
+ result0.push(result1);
3074
+ pos1 = clone(pos);
3075
+ pos2 = clone(pos);
3076
+ pos3 = clone(pos);
3077
+ reportFailures++;
3078
+ result1 = parse_tag();
3079
+ reportFailures--;
3080
+ if (result1 === null) {
3081
+ result1 = "";
2486
3082
  } else {
2487
- var result4 = null;
2488
- pos = savedPos2;
2489
- }
2490
- if (result4 !== null) {
2491
- var savedPos1 = pos;
2492
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2493
- reportMatchFailures = false;
2494
- var result9 = parse_eol();
2495
- reportMatchFailures = savedReportMatchFailuresVar0;
2496
- if (result9 === null) {
2497
- var result5 = '';
2498
- } else {
2499
- var result5 = null;
2500
- pos = savedPos1;
2501
- }
2502
- if (result5 !== null) {
2503
- var result8 = parse_esc();
2504
- if (result8 !== null) {
2505
- var result6 = result8;
3083
+ result1 = null;
3084
+ pos = clone(pos3);
3085
+ }
3086
+ if (result1 !== null) {
3087
+ result2 = parse_esc();
3088
+ if (result2 === null) {
3089
+ if (/^[^"]/.test(input.charAt(pos.offset))) {
3090
+ result2 = input.charAt(pos.offset);
3091
+ advance(pos, 1);
2506
3092
  } else {
2507
- if (input.substr(pos).match(/^[^"]/) !== null) {
2508
- var result7 = input.charAt(pos);
2509
- pos++;
2510
- } else {
2511
- var result7 = null;
2512
- if (reportMatchFailures) {
2513
- matchFailed("[^\"]");
2514
- }
3093
+ result2 = null;
3094
+ if (reportFailures === 0) {
3095
+ matchFailed("[^\"]");
2515
3096
  }
2516
- if (result7 !== null) {
2517
- var result6 = result7;
2518
- } else {
2519
- var result6 = null;;
2520
- };
2521
- }
2522
- if (result6 !== null) {
2523
- var result3 = [result4, result5, result6];
2524
- } else {
2525
- var result3 = null;
2526
- pos = savedPos0;
2527
3097
  }
3098
+ }
3099
+ if (result2 !== null) {
3100
+ result1 = [result1, result2];
2528
3101
  } else {
2529
- var result3 = null;
2530
- pos = savedPos0;
3102
+ result1 = null;
3103
+ pos = clone(pos2);
2531
3104
  }
2532
3105
  } else {
2533
- var result3 = null;
2534
- pos = savedPos0;
3106
+ result1 = null;
3107
+ pos = clone(pos2);
3108
+ }
3109
+ if (result1 !== null) {
3110
+ result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[1]);
3111
+ }
3112
+ if (result1 === null) {
3113
+ pos = clone(pos1);
2535
3114
  }
2536
- var result2 = result3 !== null
2537
- ? (function(c) {return c})(result3[2])
2538
- : null;
2539
3115
  }
2540
3116
  } else {
2541
- var result1 = null;
3117
+ result0 = null;
2542
3118
  }
2543
- var result0 = result1 !== null
2544
- ? (function(b) { return b.join('') })(result1)
2545
- : null;
2546
- reportMatchFailures = savedReportMatchFailures;
2547
- if (reportMatchFailures && result0 === null) {
3119
+ if (result0 !== null) {
3120
+ result0 = (function(offset, line, column, b) { return b.join('') })(pos0.offset, pos0.line, pos0.column, result0);
3121
+ }
3122
+ if (result0 === null) {
3123
+ pos = clone(pos0);
3124
+ }
3125
+ reportFailures--;
3126
+ if (reportFailures === 0 && result0 === null) {
2548
3127
  matchFailed("literal");
2549
3128
  }
2550
-
2551
- cache[cacheKey] = {
2552
- nextPos: pos,
2553
- result: result0
2554
- };
2555
3129
  return result0;
2556
3130
  }
2557
3131
 
2558
3132
  function parse_esc() {
2559
- var cacheKey = "esc" + '@' + pos;
2560
- var cachedResult = cache[cacheKey];
2561
- if (cachedResult) {
2562
- pos = cachedResult.nextPos;
2563
- return cachedResult.result;
2564
- }
3133
+ var result0;
3134
+ var pos0;
2565
3135
 
2566
-
2567
- if (input.substr(pos, 2) === "\\\"") {
2568
- var result1 = "\\\"";
2569
- pos += 2;
3136
+ pos0 = clone(pos);
3137
+ if (input.substr(pos.offset, 2) === "\\\"") {
3138
+ result0 = "\\\"";
3139
+ advance(pos, 2);
2570
3140
  } else {
2571
- var result1 = null;
2572
- if (reportMatchFailures) {
3141
+ result0 = null;
3142
+ if (reportFailures === 0) {
2573
3143
  matchFailed("\"\\\\\\\"\"");
2574
3144
  }
2575
3145
  }
2576
- var result0 = result1 !== null
2577
- ? (function() { return '"' })()
2578
- : null;
2579
-
2580
-
2581
-
2582
- cache[cacheKey] = {
2583
- nextPos: pos,
2584
- result: result0
2585
- };
3146
+ if (result0 !== null) {
3147
+ result0 = (function(offset, line, column) { return '"' })(pos0.offset, pos0.line, pos0.column);
3148
+ }
3149
+ if (result0 === null) {
3150
+ pos = clone(pos0);
3151
+ }
2586
3152
  return result0;
2587
3153
  }
2588
3154
 
2589
3155
  function parse_comment() {
2590
- var cacheKey = "comment" + '@' + pos;
2591
- var cachedResult = cache[cacheKey];
2592
- if (cachedResult) {
2593
- pos = cachedResult.nextPos;
2594
- return cachedResult.result;
2595
- }
2596
-
2597
- var savedReportMatchFailures = reportMatchFailures;
2598
- reportMatchFailures = false;
2599
- var savedPos0 = pos;
2600
- if (input.substr(pos, 2) === "{!") {
2601
- var result2 = "{!";
2602
- pos += 2;
3156
+ var result0, result1, result2, result3;
3157
+ var pos0, pos1, pos2, pos3, pos4;
3158
+
3159
+ reportFailures++;
3160
+ pos0 = clone(pos);
3161
+ pos1 = clone(pos);
3162
+ if (input.substr(pos.offset, 2) === "{!") {
3163
+ result0 = "{!";
3164
+ advance(pos, 2);
2603
3165
  } else {
2604
- var result2 = null;
2605
- if (reportMatchFailures) {
3166
+ result0 = null;
3167
+ if (reportFailures === 0) {
2606
3168
  matchFailed("\"{!\"");
2607
3169
  }
2608
3170
  }
2609
- if (result2 !== null) {
2610
- var result3 = [];
2611
- var savedPos1 = pos;
2612
- var savedPos2 = pos;
2613
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2614
- reportMatchFailures = false;
2615
- if (input.substr(pos, 2) === "!}") {
2616
- var result9 = "!}";
2617
- pos += 2;
3171
+ if (result0 !== null) {
3172
+ result1 = [];
3173
+ pos2 = clone(pos);
3174
+ pos3 = clone(pos);
3175
+ pos4 = clone(pos);
3176
+ reportFailures++;
3177
+ if (input.substr(pos.offset, 2) === "!}") {
3178
+ result2 = "!}";
3179
+ advance(pos, 2);
2618
3180
  } else {
2619
- var result9 = null;
2620
- if (reportMatchFailures) {
3181
+ result2 = null;
3182
+ if (reportFailures === 0) {
2621
3183
  matchFailed("\"!}\"");
2622
3184
  }
2623
3185
  }
2624
- reportMatchFailures = savedReportMatchFailuresVar0;
2625
- if (result9 === null) {
2626
- var result7 = '';
3186
+ reportFailures--;
3187
+ if (result2 === null) {
3188
+ result2 = "";
2627
3189
  } else {
2628
- var result7 = null;
2629
- pos = savedPos2;
3190
+ result2 = null;
3191
+ pos = clone(pos4);
2630
3192
  }
2631
- if (result7 !== null) {
2632
- if (input.length > pos) {
2633
- var result8 = input.charAt(pos);
2634
- pos++;
3193
+ if (result2 !== null) {
3194
+ if (input.length > pos.offset) {
3195
+ result3 = input.charAt(pos.offset);
3196
+ advance(pos, 1);
2635
3197
  } else {
2636
- var result8 = null;
2637
- if (reportMatchFailures) {
2638
- matchFailed('any character');
3198
+ result3 = null;
3199
+ if (reportFailures === 0) {
3200
+ matchFailed("any character");
2639
3201
  }
2640
3202
  }
2641
- if (result8 !== null) {
2642
- var result6 = [result7, result8];
3203
+ if (result3 !== null) {
3204
+ result2 = [result2, result3];
2643
3205
  } else {
2644
- var result6 = null;
2645
- pos = savedPos1;
3206
+ result2 = null;
3207
+ pos = clone(pos3);
2646
3208
  }
2647
3209
  } else {
2648
- var result6 = null;
2649
- pos = savedPos1;
2650
- }
2651
- var result5 = result6 !== null
2652
- ? (function(c) {return c})(result6[1])
2653
- : null;
2654
- while (result5 !== null) {
2655
- result3.push(result5);
2656
- var savedPos1 = pos;
2657
- var savedPos2 = pos;
2658
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2659
- reportMatchFailures = false;
2660
- if (input.substr(pos, 2) === "!}") {
2661
- var result9 = "!}";
2662
- pos += 2;
3210
+ result2 = null;
3211
+ pos = clone(pos3);
3212
+ }
3213
+ if (result2 !== null) {
3214
+ result2 = (function(offset, line, column, c) {return c})(pos2.offset, pos2.line, pos2.column, result2[1]);
3215
+ }
3216
+ if (result2 === null) {
3217
+ pos = clone(pos2);
3218
+ }
3219
+ while (result2 !== null) {
3220
+ result1.push(result2);
3221
+ pos2 = clone(pos);
3222
+ pos3 = clone(pos);
3223
+ pos4 = clone(pos);
3224
+ reportFailures++;
3225
+ if (input.substr(pos.offset, 2) === "!}") {
3226
+ result2 = "!}";
3227
+ advance(pos, 2);
2663
3228
  } else {
2664
- var result9 = null;
2665
- if (reportMatchFailures) {
3229
+ result2 = null;
3230
+ if (reportFailures === 0) {
2666
3231
  matchFailed("\"!}\"");
2667
3232
  }
2668
3233
  }
2669
- reportMatchFailures = savedReportMatchFailuresVar0;
2670
- if (result9 === null) {
2671
- var result7 = '';
3234
+ reportFailures--;
3235
+ if (result2 === null) {
3236
+ result2 = "";
2672
3237
  } else {
2673
- var result7 = null;
2674
- pos = savedPos2;
3238
+ result2 = null;
3239
+ pos = clone(pos4);
2675
3240
  }
2676
- if (result7 !== null) {
2677
- if (input.length > pos) {
2678
- var result8 = input.charAt(pos);
2679
- pos++;
3241
+ if (result2 !== null) {
3242
+ if (input.length > pos.offset) {
3243
+ result3 = input.charAt(pos.offset);
3244
+ advance(pos, 1);
2680
3245
  } else {
2681
- var result8 = null;
2682
- if (reportMatchFailures) {
2683
- matchFailed('any character');
3246
+ result3 = null;
3247
+ if (reportFailures === 0) {
3248
+ matchFailed("any character");
2684
3249
  }
2685
3250
  }
2686
- if (result8 !== null) {
2687
- var result6 = [result7, result8];
3251
+ if (result3 !== null) {
3252
+ result2 = [result2, result3];
2688
3253
  } else {
2689
- var result6 = null;
2690
- pos = savedPos1;
3254
+ result2 = null;
3255
+ pos = clone(pos3);
2691
3256
  }
2692
3257
  } else {
2693
- var result6 = null;
2694
- pos = savedPos1;
3258
+ result2 = null;
3259
+ pos = clone(pos3);
3260
+ }
3261
+ if (result2 !== null) {
3262
+ result2 = (function(offset, line, column, c) {return c})(pos2.offset, pos2.line, pos2.column, result2[1]);
3263
+ }
3264
+ if (result2 === null) {
3265
+ pos = clone(pos2);
2695
3266
  }
2696
- var result5 = result6 !== null
2697
- ? (function(c) {return c})(result6[1])
2698
- : null;
2699
3267
  }
2700
- if (result3 !== null) {
2701
- if (input.substr(pos, 2) === "!}") {
2702
- var result4 = "!}";
2703
- pos += 2;
3268
+ if (result1 !== null) {
3269
+ if (input.substr(pos.offset, 2) === "!}") {
3270
+ result2 = "!}";
3271
+ advance(pos, 2);
2704
3272
  } else {
2705
- var result4 = null;
2706
- if (reportMatchFailures) {
3273
+ result2 = null;
3274
+ if (reportFailures === 0) {
2707
3275
  matchFailed("\"!}\"");
2708
3276
  }
2709
3277
  }
2710
- if (result4 !== null) {
2711
- var result1 = [result2, result3, result4];
3278
+ if (result2 !== null) {
3279
+ result0 = [result0, result1, result2];
2712
3280
  } else {
2713
- var result1 = null;
2714
- pos = savedPos0;
3281
+ result0 = null;
3282
+ pos = clone(pos1);
2715
3283
  }
2716
3284
  } else {
2717
- var result1 = null;
2718
- pos = savedPos0;
3285
+ result0 = null;
3286
+ pos = clone(pos1);
2719
3287
  }
2720
3288
  } else {
2721
- var result1 = null;
2722
- pos = savedPos0;
2723
- }
2724
- var result0 = result1 !== null
2725
- ? (function(c) { return ["comment", c.join('')] })(result1[1])
2726
- : null;
2727
- reportMatchFailures = savedReportMatchFailures;
2728
- if (reportMatchFailures && result0 === null) {
3289
+ result0 = null;
3290
+ pos = clone(pos1);
3291
+ }
3292
+ if (result0 !== null) {
3293
+ result0 = (function(offset, line, column, c) { return ["comment", c.join('')] })(pos0.offset, pos0.line, pos0.column, result0[1]);
3294
+ }
3295
+ if (result0 === null) {
3296
+ pos = clone(pos0);
3297
+ }
3298
+ reportFailures--;
3299
+ if (reportFailures === 0 && result0 === null) {
2729
3300
  matchFailed("comment");
2730
3301
  }
2731
-
2732
- cache[cacheKey] = {
2733
- nextPos: pos,
2734
- result: result0
2735
- };
2736
3302
  return result0;
2737
3303
  }
2738
3304
 
2739
3305
  function parse_tag() {
2740
- var cacheKey = "tag" + '@' + pos;
2741
- var cachedResult = cache[cacheKey];
2742
- if (cachedResult) {
2743
- pos = cachedResult.nextPos;
2744
- return cachedResult.result;
2745
- }
2746
-
2747
-
2748
- var savedPos0 = pos;
2749
- var result3 = parse_ld();
2750
- if (result3 !== null) {
2751
- if (input.substr(pos).match(/^[#?^><+%:@\/~%]/) !== null) {
2752
- var result4 = input.charAt(pos);
2753
- pos++;
3306
+ var result0, result1, result2, result3, result4, result5, result6;
3307
+ var pos0, pos1, pos2;
3308
+
3309
+ pos0 = clone(pos);
3310
+ result0 = parse_ld();
3311
+ if (result0 !== null) {
3312
+ if (/^[#?^><+%:@\/~%]/.test(input.charAt(pos.offset))) {
3313
+ result1 = input.charAt(pos.offset);
3314
+ advance(pos, 1);
2754
3315
  } else {
2755
- var result4 = null;
2756
- if (reportMatchFailures) {
3316
+ result1 = null;
3317
+ if (reportFailures === 0) {
2757
3318
  matchFailed("[#?^><+%:@\\/~%]");
2758
3319
  }
2759
3320
  }
2760
- if (result4 !== null) {
2761
- var savedPos1 = pos;
2762
- var savedPos3 = pos;
2763
- var savedReportMatchFailuresVar1 = reportMatchFailures;
2764
- reportMatchFailures = false;
2765
- var result12 = parse_rd();
2766
- reportMatchFailures = savedReportMatchFailuresVar1;
2767
- if (result12 === null) {
2768
- var result8 = '';
2769
- } else {
2770
- var result8 = null;
2771
- pos = savedPos3;
2772
- }
2773
- if (result8 !== null) {
2774
- var savedPos2 = pos;
2775
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2776
- reportMatchFailures = false;
2777
- var result11 = parse_eol();
2778
- reportMatchFailures = savedReportMatchFailuresVar0;
2779
- if (result11 === null) {
2780
- var result9 = '';
3321
+ if (result1 !== null) {
3322
+ result2 = [];
3323
+ result3 = parse_ws();
3324
+ while (result3 !== null) {
3325
+ result2.push(result3);
3326
+ result3 = parse_ws();
3327
+ }
3328
+ if (result2 !== null) {
3329
+ pos1 = clone(pos);
3330
+ pos2 = clone(pos);
3331
+ reportFailures++;
3332
+ result4 = parse_rd();
3333
+ reportFailures--;
3334
+ if (result4 === null) {
3335
+ result4 = "";
2781
3336
  } else {
2782
- var result9 = null;
2783
- pos = savedPos2;
3337
+ result4 = null;
3338
+ pos = clone(pos2);
2784
3339
  }
2785
- if (result9 !== null) {
2786
- if (input.length > pos) {
2787
- var result10 = input.charAt(pos);
2788
- pos++;
3340
+ if (result4 !== null) {
3341
+ pos2 = clone(pos);
3342
+ reportFailures++;
3343
+ result5 = parse_eol();
3344
+ reportFailures--;
3345
+ if (result5 === null) {
3346
+ result5 = "";
2789
3347
  } else {
2790
- var result10 = null;
2791
- if (reportMatchFailures) {
2792
- matchFailed('any character');
2793
- }
3348
+ result5 = null;
3349
+ pos = clone(pos2);
2794
3350
  }
2795
- if (result10 !== null) {
2796
- var result7 = [result8, result9, result10];
3351
+ if (result5 !== null) {
3352
+ if (input.length > pos.offset) {
3353
+ result6 = input.charAt(pos.offset);
3354
+ advance(pos, 1);
3355
+ } else {
3356
+ result6 = null;
3357
+ if (reportFailures === 0) {
3358
+ matchFailed("any character");
3359
+ }
3360
+ }
3361
+ if (result6 !== null) {
3362
+ result4 = [result4, result5, result6];
3363
+ } else {
3364
+ result4 = null;
3365
+ pos = clone(pos1);
3366
+ }
2797
3367
  } else {
2798
- var result7 = null;
2799
- pos = savedPos1;
3368
+ result4 = null;
3369
+ pos = clone(pos1);
2800
3370
  }
2801
3371
  } else {
2802
- var result7 = null;
2803
- pos = savedPos1;
3372
+ result4 = null;
3373
+ pos = clone(pos1);
2804
3374
  }
2805
- } else {
2806
- var result7 = null;
2807
- pos = savedPos1;
2808
- }
2809
- if (result7 !== null) {
2810
- var result5 = [];
2811
- while (result7 !== null) {
2812
- result5.push(result7);
2813
- var savedPos1 = pos;
2814
- var savedPos3 = pos;
2815
- var savedReportMatchFailuresVar1 = reportMatchFailures;
2816
- reportMatchFailures = false;
2817
- var result12 = parse_rd();
2818
- reportMatchFailures = savedReportMatchFailuresVar1;
2819
- if (result12 === null) {
2820
- var result8 = '';
2821
- } else {
2822
- var result8 = null;
2823
- pos = savedPos3;
2824
- }
2825
- if (result8 !== null) {
2826
- var savedPos2 = pos;
2827
- var savedReportMatchFailuresVar0 = reportMatchFailures;
2828
- reportMatchFailures = false;
2829
- var result11 = parse_eol();
2830
- reportMatchFailures = savedReportMatchFailuresVar0;
2831
- if (result11 === null) {
2832
- var result9 = '';
3375
+ if (result4 !== null) {
3376
+ result3 = [];
3377
+ while (result4 !== null) {
3378
+ result3.push(result4);
3379
+ pos1 = clone(pos);
3380
+ pos2 = clone(pos);
3381
+ reportFailures++;
3382
+ result4 = parse_rd();
3383
+ reportFailures--;
3384
+ if (result4 === null) {
3385
+ result4 = "";
2833
3386
  } else {
2834
- var result9 = null;
2835
- pos = savedPos2;
3387
+ result4 = null;
3388
+ pos = clone(pos2);
2836
3389
  }
2837
- if (result9 !== null) {
2838
- if (input.length > pos) {
2839
- var result10 = input.charAt(pos);
2840
- pos++;
3390
+ if (result4 !== null) {
3391
+ pos2 = clone(pos);
3392
+ reportFailures++;
3393
+ result5 = parse_eol();
3394
+ reportFailures--;
3395
+ if (result5 === null) {
3396
+ result5 = "";
2841
3397
  } else {
2842
- var result10 = null;
2843
- if (reportMatchFailures) {
2844
- matchFailed('any character');
2845
- }
3398
+ result5 = null;
3399
+ pos = clone(pos2);
2846
3400
  }
2847
- if (result10 !== null) {
2848
- var result7 = [result8, result9, result10];
3401
+ if (result5 !== null) {
3402
+ if (input.length > pos.offset) {
3403
+ result6 = input.charAt(pos.offset);
3404
+ advance(pos, 1);
3405
+ } else {
3406
+ result6 = null;
3407
+ if (reportFailures === 0) {
3408
+ matchFailed("any character");
3409
+ }
3410
+ }
3411
+ if (result6 !== null) {
3412
+ result4 = [result4, result5, result6];
3413
+ } else {
3414
+ result4 = null;
3415
+ pos = clone(pos1);
3416
+ }
2849
3417
  } else {
2850
- var result7 = null;
2851
- pos = savedPos1;
3418
+ result4 = null;
3419
+ pos = clone(pos1);
2852
3420
  }
2853
3421
  } else {
2854
- var result7 = null;
2855
- pos = savedPos1;
3422
+ result4 = null;
3423
+ pos = clone(pos1);
2856
3424
  }
2857
- } else {
2858
- var result7 = null;
2859
- pos = savedPos1;
2860
3425
  }
3426
+ } else {
3427
+ result3 = null;
2861
3428
  }
2862
- } else {
2863
- var result5 = null;
2864
- }
2865
- if (result5 !== null) {
2866
- var result6 = parse_rd();
2867
- if (result6 !== null) {
2868
- var result2 = [result3, result4, result5, result6];
3429
+ if (result3 !== null) {
3430
+ result4 = [];
3431
+ result5 = parse_ws();
3432
+ while (result5 !== null) {
3433
+ result4.push(result5);
3434
+ result5 = parse_ws();
3435
+ }
3436
+ if (result4 !== null) {
3437
+ result5 = parse_rd();
3438
+ if (result5 !== null) {
3439
+ result0 = [result0, result1, result2, result3, result4, result5];
3440
+ } else {
3441
+ result0 = null;
3442
+ pos = clone(pos0);
3443
+ }
3444
+ } else {
3445
+ result0 = null;
3446
+ pos = clone(pos0);
3447
+ }
2869
3448
  } else {
2870
- var result2 = null;
2871
- pos = savedPos0;
3449
+ result0 = null;
3450
+ pos = clone(pos0);
2872
3451
  }
2873
3452
  } else {
2874
- var result2 = null;
2875
- pos = savedPos0;
3453
+ result0 = null;
3454
+ pos = clone(pos0);
2876
3455
  }
2877
3456
  } else {
2878
- var result2 = null;
2879
- pos = savedPos0;
3457
+ result0 = null;
3458
+ pos = clone(pos0);
2880
3459
  }
2881
3460
  } else {
2882
- var result2 = null;
2883
- pos = savedPos0;
3461
+ result0 = null;
3462
+ pos = clone(pos0);
2884
3463
  }
2885
- if (result2 !== null) {
2886
- var result0 = result2;
2887
- } else {
2888
- var result1 = parse_reference();
2889
- if (result1 !== null) {
2890
- var result0 = result1;
2891
- } else {
2892
- var result0 = null;;
2893
- };
3464
+ if (result0 === null) {
3465
+ result0 = parse_reference();
2894
3466
  }
2895
-
2896
-
2897
-
2898
- cache[cacheKey] = {
2899
- nextPos: pos,
2900
- result: result0
2901
- };
2902
3467
  return result0;
2903
3468
  }
2904
3469
 
2905
3470
  function parse_ld() {
2906
- var cacheKey = "ld" + '@' + pos;
2907
- var cachedResult = cache[cacheKey];
2908
- if (cachedResult) {
2909
- pos = cachedResult.nextPos;
2910
- return cachedResult.result;
2911
- }
3471
+ var result0;
2912
3472
 
2913
-
2914
- if (input.substr(pos, 1) === "{") {
2915
- var result0 = "{";
2916
- pos += 1;
3473
+ if (input.charCodeAt(pos.offset) === 123) {
3474
+ result0 = "{";
3475
+ advance(pos, 1);
2917
3476
  } else {
2918
- var result0 = null;
2919
- if (reportMatchFailures) {
3477
+ result0 = null;
3478
+ if (reportFailures === 0) {
2920
3479
  matchFailed("\"{\"");
2921
3480
  }
2922
3481
  }
2923
-
2924
-
2925
-
2926
- cache[cacheKey] = {
2927
- nextPos: pos,
2928
- result: result0
2929
- };
2930
3482
  return result0;
2931
3483
  }
2932
3484
 
2933
3485
  function parse_rd() {
2934
- var cacheKey = "rd" + '@' + pos;
2935
- var cachedResult = cache[cacheKey];
2936
- if (cachedResult) {
2937
- pos = cachedResult.nextPos;
2938
- return cachedResult.result;
2939
- }
3486
+ var result0;
2940
3487
 
2941
-
2942
- if (input.substr(pos, 1) === "}") {
2943
- var result0 = "}";
2944
- pos += 1;
3488
+ if (input.charCodeAt(pos.offset) === 125) {
3489
+ result0 = "}";
3490
+ advance(pos, 1);
2945
3491
  } else {
2946
- var result0 = null;
2947
- if (reportMatchFailures) {
3492
+ result0 = null;
3493
+ if (reportFailures === 0) {
2948
3494
  matchFailed("\"}\"");
2949
3495
  }
2950
3496
  }
2951
-
2952
-
2953
-
2954
- cache[cacheKey] = {
2955
- nextPos: pos,
2956
- result: result0
2957
- };
2958
3497
  return result0;
2959
3498
  }
2960
3499
 
2961
3500
  function parse_eol() {
2962
- var cacheKey = "eol" + '@' + pos;
2963
- var cachedResult = cache[cacheKey];
2964
- if (cachedResult) {
2965
- pos = cachedResult.nextPos;
2966
- return cachedResult.result;
2967
- }
3501
+ var result0;
2968
3502
 
2969
-
2970
- if (input.substr(pos, 1) === "\n") {
2971
- var result5 = "\n";
2972
- pos += 1;
3503
+ if (input.charCodeAt(pos.offset) === 10) {
3504
+ result0 = "\n";
3505
+ advance(pos, 1);
2973
3506
  } else {
2974
- var result5 = null;
2975
- if (reportMatchFailures) {
3507
+ result0 = null;
3508
+ if (reportFailures === 0) {
2976
3509
  matchFailed("\"\\n\"");
2977
3510
  }
2978
3511
  }
2979
- if (result5 !== null) {
2980
- var result0 = result5;
2981
- } else {
2982
- if (input.substr(pos, 2) === "\r\n") {
2983
- var result4 = "\r\n";
2984
- pos += 2;
3512
+ if (result0 === null) {
3513
+ if (input.substr(pos.offset, 2) === "\r\n") {
3514
+ result0 = "\r\n";
3515
+ advance(pos, 2);
2985
3516
  } else {
2986
- var result4 = null;
2987
- if (reportMatchFailures) {
3517
+ result0 = null;
3518
+ if (reportFailures === 0) {
2988
3519
  matchFailed("\"\\r\\n\"");
2989
3520
  }
2990
3521
  }
2991
- if (result4 !== null) {
2992
- var result0 = result4;
2993
- } else {
2994
- if (input.substr(pos, 1) === "\r") {
2995
- var result3 = "\r";
2996
- pos += 1;
3522
+ if (result0 === null) {
3523
+ if (input.charCodeAt(pos.offset) === 13) {
3524
+ result0 = "\r";
3525
+ advance(pos, 1);
2997
3526
  } else {
2998
- var result3 = null;
2999
- if (reportMatchFailures) {
3527
+ result0 = null;
3528
+ if (reportFailures === 0) {
3000
3529
  matchFailed("\"\\r\"");
3001
3530
  }
3002
3531
  }
3003
- if (result3 !== null) {
3004
- var result0 = result3;
3005
- } else {
3006
- if (input.substr(pos, 1) === "\u2028") {
3007
- var result2 = "\u2028";
3008
- pos += 1;
3532
+ if (result0 === null) {
3533
+ if (input.charCodeAt(pos.offset) === 8232) {
3534
+ result0 = "\u2028";
3535
+ advance(pos, 1);
3009
3536
  } else {
3010
- var result2 = null;
3011
- if (reportMatchFailures) {
3537
+ result0 = null;
3538
+ if (reportFailures === 0) {
3012
3539
  matchFailed("\"\\u2028\"");
3013
3540
  }
3014
3541
  }
3015
- if (result2 !== null) {
3016
- var result0 = result2;
3017
- } else {
3018
- if (input.substr(pos, 1) === "\u2029") {
3019
- var result1 = "\u2029";
3020
- pos += 1;
3542
+ if (result0 === null) {
3543
+ if (input.charCodeAt(pos.offset) === 8233) {
3544
+ result0 = "\u2029";
3545
+ advance(pos, 1);
3021
3546
  } else {
3022
- var result1 = null;
3023
- if (reportMatchFailures) {
3547
+ result0 = null;
3548
+ if (reportFailures === 0) {
3024
3549
  matchFailed("\"\\u2029\"");
3025
3550
  }
3026
3551
  }
3027
- if (result1 !== null) {
3028
- var result0 = result1;
3029
- } else {
3030
- var result0 = null;;
3031
- };
3032
- };
3033
- };
3034
- };
3552
+ }
3553
+ }
3554
+ }
3035
3555
  }
3036
-
3037
-
3038
-
3039
- cache[cacheKey] = {
3040
- nextPos: pos,
3041
- result: result0
3042
- };
3043
3556
  return result0;
3044
3557
  }
3045
3558
 
3046
3559
  function parse_ws() {
3047
- var cacheKey = "ws" + '@' + pos;
3048
- var cachedResult = cache[cacheKey];
3049
- if (cachedResult) {
3050
- pos = cachedResult.nextPos;
3051
- return cachedResult.result;
3052
- }
3053
-
3560
+ var result0;
3054
3561
 
3055
- if (input.substr(pos).match(/^[ \xA0\uFEFF]/) !== null) {
3056
- var result0 = input.charAt(pos);
3057
- pos++;
3562
+ if (/^[\t\x0B\f \xA0\uFEFF]/.test(input.charAt(pos.offset))) {
3563
+ result0 = input.charAt(pos.offset);
3564
+ advance(pos, 1);
3058
3565
  } else {
3059
- var result0 = null;
3060
- if (reportMatchFailures) {
3061
- matchFailed("[ \\xA0\\uFEFF]");
3566
+ result0 = null;
3567
+ if (reportFailures === 0) {
3568
+ matchFailed("[\\t\\x0B\\f \\xA0\\uFEFF]");
3062
3569
  }
3063
3570
  }
3064
-
3065
-
3066
-
3067
- cache[cacheKey] = {
3068
- nextPos: pos,
3069
- result: result0
3070
- };
3571
+ if (result0 === null) {
3572
+ result0 = parse_eol();
3573
+ }
3071
3574
  return result0;
3072
3575
  }
3073
3576
 
3074
- function buildErrorMessage() {
3075
- function buildExpected(failuresExpected) {
3076
- failuresExpected.sort();
3077
-
3078
- var lastFailure = null;
3079
- var failuresExpectedUnique = [];
3080
- for (var i = 0; i < failuresExpected.length; i++) {
3081
- if (failuresExpected[i] !== lastFailure) {
3082
- failuresExpectedUnique.push(failuresExpected[i]);
3083
- lastFailure = failuresExpected[i];
3084
- }
3085
- }
3086
-
3087
- switch (failuresExpectedUnique.length) {
3088
- case 0:
3089
- return 'end of input';
3090
- case 1:
3091
- return failuresExpectedUnique[0];
3092
- default:
3093
- return failuresExpectedUnique.slice(0, failuresExpectedUnique.length - 1).join(', ')
3094
- + ' or '
3095
- + failuresExpectedUnique[failuresExpectedUnique.length - 1];
3096
- }
3097
- }
3098
-
3099
- var expected = buildExpected(rightmostMatchFailuresExpected);
3100
- var actualPos = Math.max(pos, rightmostMatchFailuresPos);
3101
- var actual = actualPos < input.length
3102
- ? quote(input.charAt(actualPos))
3103
- : 'end of input';
3104
-
3105
- return 'Expected ' + expected + ' but ' + actual + ' found.';
3106
- }
3107
3577
 
3108
- function computeErrorPosition() {
3109
- /*
3110
- * The first idea was to use |String.split| to break the input up to the
3111
- * error position along newlines and derive the line and column from
3112
- * there. However IE's |split| implementation is so broken that it was
3113
- * enough to prevent it.
3114
- */
3115
-
3116
- var line = 1;
3117
- var column = 1;
3118
- var seenCR = false;
3119
-
3120
- for (var i = 0; i < rightmostMatchFailuresPos; i++) {
3121
- var ch = input.charAt(i);
3122
- if (ch === '\n') {
3123
- if (!seenCR) { line++; }
3124
- column = 1;
3125
- seenCR = false;
3126
- } else if (ch === '\r' | ch === '\u2028' || ch === '\u2029') {
3127
- line++;
3128
- column = 1;
3129
- seenCR = true;
3130
- } else {
3131
- column++;
3132
- seenCR = false;
3578
+ function cleanupExpected(expected) {
3579
+ expected.sort();
3580
+
3581
+ var lastExpected = null;
3582
+ var cleanExpected = [];
3583
+ for (var i = 0; i < expected.length; i++) {
3584
+ if (expected[i] !== lastExpected) {
3585
+ cleanExpected.push(expected[i]);
3586
+ lastExpected = expected[i];
3133
3587
  }
3134
3588
  }
3135
-
3136
- return { line: line, column: column };
3589
+ return cleanExpected;
3137
3590
  }
3138
3591
 
3139
3592
 
3140
3593
 
3141
- function wrap(node, ck) {
3142
-
3143
- node['text'] = input.substring(ck.split('@')[1], pos);
3144
-
3145
- return node;
3146
-
3147
- }
3148
-
3149
-
3150
-
3151
- var result = parse_body();
3594
+ var result = parseFunctions[startRule]();
3152
3595
 
3153
3596
  /*
3154
3597
  * The parser is now in one of the following three states:
@@ -3156,28 +3599,33 @@ var parser = (function(){
3156
3599
  * 1. The parser successfully parsed the whole input.
3157
3600
  *
3158
3601
  * - |result !== null|
3159
- * - |pos === input.length|
3160
- * - |rightmostMatchFailuresExpected| may or may not contain something
3602
+ * - |pos.offset === input.length|
3603
+ * - |rightmostFailuresExpected| may or may not contain something
3161
3604
  *
3162
3605
  * 2. The parser successfully parsed only a part of the input.
3163
3606
  *
3164
3607
  * - |result !== null|
3165
- * - |pos < input.length|
3166
- * - |rightmostMatchFailuresExpected| may or may not contain something
3608
+ * - |pos.offset < input.length|
3609
+ * - |rightmostFailuresExpected| may or may not contain something
3167
3610
  *
3168
3611
  * 3. The parser did not successfully parse any part of the input.
3169
3612
  *
3170
3613
  * - |result === null|
3171
- * - |pos === 0|
3172
- * - |rightmostMatchFailuresExpected| contains at least one failure
3614
+ * - |pos.offset === 0|
3615
+ * - |rightmostFailuresExpected| contains at least one failure
3173
3616
  *
3174
3617
  * All code following this comment (including called functions) must
3175
3618
  * handle these states.
3176
3619
  */
3177
- if (result === null || pos !== input.length) {
3178
- var errorPosition = computeErrorPosition();
3179
- throw new SyntaxError(
3180
- buildErrorMessage(),
3620
+ if (result === null || pos.offset !== input.length) {
3621
+ var offset = Math.max(pos.offset, rightmostFailuresPos.offset);
3622
+ var found = offset < input.length ? input.charAt(offset) : null;
3623
+ var errorPosition = pos.offset > rightmostFailuresPos.offset ? pos : rightmostFailuresPos;
3624
+
3625
+ throw new parser.SyntaxError(
3626
+ cleanupExpected(rightmostFailuresExpected),
3627
+ found,
3628
+ offset,
3181
3629
  errorPosition.line,
3182
3630
  errorPosition.column
3183
3631
  );
@@ -3192,9 +3640,33 @@ var parser = (function(){
3192
3640
 
3193
3641
  /* Thrown when a parser encounters a syntax error. */
3194
3642
 
3195
- result.SyntaxError = function(message, line, column) {
3196
- this.name = 'SyntaxError';
3197
- this.message = message;
3643
+ result.SyntaxError = function(expected, found, offset, line, column) {
3644
+ function buildMessage(expected, found) {
3645
+ var expectedHumanized, foundHumanized;
3646
+
3647
+ switch (expected.length) {
3648
+ case 0:
3649
+ expectedHumanized = "end of input";
3650
+ break;
3651
+ case 1:
3652
+ expectedHumanized = expected[0];
3653
+ break;
3654
+ default:
3655
+ expectedHumanized = expected.slice(0, expected.length - 1).join(", ")
3656
+ + " or "
3657
+ + expected[expected.length - 1];
3658
+ }
3659
+
3660
+ foundHumanized = found ? quote(found) : "end of input";
3661
+
3662
+ return "Expected " + expectedHumanized + " but " + foundHumanized + " found.";
3663
+ }
3664
+
3665
+ this.name = "SyntaxError";
3666
+ this.expected = expected;
3667
+ this.found = found;
3668
+ this.message = buildMessage(expected, found);
3669
+ this.offset = offset;
3198
3670
  this.line = line;
3199
3671
  this.column = column;
3200
3672
  };
@@ -3206,4 +3678,4 @@ var parser = (function(){
3206
3678
 
3207
3679
  dust.parse = parser.parse;
3208
3680
 
3209
- })(typeof exports !== 'undefined' ? exports : window.dust);
3681
+ })(typeof exports !== 'undefined' ? exports : getGlobal());