UNPKG

61.4 kBJavaScriptView Raw
1/*
2 * Generated by PEG.js 0.10.0.
3 *
4 * http://pegjs.org/
5 */
6
7"use strict";
8
9function peg$subclass(child, parent) {
10 function ctor() { this.constructor = child; }
11 ctor.prototype = parent.prototype;
12 child.prototype = new ctor();
13}
14
15function peg$SyntaxError(message, expected, found, location) {
16 this.message = message;
17 this.expected = expected;
18 this.found = found;
19 this.location = location;
20 this.name = "SyntaxError";
21
22 if (typeof Error.captureStackTrace === "function") {
23 Error.captureStackTrace(this, peg$SyntaxError);
24 }
25}
26
27peg$subclass(peg$SyntaxError, Error);
28
29peg$SyntaxError.buildMessage = function(expected, found) {
30 var DESCRIBE_EXPECTATION_FNS = {
31 literal: function(expectation) {
32 return "\"" + literalEscape(expectation.text) + "\"";
33 },
34
35 "class": function(expectation) {
36 var escapedParts = "",
37 i;
38
39 for (i = 0; i < expectation.parts.length; i++) {
40 escapedParts += expectation.parts[i] instanceof Array
41 ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
42 : classEscape(expectation.parts[i]);
43 }
44
45 return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
46 },
47
48 any: function(expectation) {
49 return "any character";
50 },
51
52 end: function(expectation) {
53 return "end of input";
54 },
55
56 other: function(expectation) {
57 return expectation.description;
58 }
59 };
60
61 function hex(ch) {
62 return ch.charCodeAt(0).toString(16).toUpperCase();
63 }
64
65 function literalEscape(s) {
66 return s
67 .replace(/\\/g, '\\\\')
68 .replace(/"/g, '\\"')
69 .replace(/\0/g, '\\0')
70 .replace(/\t/g, '\\t')
71 .replace(/\n/g, '\\n')
72 .replace(/\r/g, '\\r')
73 .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
74 .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); });
75 }
76
77 function classEscape(s) {
78 return s
79 .replace(/\\/g, '\\\\')
80 .replace(/\]/g, '\\]')
81 .replace(/\^/g, '\\^')
82 .replace(/-/g, '\\-')
83 .replace(/\0/g, '\\0')
84 .replace(/\t/g, '\\t')
85 .replace(/\n/g, '\\n')
86 .replace(/\r/g, '\\r')
87 .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
88 .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); });
89 }
90
91 function describeExpectation(expectation) {
92 return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
93 }
94
95 function describeExpected(expected) {
96 var descriptions = new Array(expected.length),
97 i, j;
98
99 for (i = 0; i < expected.length; i++) {
100 descriptions[i] = describeExpectation(expected[i]);
101 }
102
103 descriptions.sort();
104
105 if (descriptions.length > 0) {
106 for (i = 1, j = 1; i < descriptions.length; i++) {
107 if (descriptions[i - 1] !== descriptions[i]) {
108 descriptions[j] = descriptions[i];
109 j++;
110 }
111 }
112 descriptions.length = j;
113 }
114
115 switch (descriptions.length) {
116 case 1:
117 return descriptions[0];
118
119 case 2:
120 return descriptions[0] + " or " + descriptions[1];
121
122 default:
123 return descriptions.slice(0, -1).join(", ")
124 + ", or "
125 + descriptions[descriptions.length - 1];
126 }
127 }
128
129 function describeFound(found) {
130 return found ? "\"" + literalEscape(found) + "\"" : "end of input";
131 }
132
133 return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
134};
135
136function peg$parse(input, options) {
137 options = options !== void 0 ? options : {};
138
139 var peg$FAILED = {},
140
141 peg$startRuleFunctions = { Start: peg$parseStart },
142 peg$startRuleFunction = peg$parseStart,
143
144 peg$c0 = function(sections) {
145 return checkErrors() || {sections: sections, paths: paths, nestedPaths: nestedPaths}
146 },
147 peg$c1 = function(head, sec) { return sec },
148 peg$c2 = function(head, tail) {
149 return [].concat.apply(head, tail)
150 },
151 peg$c3 = function(args) {
152 checkSection('SET')
153 return args
154 },
155 peg$c4 = function(args) {
156 checkSection('REMOVE')
157 return args
158 },
159 peg$c5 = function(args) {
160 checkSection('ADD')
161 return args
162 },
163 peg$c6 = function(args) {
164 checkSection('DELETE')
165 return args
166 },
167 peg$c7 = ",",
168 peg$c8 = peg$literalExpectation(",", false),
169 peg$c9 = function(head, expr) { return expr },
170 peg$c10 = function(head, tail) {
171 return [head].concat(tail)
172 },
173 peg$c11 = "=",
174 peg$c12 = peg$literalExpectation("=", false),
175 peg$c13 = function(path, val) {
176 checkPath(path)
177 return {type: 'set', path: path, val: val, attrType: getType(val)}
178 },
179 peg$c14 = function(path) {
180 checkPath(path)
181 return {type: 'remove', path: path}
182 },
183 peg$c15 = function(path, val) {
184 checkPath(path)
185 var attrType = checkOperator('ADD', val)
186 return {type: 'add', path: path, val: val, attrType: attrType}
187 },
188 peg$c16 = function(path, val) {
189 checkPath(path)
190 var attrType = checkOperator('DELETE', val)
191 return {type: 'delete', path: path, val: val, attrType: attrType}
192 },
193 peg$c17 = "(",
194 peg$c18 = peg$literalExpectation("(", false),
195 peg$c19 = ")",
196 peg$c20 = peg$literalExpectation(")", false),
197 peg$c21 = function(val) { return val },
198 peg$c22 = "+",
199 peg$c23 = peg$literalExpectation("+", false),
200 peg$c24 = function(arg1, arg2) {
201 var attrType = checkFunction('+', [arg1, arg2])
202 return {type: 'add', args: [arg1, arg2], attrType: attrType}
203 },
204 peg$c25 = "-",
205 peg$c26 = peg$literalExpectation("-", false),
206 peg$c27 = function(arg1, arg2) {
207 var attrType = checkFunction('-', [arg1, arg2])
208 return {type: 'subtract', args: [arg1, arg2], attrType: attrType}
209 },
210 peg$c28 = function(op) { return op },
211 peg$c29 = function(head, tail, args) {
212 var name = head + tail.join('')
213 var attrType = checkFunction(name, args)
214 return {type: 'function', name: name, args: args, attrType: attrType}
215 },
216 peg$c30 = "#",
217 peg$c31 = peg$literalExpectation("#", false),
218 peg$c32 = function(head, tail) {
219 return resolveAttrName(head + tail.join(''))
220 },
221 peg$c33 = ":",
222 peg$c34 = peg$literalExpectation(":", false),
223 peg$c35 = function(head, tail) {
224 return resolveAttrVal(head + tail.join(''))
225 },
226 peg$c36 = "[",
227 peg$c37 = peg$literalExpectation("[", false),
228 peg$c38 = /^[0-9]/,
229 peg$c39 = peg$classExpectation([["0", "9"]], false, false),
230 peg$c40 = "]",
231 peg$c41 = peg$literalExpectation("]", false),
232 peg$c42 = function(head, ix) {
233 return +(ix.join(''))
234 },
235 peg$c43 = ".",
236 peg$c44 = peg$literalExpectation(".", false),
237 peg$c45 = function(head, prop) {
238 return prop
239 },
240 peg$c46 = function(head, tail) {
241 var path = [head].concat(tail)
242 if (path.length > 1) {
243 nestedPaths[path[0]] = true
244 }
245 return path
246 },
247 peg$c47 = function(head, tail) {
248 var name = head + tail.join('')
249 checkReserved(name)
250 return name
251 },
252 peg$c48 = /^[a-zA-Z]/,
253 peg$c49 = peg$classExpectation([["a", "z"], ["A", "Z"]], false, false),
254 peg$c50 = "_",
255 peg$c51 = peg$literalExpectation("_", false),
256 peg$c52 = "set",
257 peg$c53 = peg$literalExpectation("SET", true),
258 peg$c54 = "remove",
259 peg$c55 = peg$literalExpectation("REMOVE", true),
260 peg$c56 = "add",
261 peg$c57 = peg$literalExpectation("ADD", true),
262 peg$c58 = "delete",
263 peg$c59 = peg$literalExpectation("DELETE", true),
264 peg$c60 = peg$otherExpectation("whitespace"),
265 peg$c61 = /^[ \t\r\n]/,
266 peg$c62 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false),
267
268 peg$currPos = 0,
269 peg$savedPos = 0,
270 peg$posDetailsCache = [{ line: 1, column: 1 }],
271 peg$maxFailPos = 0,
272 peg$maxFailExpected = [],
273 peg$silentFails = 0,
274
275 peg$result;
276
277 if ("startRule" in options) {
278 if (!(options.startRule in peg$startRuleFunctions)) {
279 throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
280 }
281
282 peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
283 }
284
285 function text() {
286 return input.substring(peg$savedPos, peg$currPos);
287 }
288
289 function location() {
290 return peg$computeLocation(peg$savedPos, peg$currPos);
291 }
292
293 function expected(description, location) {
294 location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
295
296 throw peg$buildStructuredError(
297 [peg$otherExpectation(description)],
298 input.substring(peg$savedPos, peg$currPos),
299 location
300 );
301 }
302
303 function error(message, location) {
304 location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
305
306 throw peg$buildSimpleError(message, location);
307 }
308
309 function peg$literalExpectation(text, ignoreCase) {
310 return { type: "literal", text: text, ignoreCase: ignoreCase };
311 }
312
313 function peg$classExpectation(parts, inverted, ignoreCase) {
314 return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
315 }
316
317 function peg$anyExpectation() {
318 return { type: "any" };
319 }
320
321 function peg$endExpectation() {
322 return { type: "end" };
323 }
324
325 function peg$otherExpectation(description) {
326 return { type: "other", description: description };
327 }
328
329 function peg$computePosDetails(pos) {
330 var details = peg$posDetailsCache[pos], p;
331
332 if (details) {
333 return details;
334 } else {
335 p = pos - 1;
336 while (!peg$posDetailsCache[p]) {
337 p--;
338 }
339
340 details = peg$posDetailsCache[p];
341 details = {
342 line: details.line,
343 column: details.column
344 };
345
346 while (p < pos) {
347 if (input.charCodeAt(p) === 10) {
348 details.line++;
349 details.column = 1;
350 } else {
351 details.column++;
352 }
353
354 p++;
355 }
356
357 peg$posDetailsCache[pos] = details;
358 return details;
359 }
360 }
361
362 function peg$computeLocation(startPos, endPos) {
363 var startPosDetails = peg$computePosDetails(startPos),
364 endPosDetails = peg$computePosDetails(endPos);
365
366 return {
367 start: {
368 offset: startPos,
369 line: startPosDetails.line,
370 column: startPosDetails.column
371 },
372 end: {
373 offset: endPos,
374 line: endPosDetails.line,
375 column: endPosDetails.column
376 }
377 };
378 }
379
380 function peg$fail(expected) {
381 if (peg$currPos < peg$maxFailPos) { return; }
382
383 if (peg$currPos > peg$maxFailPos) {
384 peg$maxFailPos = peg$currPos;
385 peg$maxFailExpected = [];
386 }
387
388 peg$maxFailExpected.push(expected);
389 }
390
391 function peg$buildSimpleError(message, location) {
392 return new peg$SyntaxError(message, null, null, location);
393 }
394
395 function peg$buildStructuredError(expected, found, location) {
396 return new peg$SyntaxError(
397 peg$SyntaxError.buildMessage(expected, found),
398 expected,
399 found,
400 location
401 );
402 }
403
404 function peg$parseStart() {
405 var s0, s1, s2, s3;
406
407 s0 = peg$currPos;
408 s1 = peg$parse_();
409 if (s1 !== peg$FAILED) {
410 s2 = peg$parseSectionList();
411 if (s2 !== peg$FAILED) {
412 s3 = peg$parse_();
413 if (s3 !== peg$FAILED) {
414 peg$savedPos = s0;
415 s1 = peg$c0(s2);
416 s0 = s1;
417 } else {
418 peg$currPos = s0;
419 s0 = peg$FAILED;
420 }
421 } else {
422 peg$currPos = s0;
423 s0 = peg$FAILED;
424 }
425 } else {
426 peg$currPos = s0;
427 s0 = peg$FAILED;
428 }
429
430 return s0;
431 }
432
433 function peg$parseSectionList() {
434 var s0, s1, s2, s3, s4, s5;
435
436 s0 = peg$currPos;
437 s1 = peg$parseSection();
438 if (s1 !== peg$FAILED) {
439 s2 = [];
440 s3 = peg$currPos;
441 s4 = peg$parse_();
442 if (s4 !== peg$FAILED) {
443 s5 = peg$parseSection();
444 if (s5 !== peg$FAILED) {
445 peg$savedPos = s3;
446 s4 = peg$c1(s1, s5);
447 s3 = s4;
448 } else {
449 peg$currPos = s3;
450 s3 = peg$FAILED;
451 }
452 } else {
453 peg$currPos = s3;
454 s3 = peg$FAILED;
455 }
456 while (s3 !== peg$FAILED) {
457 s2.push(s3);
458 s3 = peg$currPos;
459 s4 = peg$parse_();
460 if (s4 !== peg$FAILED) {
461 s5 = peg$parseSection();
462 if (s5 !== peg$FAILED) {
463 peg$savedPos = s3;
464 s4 = peg$c1(s1, s5);
465 s3 = s4;
466 } else {
467 peg$currPos = s3;
468 s3 = peg$FAILED;
469 }
470 } else {
471 peg$currPos = s3;
472 s3 = peg$FAILED;
473 }
474 }
475 if (s2 !== peg$FAILED) {
476 peg$savedPos = s0;
477 s1 = peg$c2(s1, s2);
478 s0 = s1;
479 } else {
480 peg$currPos = s0;
481 s0 = peg$FAILED;
482 }
483 } else {
484 peg$currPos = s0;
485 s0 = peg$FAILED;
486 }
487
488 return s0;
489 }
490
491 function peg$parseSection() {
492 var s0, s1, s2, s3;
493
494 s0 = peg$currPos;
495 s1 = peg$parseSetToken();
496 if (s1 !== peg$FAILED) {
497 s2 = peg$parse_();
498 if (s2 !== peg$FAILED) {
499 s3 = peg$parseSetArgumentList();
500 if (s3 !== peg$FAILED) {
501 peg$savedPos = s0;
502 s1 = peg$c3(s3);
503 s0 = s1;
504 } else {
505 peg$currPos = s0;
506 s0 = peg$FAILED;
507 }
508 } else {
509 peg$currPos = s0;
510 s0 = peg$FAILED;
511 }
512 } else {
513 peg$currPos = s0;
514 s0 = peg$FAILED;
515 }
516 if (s0 === peg$FAILED) {
517 s0 = peg$currPos;
518 s1 = peg$parseRemoveToken();
519 if (s1 !== peg$FAILED) {
520 s2 = peg$parse_();
521 if (s2 !== peg$FAILED) {
522 s3 = peg$parseRemoveArgumentList();
523 if (s3 !== peg$FAILED) {
524 peg$savedPos = s0;
525 s1 = peg$c4(s3);
526 s0 = s1;
527 } else {
528 peg$currPos = s0;
529 s0 = peg$FAILED;
530 }
531 } else {
532 peg$currPos = s0;
533 s0 = peg$FAILED;
534 }
535 } else {
536 peg$currPos = s0;
537 s0 = peg$FAILED;
538 }
539 if (s0 === peg$FAILED) {
540 s0 = peg$currPos;
541 s1 = peg$parseAddToken();
542 if (s1 !== peg$FAILED) {
543 s2 = peg$parse_();
544 if (s2 !== peg$FAILED) {
545 s3 = peg$parseAddArgumentList();
546 if (s3 !== peg$FAILED) {
547 peg$savedPos = s0;
548 s1 = peg$c5(s3);
549 s0 = s1;
550 } else {
551 peg$currPos = s0;
552 s0 = peg$FAILED;
553 }
554 } else {
555 peg$currPos = s0;
556 s0 = peg$FAILED;
557 }
558 } else {
559 peg$currPos = s0;
560 s0 = peg$FAILED;
561 }
562 if (s0 === peg$FAILED) {
563 s0 = peg$currPos;
564 s1 = peg$parseDeleteToken();
565 if (s1 !== peg$FAILED) {
566 s2 = peg$parse_();
567 if (s2 !== peg$FAILED) {
568 s3 = peg$parseDeleteArgumentList();
569 if (s3 !== peg$FAILED) {
570 peg$savedPos = s0;
571 s1 = peg$c6(s3);
572 s0 = s1;
573 } else {
574 peg$currPos = s0;
575 s0 = peg$FAILED;
576 }
577 } else {
578 peg$currPos = s0;
579 s0 = peg$FAILED;
580 }
581 } else {
582 peg$currPos = s0;
583 s0 = peg$FAILED;
584 }
585 }
586 }
587 }
588
589 return s0;
590 }
591
592 function peg$parseSetArgumentList() {
593 var s0, s1, s2, s3, s4, s5, s6, s7;
594
595 s0 = peg$currPos;
596 s1 = peg$parseSetExpression();
597 if (s1 !== peg$FAILED) {
598 s2 = [];
599 s3 = peg$currPos;
600 s4 = peg$parse_();
601 if (s4 !== peg$FAILED) {
602 if (input.charCodeAt(peg$currPos) === 44) {
603 s5 = peg$c7;
604 peg$currPos++;
605 } else {
606 s5 = peg$FAILED;
607 if (peg$silentFails === 0) { peg$fail(peg$c8); }
608 }
609 if (s5 !== peg$FAILED) {
610 s6 = peg$parse_();
611 if (s6 !== peg$FAILED) {
612 s7 = peg$parseSetExpression();
613 if (s7 !== peg$FAILED) {
614 peg$savedPos = s3;
615 s4 = peg$c9(s1, s7);
616 s3 = s4;
617 } else {
618 peg$currPos = s3;
619 s3 = peg$FAILED;
620 }
621 } else {
622 peg$currPos = s3;
623 s3 = peg$FAILED;
624 }
625 } else {
626 peg$currPos = s3;
627 s3 = peg$FAILED;
628 }
629 } else {
630 peg$currPos = s3;
631 s3 = peg$FAILED;
632 }
633 while (s3 !== peg$FAILED) {
634 s2.push(s3);
635 s3 = peg$currPos;
636 s4 = peg$parse_();
637 if (s4 !== peg$FAILED) {
638 if (input.charCodeAt(peg$currPos) === 44) {
639 s5 = peg$c7;
640 peg$currPos++;
641 } else {
642 s5 = peg$FAILED;
643 if (peg$silentFails === 0) { peg$fail(peg$c8); }
644 }
645 if (s5 !== peg$FAILED) {
646 s6 = peg$parse_();
647 if (s6 !== peg$FAILED) {
648 s7 = peg$parseSetExpression();
649 if (s7 !== peg$FAILED) {
650 peg$savedPos = s3;
651 s4 = peg$c9(s1, s7);
652 s3 = s4;
653 } else {
654 peg$currPos = s3;
655 s3 = peg$FAILED;
656 }
657 } else {
658 peg$currPos = s3;
659 s3 = peg$FAILED;
660 }
661 } else {
662 peg$currPos = s3;
663 s3 = peg$FAILED;
664 }
665 } else {
666 peg$currPos = s3;
667 s3 = peg$FAILED;
668 }
669 }
670 if (s2 !== peg$FAILED) {
671 peg$savedPos = s0;
672 s1 = peg$c10(s1, s2);
673 s0 = s1;
674 } else {
675 peg$currPos = s0;
676 s0 = peg$FAILED;
677 }
678 } else {
679 peg$currPos = s0;
680 s0 = peg$FAILED;
681 }
682
683 return s0;
684 }
685
686 function peg$parseRemoveArgumentList() {
687 var s0, s1, s2, s3, s4, s5, s6, s7;
688
689 s0 = peg$currPos;
690 s1 = peg$parseRemoveExpression();
691 if (s1 !== peg$FAILED) {
692 s2 = [];
693 s3 = peg$currPos;
694 s4 = peg$parse_();
695 if (s4 !== peg$FAILED) {
696 if (input.charCodeAt(peg$currPos) === 44) {
697 s5 = peg$c7;
698 peg$currPos++;
699 } else {
700 s5 = peg$FAILED;
701 if (peg$silentFails === 0) { peg$fail(peg$c8); }
702 }
703 if (s5 !== peg$FAILED) {
704 s6 = peg$parse_();
705 if (s6 !== peg$FAILED) {
706 s7 = peg$parseRemoveExpression();
707 if (s7 !== peg$FAILED) {
708 peg$savedPos = s3;
709 s4 = peg$c9(s1, s7);
710 s3 = s4;
711 } else {
712 peg$currPos = s3;
713 s3 = peg$FAILED;
714 }
715 } else {
716 peg$currPos = s3;
717 s3 = peg$FAILED;
718 }
719 } else {
720 peg$currPos = s3;
721 s3 = peg$FAILED;
722 }
723 } else {
724 peg$currPos = s3;
725 s3 = peg$FAILED;
726 }
727 while (s3 !== peg$FAILED) {
728 s2.push(s3);
729 s3 = peg$currPos;
730 s4 = peg$parse_();
731 if (s4 !== peg$FAILED) {
732 if (input.charCodeAt(peg$currPos) === 44) {
733 s5 = peg$c7;
734 peg$currPos++;
735 } else {
736 s5 = peg$FAILED;
737 if (peg$silentFails === 0) { peg$fail(peg$c8); }
738 }
739 if (s5 !== peg$FAILED) {
740 s6 = peg$parse_();
741 if (s6 !== peg$FAILED) {
742 s7 = peg$parseRemoveExpression();
743 if (s7 !== peg$FAILED) {
744 peg$savedPos = s3;
745 s4 = peg$c9(s1, s7);
746 s3 = s4;
747 } else {
748 peg$currPos = s3;
749 s3 = peg$FAILED;
750 }
751 } else {
752 peg$currPos = s3;
753 s3 = peg$FAILED;
754 }
755 } else {
756 peg$currPos = s3;
757 s3 = peg$FAILED;
758 }
759 } else {
760 peg$currPos = s3;
761 s3 = peg$FAILED;
762 }
763 }
764 if (s2 !== peg$FAILED) {
765 peg$savedPos = s0;
766 s1 = peg$c10(s1, s2);
767 s0 = s1;
768 } else {
769 peg$currPos = s0;
770 s0 = peg$FAILED;
771 }
772 } else {
773 peg$currPos = s0;
774 s0 = peg$FAILED;
775 }
776
777 return s0;
778 }
779
780 function peg$parseAddArgumentList() {
781 var s0, s1, s2, s3, s4, s5, s6, s7;
782
783 s0 = peg$currPos;
784 s1 = peg$parseAddExpression();
785 if (s1 !== peg$FAILED) {
786 s2 = [];
787 s3 = peg$currPos;
788 s4 = peg$parse_();
789 if (s4 !== peg$FAILED) {
790 if (input.charCodeAt(peg$currPos) === 44) {
791 s5 = peg$c7;
792 peg$currPos++;
793 } else {
794 s5 = peg$FAILED;
795 if (peg$silentFails === 0) { peg$fail(peg$c8); }
796 }
797 if (s5 !== peg$FAILED) {
798 s6 = peg$parse_();
799 if (s6 !== peg$FAILED) {
800 s7 = peg$parseAddExpression();
801 if (s7 !== peg$FAILED) {
802 peg$savedPos = s3;
803 s4 = peg$c9(s1, s7);
804 s3 = s4;
805 } else {
806 peg$currPos = s3;
807 s3 = peg$FAILED;
808 }
809 } else {
810 peg$currPos = s3;
811 s3 = peg$FAILED;
812 }
813 } else {
814 peg$currPos = s3;
815 s3 = peg$FAILED;
816 }
817 } else {
818 peg$currPos = s3;
819 s3 = peg$FAILED;
820 }
821 while (s3 !== peg$FAILED) {
822 s2.push(s3);
823 s3 = peg$currPos;
824 s4 = peg$parse_();
825 if (s4 !== peg$FAILED) {
826 if (input.charCodeAt(peg$currPos) === 44) {
827 s5 = peg$c7;
828 peg$currPos++;
829 } else {
830 s5 = peg$FAILED;
831 if (peg$silentFails === 0) { peg$fail(peg$c8); }
832 }
833 if (s5 !== peg$FAILED) {
834 s6 = peg$parse_();
835 if (s6 !== peg$FAILED) {
836 s7 = peg$parseAddExpression();
837 if (s7 !== peg$FAILED) {
838 peg$savedPos = s3;
839 s4 = peg$c9(s1, s7);
840 s3 = s4;
841 } else {
842 peg$currPos = s3;
843 s3 = peg$FAILED;
844 }
845 } else {
846 peg$currPos = s3;
847 s3 = peg$FAILED;
848 }
849 } else {
850 peg$currPos = s3;
851 s3 = peg$FAILED;
852 }
853 } else {
854 peg$currPos = s3;
855 s3 = peg$FAILED;
856 }
857 }
858 if (s2 !== peg$FAILED) {
859 peg$savedPos = s0;
860 s1 = peg$c10(s1, s2);
861 s0 = s1;
862 } else {
863 peg$currPos = s0;
864 s0 = peg$FAILED;
865 }
866 } else {
867 peg$currPos = s0;
868 s0 = peg$FAILED;
869 }
870
871 return s0;
872 }
873
874 function peg$parseDeleteArgumentList() {
875 var s0, s1, s2, s3, s4, s5, s6, s7;
876
877 s0 = peg$currPos;
878 s1 = peg$parseDeleteExpression();
879 if (s1 !== peg$FAILED) {
880 s2 = [];
881 s3 = peg$currPos;
882 s4 = peg$parse_();
883 if (s4 !== peg$FAILED) {
884 if (input.charCodeAt(peg$currPos) === 44) {
885 s5 = peg$c7;
886 peg$currPos++;
887 } else {
888 s5 = peg$FAILED;
889 if (peg$silentFails === 0) { peg$fail(peg$c8); }
890 }
891 if (s5 !== peg$FAILED) {
892 s6 = peg$parse_();
893 if (s6 !== peg$FAILED) {
894 s7 = peg$parseDeleteExpression();
895 if (s7 !== peg$FAILED) {
896 peg$savedPos = s3;
897 s4 = peg$c9(s1, s7);
898 s3 = s4;
899 } else {
900 peg$currPos = s3;
901 s3 = peg$FAILED;
902 }
903 } else {
904 peg$currPos = s3;
905 s3 = peg$FAILED;
906 }
907 } else {
908 peg$currPos = s3;
909 s3 = peg$FAILED;
910 }
911 } else {
912 peg$currPos = s3;
913 s3 = peg$FAILED;
914 }
915 while (s3 !== peg$FAILED) {
916 s2.push(s3);
917 s3 = peg$currPos;
918 s4 = peg$parse_();
919 if (s4 !== peg$FAILED) {
920 if (input.charCodeAt(peg$currPos) === 44) {
921 s5 = peg$c7;
922 peg$currPos++;
923 } else {
924 s5 = peg$FAILED;
925 if (peg$silentFails === 0) { peg$fail(peg$c8); }
926 }
927 if (s5 !== peg$FAILED) {
928 s6 = peg$parse_();
929 if (s6 !== peg$FAILED) {
930 s7 = peg$parseDeleteExpression();
931 if (s7 !== peg$FAILED) {
932 peg$savedPos = s3;
933 s4 = peg$c9(s1, s7);
934 s3 = s4;
935 } else {
936 peg$currPos = s3;
937 s3 = peg$FAILED;
938 }
939 } else {
940 peg$currPos = s3;
941 s3 = peg$FAILED;
942 }
943 } else {
944 peg$currPos = s3;
945 s3 = peg$FAILED;
946 }
947 } else {
948 peg$currPos = s3;
949 s3 = peg$FAILED;
950 }
951 }
952 if (s2 !== peg$FAILED) {
953 peg$savedPos = s0;
954 s1 = peg$c10(s1, s2);
955 s0 = s1;
956 } else {
957 peg$currPos = s0;
958 s0 = peg$FAILED;
959 }
960 } else {
961 peg$currPos = s0;
962 s0 = peg$FAILED;
963 }
964
965 return s0;
966 }
967
968 function peg$parseSetExpression() {
969 var s0, s1, s2, s3, s4, s5;
970
971 s0 = peg$currPos;
972 s1 = peg$parsePathExpression();
973 if (s1 !== peg$FAILED) {
974 s2 = peg$parse_();
975 if (s2 !== peg$FAILED) {
976 if (input.charCodeAt(peg$currPos) === 61) {
977 s3 = peg$c11;
978 peg$currPos++;
979 } else {
980 s3 = peg$FAILED;
981 if (peg$silentFails === 0) { peg$fail(peg$c12); }
982 }
983 if (s3 !== peg$FAILED) {
984 s4 = peg$parse_();
985 if (s4 !== peg$FAILED) {
986 s5 = peg$parseSetValueParens();
987 if (s5 !== peg$FAILED) {
988 peg$savedPos = s0;
989 s1 = peg$c13(s1, s5);
990 s0 = s1;
991 } else {
992 peg$currPos = s0;
993 s0 = peg$FAILED;
994 }
995 } else {
996 peg$currPos = s0;
997 s0 = peg$FAILED;
998 }
999 } else {
1000 peg$currPos = s0;
1001 s0 = peg$FAILED;
1002 }
1003 } else {
1004 peg$currPos = s0;
1005 s0 = peg$FAILED;
1006 }
1007 } else {
1008 peg$currPos = s0;
1009 s0 = peg$FAILED;
1010 }
1011
1012 return s0;
1013 }
1014
1015 function peg$parseRemoveExpression() {
1016 var s0, s1;
1017
1018 s0 = peg$currPos;
1019 s1 = peg$parsePathExpression();
1020 if (s1 !== peg$FAILED) {
1021 peg$savedPos = s0;
1022 s1 = peg$c14(s1);
1023 }
1024 s0 = s1;
1025
1026 return s0;
1027 }
1028
1029 function peg$parseAddExpression() {
1030 var s0, s1, s2, s3;
1031
1032 s0 = peg$currPos;
1033 s1 = peg$parsePathExpression();
1034 if (s1 !== peg$FAILED) {
1035 s2 = peg$parse_();
1036 if (s2 !== peg$FAILED) {
1037 s3 = peg$parseExpressionAttributeValue();
1038 if (s3 !== peg$FAILED) {
1039 peg$savedPos = s0;
1040 s1 = peg$c15(s1, s3);
1041 s0 = s1;
1042 } else {
1043 peg$currPos = s0;
1044 s0 = peg$FAILED;
1045 }
1046 } else {
1047 peg$currPos = s0;
1048 s0 = peg$FAILED;
1049 }
1050 } else {
1051 peg$currPos = s0;
1052 s0 = peg$FAILED;
1053 }
1054
1055 return s0;
1056 }
1057
1058 function peg$parseDeleteExpression() {
1059 var s0, s1, s2, s3;
1060
1061 s0 = peg$currPos;
1062 s1 = peg$parsePathExpression();
1063 if (s1 !== peg$FAILED) {
1064 s2 = peg$parse_();
1065 if (s2 !== peg$FAILED) {
1066 s3 = peg$parseExpressionAttributeValue();
1067 if (s3 !== peg$FAILED) {
1068 peg$savedPos = s0;
1069 s1 = peg$c16(s1, s3);
1070 s0 = s1;
1071 } else {
1072 peg$currPos = s0;
1073 s0 = peg$FAILED;
1074 }
1075 } else {
1076 peg$currPos = s0;
1077 s0 = peg$FAILED;
1078 }
1079 } else {
1080 peg$currPos = s0;
1081 s0 = peg$FAILED;
1082 }
1083
1084 return s0;
1085 }
1086
1087 function peg$parseSetValueParens() {
1088 var s0, s1, s2, s3, s4, s5;
1089
1090 s0 = peg$currPos;
1091 if (input.charCodeAt(peg$currPos) === 40) {
1092 s1 = peg$c17;
1093 peg$currPos++;
1094 } else {
1095 s1 = peg$FAILED;
1096 if (peg$silentFails === 0) { peg$fail(peg$c18); }
1097 }
1098 if (s1 !== peg$FAILED) {
1099 s2 = peg$parse_();
1100 if (s2 !== peg$FAILED) {
1101 s3 = peg$parseSetValue();
1102 if (s3 !== peg$FAILED) {
1103 s4 = peg$parse_();
1104 if (s4 !== peg$FAILED) {
1105 if (input.charCodeAt(peg$currPos) === 41) {
1106 s5 = peg$c19;
1107 peg$currPos++;
1108 } else {
1109 s5 = peg$FAILED;
1110 if (peg$silentFails === 0) { peg$fail(peg$c20); }
1111 }
1112 if (s5 !== peg$FAILED) {
1113 peg$savedPos = s0;
1114 s1 = peg$c21(s3);
1115 s0 = s1;
1116 } else {
1117 peg$currPos = s0;
1118 s0 = peg$FAILED;
1119 }
1120 } else {
1121 peg$currPos = s0;
1122 s0 = peg$FAILED;
1123 }
1124 } else {
1125 peg$currPos = s0;
1126 s0 = peg$FAILED;
1127 }
1128 } else {
1129 peg$currPos = s0;
1130 s0 = peg$FAILED;
1131 }
1132 } else {
1133 peg$currPos = s0;
1134 s0 = peg$FAILED;
1135 }
1136 if (s0 === peg$FAILED) {
1137 s0 = peg$parseSetValue();
1138 }
1139
1140 return s0;
1141 }
1142
1143 function peg$parseSetValue() {
1144 var s0, s1, s2, s3, s4, s5;
1145
1146 s0 = peg$currPos;
1147 s1 = peg$parseOperandParens();
1148 if (s1 !== peg$FAILED) {
1149 s2 = peg$parse_();
1150 if (s2 !== peg$FAILED) {
1151 if (input.charCodeAt(peg$currPos) === 43) {
1152 s3 = peg$c22;
1153 peg$currPos++;
1154 } else {
1155 s3 = peg$FAILED;
1156 if (peg$silentFails === 0) { peg$fail(peg$c23); }
1157 }
1158 if (s3 !== peg$FAILED) {
1159 s4 = peg$parse_();
1160 if (s4 !== peg$FAILED) {
1161 s5 = peg$parseOperandParens();
1162 if (s5 !== peg$FAILED) {
1163 peg$savedPos = s0;
1164 s1 = peg$c24(s1, s5);
1165 s0 = s1;
1166 } else {
1167 peg$currPos = s0;
1168 s0 = peg$FAILED;
1169 }
1170 } else {
1171 peg$currPos = s0;
1172 s0 = peg$FAILED;
1173 }
1174 } else {
1175 peg$currPos = s0;
1176 s0 = peg$FAILED;
1177 }
1178 } else {
1179 peg$currPos = s0;
1180 s0 = peg$FAILED;
1181 }
1182 } else {
1183 peg$currPos = s0;
1184 s0 = peg$FAILED;
1185 }
1186 if (s0 === peg$FAILED) {
1187 s0 = peg$currPos;
1188 s1 = peg$parseOperandParens();
1189 if (s1 !== peg$FAILED) {
1190 s2 = peg$parse_();
1191 if (s2 !== peg$FAILED) {
1192 if (input.charCodeAt(peg$currPos) === 45) {
1193 s3 = peg$c25;
1194 peg$currPos++;
1195 } else {
1196 s3 = peg$FAILED;
1197 if (peg$silentFails === 0) { peg$fail(peg$c26); }
1198 }
1199 if (s3 !== peg$FAILED) {
1200 s4 = peg$parse_();
1201 if (s4 !== peg$FAILED) {
1202 s5 = peg$parseOperandParens();
1203 if (s5 !== peg$FAILED) {
1204 peg$savedPos = s0;
1205 s1 = peg$c27(s1, s5);
1206 s0 = s1;
1207 } else {
1208 peg$currPos = s0;
1209 s0 = peg$FAILED;
1210 }
1211 } else {
1212 peg$currPos = s0;
1213 s0 = peg$FAILED;
1214 }
1215 } else {
1216 peg$currPos = s0;
1217 s0 = peg$FAILED;
1218 }
1219 } else {
1220 peg$currPos = s0;
1221 s0 = peg$FAILED;
1222 }
1223 } else {
1224 peg$currPos = s0;
1225 s0 = peg$FAILED;
1226 }
1227 if (s0 === peg$FAILED) {
1228 s0 = peg$parseOperandParens();
1229 }
1230 }
1231
1232 return s0;
1233 }
1234
1235 function peg$parseOperandParens() {
1236 var s0, s1, s2, s3, s4, s5;
1237
1238 s0 = peg$currPos;
1239 if (input.charCodeAt(peg$currPos) === 40) {
1240 s1 = peg$c17;
1241 peg$currPos++;
1242 } else {
1243 s1 = peg$FAILED;
1244 if (peg$silentFails === 0) { peg$fail(peg$c18); }
1245 }
1246 if (s1 !== peg$FAILED) {
1247 s2 = peg$parse_();
1248 if (s2 !== peg$FAILED) {
1249 s3 = peg$parseOperand();
1250 if (s3 !== peg$FAILED) {
1251 s4 = peg$parse_();
1252 if (s4 !== peg$FAILED) {
1253 if (input.charCodeAt(peg$currPos) === 41) {
1254 s5 = peg$c19;
1255 peg$currPos++;
1256 } else {
1257 s5 = peg$FAILED;
1258 if (peg$silentFails === 0) { peg$fail(peg$c20); }
1259 }
1260 if (s5 !== peg$FAILED) {
1261 peg$savedPos = s0;
1262 s1 = peg$c28(s3);
1263 s0 = s1;
1264 } else {
1265 peg$currPos = s0;
1266 s0 = peg$FAILED;
1267 }
1268 } else {
1269 peg$currPos = s0;
1270 s0 = peg$FAILED;
1271 }
1272 } else {
1273 peg$currPos = s0;
1274 s0 = peg$FAILED;
1275 }
1276 } else {
1277 peg$currPos = s0;
1278 s0 = peg$FAILED;
1279 }
1280 } else {
1281 peg$currPos = s0;
1282 s0 = peg$FAILED;
1283 }
1284 if (s0 === peg$FAILED) {
1285 s0 = peg$parseOperand();
1286 }
1287
1288 return s0;
1289 }
1290
1291 function peg$parseOperand() {
1292 var s0;
1293
1294 s0 = peg$parseFunction();
1295 if (s0 === peg$FAILED) {
1296 s0 = peg$parseExpressionAttributeValue();
1297 if (s0 === peg$FAILED) {
1298 s0 = peg$parsePathExpression();
1299 }
1300 }
1301
1302 return s0;
1303 }
1304
1305 function peg$parseFunction() {
1306 var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
1307
1308 s0 = peg$currPos;
1309 s1 = peg$currPos;
1310 peg$silentFails++;
1311 s2 = peg$parseReservedWord();
1312 peg$silentFails--;
1313 if (s2 === peg$FAILED) {
1314 s1 = void 0;
1315 } else {
1316 peg$currPos = s1;
1317 s1 = peg$FAILED;
1318 }
1319 if (s1 !== peg$FAILED) {
1320 s2 = peg$parseIdentifierStart();
1321 if (s2 !== peg$FAILED) {
1322 s3 = [];
1323 s4 = peg$parseIdentifierPart();
1324 while (s4 !== peg$FAILED) {
1325 s3.push(s4);
1326 s4 = peg$parseIdentifierPart();
1327 }
1328 if (s3 !== peg$FAILED) {
1329 s4 = peg$parse_();
1330 if (s4 !== peg$FAILED) {
1331 if (input.charCodeAt(peg$currPos) === 40) {
1332 s5 = peg$c17;
1333 peg$currPos++;
1334 } else {
1335 s5 = peg$FAILED;
1336 if (peg$silentFails === 0) { peg$fail(peg$c18); }
1337 }
1338 if (s5 !== peg$FAILED) {
1339 s6 = peg$parse_();
1340 if (s6 !== peg$FAILED) {
1341 s7 = peg$parseFunctionArgumentList();
1342 if (s7 !== peg$FAILED) {
1343 s8 = peg$parse_();
1344 if (s8 !== peg$FAILED) {
1345 if (input.charCodeAt(peg$currPos) === 41) {
1346 s9 = peg$c19;
1347 peg$currPos++;
1348 } else {
1349 s9 = peg$FAILED;
1350 if (peg$silentFails === 0) { peg$fail(peg$c20); }
1351 }
1352 if (s9 !== peg$FAILED) {
1353 peg$savedPos = s0;
1354 s1 = peg$c29(s2, s3, s7);
1355 s0 = s1;
1356 } else {
1357 peg$currPos = s0;
1358 s0 = peg$FAILED;
1359 }
1360 } else {
1361 peg$currPos = s0;
1362 s0 = peg$FAILED;
1363 }
1364 } else {
1365 peg$currPos = s0;
1366 s0 = peg$FAILED;
1367 }
1368 } else {
1369 peg$currPos = s0;
1370 s0 = peg$FAILED;
1371 }
1372 } else {
1373 peg$currPos = s0;
1374 s0 = peg$FAILED;
1375 }
1376 } else {
1377 peg$currPos = s0;
1378 s0 = peg$FAILED;
1379 }
1380 } else {
1381 peg$currPos = s0;
1382 s0 = peg$FAILED;
1383 }
1384 } else {
1385 peg$currPos = s0;
1386 s0 = peg$FAILED;
1387 }
1388 } else {
1389 peg$currPos = s0;
1390 s0 = peg$FAILED;
1391 }
1392
1393 return s0;
1394 }
1395
1396 function peg$parseFunctionArgumentList() {
1397 var s0, s1, s2, s3, s4, s5, s6, s7;
1398
1399 s0 = peg$currPos;
1400 s1 = peg$parseOperandParens();
1401 if (s1 !== peg$FAILED) {
1402 s2 = [];
1403 s3 = peg$currPos;
1404 s4 = peg$parse_();
1405 if (s4 !== peg$FAILED) {
1406 if (input.charCodeAt(peg$currPos) === 44) {
1407 s5 = peg$c7;
1408 peg$currPos++;
1409 } else {
1410 s5 = peg$FAILED;
1411 if (peg$silentFails === 0) { peg$fail(peg$c8); }
1412 }
1413 if (s5 !== peg$FAILED) {
1414 s6 = peg$parse_();
1415 if (s6 !== peg$FAILED) {
1416 s7 = peg$parseOperandParens();
1417 if (s7 !== peg$FAILED) {
1418 peg$savedPos = s3;
1419 s4 = peg$c9(s1, s7);
1420 s3 = s4;
1421 } else {
1422 peg$currPos = s3;
1423 s3 = peg$FAILED;
1424 }
1425 } else {
1426 peg$currPos = s3;
1427 s3 = peg$FAILED;
1428 }
1429 } else {
1430 peg$currPos = s3;
1431 s3 = peg$FAILED;
1432 }
1433 } else {
1434 peg$currPos = s3;
1435 s3 = peg$FAILED;
1436 }
1437 while (s3 !== peg$FAILED) {
1438 s2.push(s3);
1439 s3 = peg$currPos;
1440 s4 = peg$parse_();
1441 if (s4 !== peg$FAILED) {
1442 if (input.charCodeAt(peg$currPos) === 44) {
1443 s5 = peg$c7;
1444 peg$currPos++;
1445 } else {
1446 s5 = peg$FAILED;
1447 if (peg$silentFails === 0) { peg$fail(peg$c8); }
1448 }
1449 if (s5 !== peg$FAILED) {
1450 s6 = peg$parse_();
1451 if (s6 !== peg$FAILED) {
1452 s7 = peg$parseOperandParens();
1453 if (s7 !== peg$FAILED) {
1454 peg$savedPos = s3;
1455 s4 = peg$c9(s1, s7);
1456 s3 = s4;
1457 } else {
1458 peg$currPos = s3;
1459 s3 = peg$FAILED;
1460 }
1461 } else {
1462 peg$currPos = s3;
1463 s3 = peg$FAILED;
1464 }
1465 } else {
1466 peg$currPos = s3;
1467 s3 = peg$FAILED;
1468 }
1469 } else {
1470 peg$currPos = s3;
1471 s3 = peg$FAILED;
1472 }
1473 }
1474 if (s2 !== peg$FAILED) {
1475 peg$savedPos = s0;
1476 s1 = peg$c10(s1, s2);
1477 s0 = s1;
1478 } else {
1479 peg$currPos = s0;
1480 s0 = peg$FAILED;
1481 }
1482 } else {
1483 peg$currPos = s0;
1484 s0 = peg$FAILED;
1485 }
1486
1487 return s0;
1488 }
1489
1490 function peg$parseExpressionAttributeName() {
1491 var s0, s1, s2, s3, s4;
1492
1493 s0 = peg$currPos;
1494 s1 = peg$currPos;
1495 peg$silentFails++;
1496 s2 = peg$parseReservedWord();
1497 peg$silentFails--;
1498 if (s2 === peg$FAILED) {
1499 s1 = void 0;
1500 } else {
1501 peg$currPos = s1;
1502 s1 = peg$FAILED;
1503 }
1504 if (s1 !== peg$FAILED) {
1505 if (input.charCodeAt(peg$currPos) === 35) {
1506 s2 = peg$c30;
1507 peg$currPos++;
1508 } else {
1509 s2 = peg$FAILED;
1510 if (peg$silentFails === 0) { peg$fail(peg$c31); }
1511 }
1512 if (s2 !== peg$FAILED) {
1513 s3 = [];
1514 s4 = peg$parseIdentifierPart();
1515 while (s4 !== peg$FAILED) {
1516 s3.push(s4);
1517 s4 = peg$parseIdentifierPart();
1518 }
1519 if (s3 !== peg$FAILED) {
1520 peg$savedPos = s0;
1521 s1 = peg$c32(s2, s3);
1522 s0 = s1;
1523 } else {
1524 peg$currPos = s0;
1525 s0 = peg$FAILED;
1526 }
1527 } else {
1528 peg$currPos = s0;
1529 s0 = peg$FAILED;
1530 }
1531 } else {
1532 peg$currPos = s0;
1533 s0 = peg$FAILED;
1534 }
1535
1536 return s0;
1537 }
1538
1539 function peg$parseExpressionAttributeValue() {
1540 var s0, s1, s2, s3, s4;
1541
1542 s0 = peg$currPos;
1543 s1 = peg$currPos;
1544 peg$silentFails++;
1545 s2 = peg$parseReservedWord();
1546 peg$silentFails--;
1547 if (s2 === peg$FAILED) {
1548 s1 = void 0;
1549 } else {
1550 peg$currPos = s1;
1551 s1 = peg$FAILED;
1552 }
1553 if (s1 !== peg$FAILED) {
1554 if (input.charCodeAt(peg$currPos) === 58) {
1555 s2 = peg$c33;
1556 peg$currPos++;
1557 } else {
1558 s2 = peg$FAILED;
1559 if (peg$silentFails === 0) { peg$fail(peg$c34); }
1560 }
1561 if (s2 !== peg$FAILED) {
1562 s3 = [];
1563 s4 = peg$parseIdentifierPart();
1564 while (s4 !== peg$FAILED) {
1565 s3.push(s4);
1566 s4 = peg$parseIdentifierPart();
1567 }
1568 if (s3 !== peg$FAILED) {
1569 peg$savedPos = s0;
1570 s1 = peg$c35(s2, s3);
1571 s0 = s1;
1572 } else {
1573 peg$currPos = s0;
1574 s0 = peg$FAILED;
1575 }
1576 } else {
1577 peg$currPos = s0;
1578 s0 = peg$FAILED;
1579 }
1580 } else {
1581 peg$currPos = s0;
1582 s0 = peg$FAILED;
1583 }
1584
1585 return s0;
1586 }
1587
1588 function peg$parsePathExpression() {
1589 var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
1590
1591 s0 = peg$currPos;
1592 s1 = peg$parseIdentifier();
1593 if (s1 !== peg$FAILED) {
1594 s2 = [];
1595 s3 = peg$currPos;
1596 s4 = peg$parse_();
1597 if (s4 !== peg$FAILED) {
1598 if (input.charCodeAt(peg$currPos) === 91) {
1599 s5 = peg$c36;
1600 peg$currPos++;
1601 } else {
1602 s5 = peg$FAILED;
1603 if (peg$silentFails === 0) { peg$fail(peg$c37); }
1604 }
1605 if (s5 !== peg$FAILED) {
1606 s6 = peg$parse_();
1607 if (s6 !== peg$FAILED) {
1608 s7 = [];
1609 if (peg$c38.test(input.charAt(peg$currPos))) {
1610 s8 = input.charAt(peg$currPos);
1611 peg$currPos++;
1612 } else {
1613 s8 = peg$FAILED;
1614 if (peg$silentFails === 0) { peg$fail(peg$c39); }
1615 }
1616 if (s8 !== peg$FAILED) {
1617 while (s8 !== peg$FAILED) {
1618 s7.push(s8);
1619 if (peg$c38.test(input.charAt(peg$currPos))) {
1620 s8 = input.charAt(peg$currPos);
1621 peg$currPos++;
1622 } else {
1623 s8 = peg$FAILED;
1624 if (peg$silentFails === 0) { peg$fail(peg$c39); }
1625 }
1626 }
1627 } else {
1628 s7 = peg$FAILED;
1629 }
1630 if (s7 !== peg$FAILED) {
1631 s8 = peg$parse_();
1632 if (s8 !== peg$FAILED) {
1633 if (input.charCodeAt(peg$currPos) === 93) {
1634 s9 = peg$c40;
1635 peg$currPos++;
1636 } else {
1637 s9 = peg$FAILED;
1638 if (peg$silentFails === 0) { peg$fail(peg$c41); }
1639 }
1640 if (s9 !== peg$FAILED) {
1641 peg$savedPos = s3;
1642 s4 = peg$c42(s1, s7);
1643 s3 = s4;
1644 } else {
1645 peg$currPos = s3;
1646 s3 = peg$FAILED;
1647 }
1648 } else {
1649 peg$currPos = s3;
1650 s3 = peg$FAILED;
1651 }
1652 } else {
1653 peg$currPos = s3;
1654 s3 = peg$FAILED;
1655 }
1656 } else {
1657 peg$currPos = s3;
1658 s3 = peg$FAILED;
1659 }
1660 } else {
1661 peg$currPos = s3;
1662 s3 = peg$FAILED;
1663 }
1664 } else {
1665 peg$currPos = s3;
1666 s3 = peg$FAILED;
1667 }
1668 if (s3 === peg$FAILED) {
1669 s3 = peg$currPos;
1670 s4 = peg$parse_();
1671 if (s4 !== peg$FAILED) {
1672 if (input.charCodeAt(peg$currPos) === 46) {
1673 s5 = peg$c43;
1674 peg$currPos++;
1675 } else {
1676 s5 = peg$FAILED;
1677 if (peg$silentFails === 0) { peg$fail(peg$c44); }
1678 }
1679 if (s5 !== peg$FAILED) {
1680 s6 = peg$parse_();
1681 if (s6 !== peg$FAILED) {
1682 s7 = peg$parseIdentifier();
1683 if (s7 !== peg$FAILED) {
1684 peg$savedPos = s3;
1685 s4 = peg$c45(s1, s7);
1686 s3 = s4;
1687 } else {
1688 peg$currPos = s3;
1689 s3 = peg$FAILED;
1690 }
1691 } else {
1692 peg$currPos = s3;
1693 s3 = peg$FAILED;
1694 }
1695 } else {
1696 peg$currPos = s3;
1697 s3 = peg$FAILED;
1698 }
1699 } else {
1700 peg$currPos = s3;
1701 s3 = peg$FAILED;
1702 }
1703 }
1704 while (s3 !== peg$FAILED) {
1705 s2.push(s3);
1706 s3 = peg$currPos;
1707 s4 = peg$parse_();
1708 if (s4 !== peg$FAILED) {
1709 if (input.charCodeAt(peg$currPos) === 91) {
1710 s5 = peg$c36;
1711 peg$currPos++;
1712 } else {
1713 s5 = peg$FAILED;
1714 if (peg$silentFails === 0) { peg$fail(peg$c37); }
1715 }
1716 if (s5 !== peg$FAILED) {
1717 s6 = peg$parse_();
1718 if (s6 !== peg$FAILED) {
1719 s7 = [];
1720 if (peg$c38.test(input.charAt(peg$currPos))) {
1721 s8 = input.charAt(peg$currPos);
1722 peg$currPos++;
1723 } else {
1724 s8 = peg$FAILED;
1725 if (peg$silentFails === 0) { peg$fail(peg$c39); }
1726 }
1727 if (s8 !== peg$FAILED) {
1728 while (s8 !== peg$FAILED) {
1729 s7.push(s8);
1730 if (peg$c38.test(input.charAt(peg$currPos))) {
1731 s8 = input.charAt(peg$currPos);
1732 peg$currPos++;
1733 } else {
1734 s8 = peg$FAILED;
1735 if (peg$silentFails === 0) { peg$fail(peg$c39); }
1736 }
1737 }
1738 } else {
1739 s7 = peg$FAILED;
1740 }
1741 if (s7 !== peg$FAILED) {
1742 s8 = peg$parse_();
1743 if (s8 !== peg$FAILED) {
1744 if (input.charCodeAt(peg$currPos) === 93) {
1745 s9 = peg$c40;
1746 peg$currPos++;
1747 } else {
1748 s9 = peg$FAILED;
1749 if (peg$silentFails === 0) { peg$fail(peg$c41); }
1750 }
1751 if (s9 !== peg$FAILED) {
1752 peg$savedPos = s3;
1753 s4 = peg$c42(s1, s7);
1754 s3 = s4;
1755 } else {
1756 peg$currPos = s3;
1757 s3 = peg$FAILED;
1758 }
1759 } else {
1760 peg$currPos = s3;
1761 s3 = peg$FAILED;
1762 }
1763 } else {
1764 peg$currPos = s3;
1765 s3 = peg$FAILED;
1766 }
1767 } else {
1768 peg$currPos = s3;
1769 s3 = peg$FAILED;
1770 }
1771 } else {
1772 peg$currPos = s3;
1773 s3 = peg$FAILED;
1774 }
1775 } else {
1776 peg$currPos = s3;
1777 s3 = peg$FAILED;
1778 }
1779 if (s3 === peg$FAILED) {
1780 s3 = peg$currPos;
1781 s4 = peg$parse_();
1782 if (s4 !== peg$FAILED) {
1783 if (input.charCodeAt(peg$currPos) === 46) {
1784 s5 = peg$c43;
1785 peg$currPos++;
1786 } else {
1787 s5 = peg$FAILED;
1788 if (peg$silentFails === 0) { peg$fail(peg$c44); }
1789 }
1790 if (s5 !== peg$FAILED) {
1791 s6 = peg$parse_();
1792 if (s6 !== peg$FAILED) {
1793 s7 = peg$parseIdentifier();
1794 if (s7 !== peg$FAILED) {
1795 peg$savedPos = s3;
1796 s4 = peg$c45(s1, s7);
1797 s3 = s4;
1798 } else {
1799 peg$currPos = s3;
1800 s3 = peg$FAILED;
1801 }
1802 } else {
1803 peg$currPos = s3;
1804 s3 = peg$FAILED;
1805 }
1806 } else {
1807 peg$currPos = s3;
1808 s3 = peg$FAILED;
1809 }
1810 } else {
1811 peg$currPos = s3;
1812 s3 = peg$FAILED;
1813 }
1814 }
1815 }
1816 if (s2 !== peg$FAILED) {
1817 peg$savedPos = s0;
1818 s1 = peg$c46(s1, s2);
1819 s0 = s1;
1820 } else {
1821 peg$currPos = s0;
1822 s0 = peg$FAILED;
1823 }
1824 } else {
1825 peg$currPos = s0;
1826 s0 = peg$FAILED;
1827 }
1828
1829 return s0;
1830 }
1831
1832 function peg$parseIdentifier() {
1833 var s0, s1, s2, s3, s4;
1834
1835 s0 = peg$currPos;
1836 s1 = peg$currPos;
1837 peg$silentFails++;
1838 s2 = peg$parseReservedWord();
1839 peg$silentFails--;
1840 if (s2 === peg$FAILED) {
1841 s1 = void 0;
1842 } else {
1843 peg$currPos = s1;
1844 s1 = peg$FAILED;
1845 }
1846 if (s1 !== peg$FAILED) {
1847 s2 = peg$parseIdentifierStart();
1848 if (s2 !== peg$FAILED) {
1849 s3 = [];
1850 s4 = peg$parseIdentifierPart();
1851 while (s4 !== peg$FAILED) {
1852 s3.push(s4);
1853 s4 = peg$parseIdentifierPart();
1854 }
1855 if (s3 !== peg$FAILED) {
1856 peg$savedPos = s0;
1857 s1 = peg$c47(s2, s3);
1858 s0 = s1;
1859 } else {
1860 peg$currPos = s0;
1861 s0 = peg$FAILED;
1862 }
1863 } else {
1864 peg$currPos = s0;
1865 s0 = peg$FAILED;
1866 }
1867 } else {
1868 peg$currPos = s0;
1869 s0 = peg$FAILED;
1870 }
1871 if (s0 === peg$FAILED) {
1872 s0 = peg$parseExpressionAttributeName();
1873 }
1874
1875 return s0;
1876 }
1877
1878 function peg$parseIdentifierStart() {
1879 var s0;
1880
1881 if (peg$c48.test(input.charAt(peg$currPos))) {
1882 s0 = input.charAt(peg$currPos);
1883 peg$currPos++;
1884 } else {
1885 s0 = peg$FAILED;
1886 if (peg$silentFails === 0) { peg$fail(peg$c49); }
1887 }
1888 if (s0 === peg$FAILED) {
1889 if (input.charCodeAt(peg$currPos) === 95) {
1890 s0 = peg$c50;
1891 peg$currPos++;
1892 } else {
1893 s0 = peg$FAILED;
1894 if (peg$silentFails === 0) { peg$fail(peg$c51); }
1895 }
1896 }
1897
1898 return s0;
1899 }
1900
1901 function peg$parseIdentifierPart() {
1902 var s0;
1903
1904 s0 = peg$parseIdentifierStart();
1905 if (s0 === peg$FAILED) {
1906 if (peg$c38.test(input.charAt(peg$currPos))) {
1907 s0 = input.charAt(peg$currPos);
1908 peg$currPos++;
1909 } else {
1910 s0 = peg$FAILED;
1911 if (peg$silentFails === 0) { peg$fail(peg$c39); }
1912 }
1913 }
1914
1915 return s0;
1916 }
1917
1918 function peg$parseAttributePart() {
1919 var s0;
1920
1921 s0 = peg$parseIdentifierPart();
1922 if (s0 === peg$FAILED) {
1923 if (input.charCodeAt(peg$currPos) === 35) {
1924 s0 = peg$c30;
1925 peg$currPos++;
1926 } else {
1927 s0 = peg$FAILED;
1928 if (peg$silentFails === 0) { peg$fail(peg$c31); }
1929 }
1930 if (s0 === peg$FAILED) {
1931 if (input.charCodeAt(peg$currPos) === 58) {
1932 s0 = peg$c33;
1933 peg$currPos++;
1934 } else {
1935 s0 = peg$FAILED;
1936 if (peg$silentFails === 0) { peg$fail(peg$c34); }
1937 }
1938 }
1939 }
1940
1941 return s0;
1942 }
1943
1944 function peg$parseReservedWord() {
1945 var s0;
1946
1947 s0 = peg$parseSetToken();
1948 if (s0 === peg$FAILED) {
1949 s0 = peg$parseRemoveToken();
1950 if (s0 === peg$FAILED) {
1951 s0 = peg$parseAddToken();
1952 if (s0 === peg$FAILED) {
1953 s0 = peg$parseDeleteToken();
1954 }
1955 }
1956 }
1957
1958 return s0;
1959 }
1960
1961 function peg$parseSetToken() {
1962 var s0, s1, s2, s3;
1963
1964 s0 = peg$currPos;
1965 if (input.substr(peg$currPos, 3).toLowerCase() === peg$c52) {
1966 s1 = input.substr(peg$currPos, 3);
1967 peg$currPos += 3;
1968 } else {
1969 s1 = peg$FAILED;
1970 if (peg$silentFails === 0) { peg$fail(peg$c53); }
1971 }
1972 if (s1 !== peg$FAILED) {
1973 s2 = peg$currPos;
1974 peg$silentFails++;
1975 s3 = peg$parseAttributePart();
1976 peg$silentFails--;
1977 if (s3 === peg$FAILED) {
1978 s2 = void 0;
1979 } else {
1980 peg$currPos = s2;
1981 s2 = peg$FAILED;
1982 }
1983 if (s2 !== peg$FAILED) {
1984 s1 = [s1, s2];
1985 s0 = s1;
1986 } else {
1987 peg$currPos = s0;
1988 s0 = peg$FAILED;
1989 }
1990 } else {
1991 peg$currPos = s0;
1992 s0 = peg$FAILED;
1993 }
1994
1995 return s0;
1996 }
1997
1998 function peg$parseRemoveToken() {
1999 var s0, s1, s2, s3;
2000
2001 s0 = peg$currPos;
2002 if (input.substr(peg$currPos, 6).toLowerCase() === peg$c54) {
2003 s1 = input.substr(peg$currPos, 6);
2004 peg$currPos += 6;
2005 } else {
2006 s1 = peg$FAILED;
2007 if (peg$silentFails === 0) { peg$fail(peg$c55); }
2008 }
2009 if (s1 !== peg$FAILED) {
2010 s2 = peg$currPos;
2011 peg$silentFails++;
2012 s3 = peg$parseAttributePart();
2013 peg$silentFails--;
2014 if (s3 === peg$FAILED) {
2015 s2 = void 0;
2016 } else {
2017 peg$currPos = s2;
2018 s2 = peg$FAILED;
2019 }
2020 if (s2 !== peg$FAILED) {
2021 s1 = [s1, s2];
2022 s0 = s1;
2023 } else {
2024 peg$currPos = s0;
2025 s0 = peg$FAILED;
2026 }
2027 } else {
2028 peg$currPos = s0;
2029 s0 = peg$FAILED;
2030 }
2031
2032 return s0;
2033 }
2034
2035 function peg$parseAddToken() {
2036 var s0, s1, s2, s3;
2037
2038 s0 = peg$currPos;
2039 if (input.substr(peg$currPos, 3).toLowerCase() === peg$c56) {
2040 s1 = input.substr(peg$currPos, 3);
2041 peg$currPos += 3;
2042 } else {
2043 s1 = peg$FAILED;
2044 if (peg$silentFails === 0) { peg$fail(peg$c57); }
2045 }
2046 if (s1 !== peg$FAILED) {
2047 s2 = peg$currPos;
2048 peg$silentFails++;
2049 s3 = peg$parseAttributePart();
2050 peg$silentFails--;
2051 if (s3 === peg$FAILED) {
2052 s2 = void 0;
2053 } else {
2054 peg$currPos = s2;
2055 s2 = peg$FAILED;
2056 }
2057 if (s2 !== peg$FAILED) {
2058 s1 = [s1, s2];
2059 s0 = s1;
2060 } else {
2061 peg$currPos = s0;
2062 s0 = peg$FAILED;
2063 }
2064 } else {
2065 peg$currPos = s0;
2066 s0 = peg$FAILED;
2067 }
2068
2069 return s0;
2070 }
2071
2072 function peg$parseDeleteToken() {
2073 var s0, s1, s2, s3;
2074
2075 s0 = peg$currPos;
2076 if (input.substr(peg$currPos, 6).toLowerCase() === peg$c58) {
2077 s1 = input.substr(peg$currPos, 6);
2078 peg$currPos += 6;
2079 } else {
2080 s1 = peg$FAILED;
2081 if (peg$silentFails === 0) { peg$fail(peg$c59); }
2082 }
2083 if (s1 !== peg$FAILED) {
2084 s2 = peg$currPos;
2085 peg$silentFails++;
2086 s3 = peg$parseAttributePart();
2087 peg$silentFails--;
2088 if (s3 === peg$FAILED) {
2089 s2 = void 0;
2090 } else {
2091 peg$currPos = s2;
2092 s2 = peg$FAILED;
2093 }
2094 if (s2 !== peg$FAILED) {
2095 s1 = [s1, s2];
2096 s0 = s1;
2097 } else {
2098 peg$currPos = s0;
2099 s0 = peg$FAILED;
2100 }
2101 } else {
2102 peg$currPos = s0;
2103 s0 = peg$FAILED;
2104 }
2105
2106 return s0;
2107 }
2108
2109 function peg$parse_() {
2110 var s0, s1;
2111
2112 peg$silentFails++;
2113 s0 = [];
2114 if (peg$c61.test(input.charAt(peg$currPos))) {
2115 s1 = input.charAt(peg$currPos);
2116 peg$currPos++;
2117 } else {
2118 s1 = peg$FAILED;
2119 if (peg$silentFails === 0) { peg$fail(peg$c62); }
2120 }
2121 while (s1 !== peg$FAILED) {
2122 s0.push(s1);
2123 if (peg$c61.test(input.charAt(peg$currPos))) {
2124 s1 = input.charAt(peg$currPos);
2125 peg$currPos++;
2126 } else {
2127 s1 = peg$FAILED;
2128 if (peg$silentFails === 0) { peg$fail(peg$c62); }
2129 }
2130 }
2131 peg$silentFails--;
2132 if (s0 === peg$FAILED) {
2133 s1 = peg$FAILED;
2134 if (peg$silentFails === 0) { peg$fail(peg$c60); }
2135 }
2136
2137 return s0;
2138 }
2139
2140
2141 // Declared by PEG: input, options, parser, text(), location(), expected(), error()
2142
2143 var context = options.context
2144 var attrNames = context.attrNames || Object.create(null)
2145 var attrVals = context.attrVals || Object.create(null)
2146 var unusedAttrNames = context.unusedAttrNames || Object.create(null)
2147 var unusedAttrVals = context.unusedAttrVals || Object.create(null)
2148 var isReserved = context.isReserved
2149 var errors = Object.create(null)
2150 var sections = Object.create(null)
2151 var paths = []
2152 var nestedPaths = Object.create(null)
2153
2154 function checkReserved(name) {
2155 if (isReserved(name) && !errors.reserved) {
2156 errors.reserved = 'Attribute name is a reserved keyword; reserved keyword: ' + name
2157 }
2158 }
2159
2160 function checkFunction(name, args) {
2161 if (errors.unknownFunction) {
2162 return
2163 }
2164 var functions = {
2165 'if_not_exists': 2,
2166 'list_append': 2,
2167 '+': 2,
2168 '-': 2,
2169 }
2170 var numOperands = functions[name]
2171 if (numOperands == null) {
2172 errors.unknownFunction = 'Invalid function name; function: ' + name
2173 return
2174 }
2175 if (errors.function) {
2176 return
2177 }
2178 if (numOperands != args.length) {
2179 errors.function = 'Incorrect number of operands for operator or function; ' +
2180 'operator or function: ' + name + ', number of operands: ' + args.length
2181 return
2182 }
2183 switch (name) {
2184 case 'if_not_exists':
2185 if (!Array.isArray(args[0])) {
2186 errors.function = 'Operator or function requires a document path; ' +
2187 'operator or function: ' + name
2188 return
2189 }
2190 return getType(args[1])
2191 case 'list_append':
2192 for (var i = 0; i < args.length; i++) {
2193 var type = getImmediateType(args[i])
2194 if (type && type != 'L') {
2195 errors.function = 'Incorrect operand type for operator or function; ' +
2196 'operator or function: ' + name + ', operand type: ' + type
2197 return
2198 }
2199 }
2200 return 'L'
2201 case '+':
2202 case '-':
2203 for (var i = 0; i < args.length; i++) {
2204 var type = getImmediateType(args[i])
2205 if (type && type != 'N') {
2206 errors.function = 'Incorrect operand type for operator or function; ' +
2207 'operator or function: ' + name + ', operand type: ' + type
2208 return
2209 }
2210 }
2211 return 'N'
2212 }
2213 }
2214
2215 function checkSection(type) {
2216 if (errors.section) {
2217 return
2218 }
2219 if (sections[type]) {
2220 errors.section = 'The "' + type + '" section can only be used once in an update expression;'
2221 return
2222 }
2223 sections[type] = true
2224 }
2225
2226 function resolveAttrName(name) {
2227 if (errors.attrName) {
2228 return
2229 }
2230 if (!attrNames[name]) {
2231 errors.attrName = 'An expression attribute name used in the document path is not defined; attribute name: ' + name
2232 return
2233 }
2234 delete unusedAttrNames[name]
2235 return attrNames[name]
2236 }
2237
2238 function resolveAttrVal(name) {
2239 if (errors.attrVal) {
2240 return
2241 }
2242 if (!attrVals[name]) {
2243 errors.attrVal = 'An expression attribute value used in expression is not defined; attribute value: ' + name
2244 return
2245 }
2246 delete unusedAttrVals[name]
2247 return attrVals[name]
2248 }
2249
2250 function checkPath(path) {
2251 if (errors.pathOverlap || !Array.isArray(path)) {
2252 return
2253 }
2254 for (var i = 0; i < paths.length; i++) {
2255 checkPaths(paths[i], path)
2256 if (errors.pathOverlap) {
2257 return
2258 }
2259 }
2260 paths.push(path)
2261 }
2262
2263 function checkPaths(path1, path2) {
2264 for (var i = 0; i < path1.length && i < path2.length; i++) {
2265 if (typeof path1[i] !== typeof path2[i]) {
2266 errors.pathConflict = 'Two document paths conflict with each other; ' +
2267 'must remove or rewrite one of these paths; path one: ' + pathStr(path1) + ', path two: ' + pathStr(path2)
2268 return
2269 }
2270 if (path1[i] !== path2[i]) return
2271 }
2272 if (errors.pathOverlap) {
2273 return
2274 }
2275 errors.pathOverlap = 'Two document paths overlap with each other; ' +
2276 'must remove or rewrite one of these paths; path one: ' + pathStr(path1) + ', path two: ' + pathStr(path2)
2277 }
2278
2279 function pathStr(path) {
2280 return '[' + path.map(function(piece) {
2281 return typeof piece == 'number' ? '[' + piece + ']' : piece
2282 }).join(', ') + ']'
2283 }
2284
2285 function checkOperator(operator, val) {
2286 if (errors.operand || !val) {
2287 return
2288 }
2289 var typeMappings = {
2290 S: 'STRING',
2291 N: 'NUMBER',
2292 B: 'BINARY',
2293 NULL: 'NULL',
2294 BOOL: 'BOOLEAN',
2295 L: 'LIST',
2296 M: 'MAP',
2297 }
2298 var type = getImmediateType(val)
2299 if (typeMappings[type] && !(operator == 'ADD' && type == 'N')) {
2300 errors.operand = 'Incorrect operand type for operator or function; operator: ' +
2301 operator + ', operand type: ' + typeMappings[type]
2302 }
2303 return type
2304 }
2305
2306 function getType(val) {
2307 if (!val || typeof val != 'object' || Array.isArray(val)) return null
2308 if (val.attrType) return val.attrType
2309 return getImmediateType(val)
2310 }
2311
2312 function getImmediateType(val) {
2313 if (!val || typeof val != 'object' || Array.isArray(val) || val.attrType) return null
2314 var types = ['S', 'N', 'B', 'NULL', 'BOOL', 'SS', 'NS', 'BS', 'L', 'M']
2315 for (var i = 0; i < types.length; i++) {
2316 if (val[types[i]] != null) return types[i]
2317 }
2318 return null
2319 }
2320
2321 function checkErrors() {
2322 var errorOrder = ['reserved', 'unknownFunction', 'section', 'attrName',
2323 'attrVal', 'pathOverlap', 'pathConflict', 'operand', 'function']
2324 for (var i = 0; i < errorOrder.length; i++) {
2325 if (errors[errorOrder[i]]) return errors[errorOrder[i]]
2326 }
2327 return null
2328 }
2329
2330
2331 peg$result = peg$startRuleFunction();
2332
2333 if (peg$result !== peg$FAILED && peg$currPos === input.length) {
2334 return peg$result;
2335 } else {
2336 if (peg$result !== peg$FAILED && peg$currPos < input.length) {
2337 peg$fail(peg$endExpectation());
2338 }
2339
2340 throw peg$buildStructuredError(
2341 peg$maxFailExpected,
2342 peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
2343 peg$maxFailPos < input.length
2344 ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
2345 : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
2346 );
2347 }
2348}
2349
2350module.exports = {
2351 SyntaxError: peg$SyntaxError,
2352 parse: peg$parse
2353};