wikipeg 6.0.0 → 6.1.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.
package/HISTORY.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Release History
2
2
 
3
+ ## 6.1.0 (2026-02-13)
4
+ * Add 'labeled expression parameter' which allows parameterizing a rule
5
+ by the (string) value of a labeled expression. This is particularly
6
+ useful for parsing matched syntax elements, like XML tags.
7
+ * Add the ability to assert that a parameter has a specific value.
8
+ Previously assertions were limited to truthy/falsey.
9
+ * Add `optimizePureActions` option to the PEG compiler which enables an
10
+ optimization to skip execution of rule action blocks whose values
11
+ are never used. A new `[pure]` rule attribute can enable or disable
12
+ this optimization on an individual rule. For example,
13
+ `[pure=false]` ensures execution of that rule's action block(s) on a
14
+ successful match, even if the rule result is discarded.
15
+
3
16
  ## 6.0.0 (2025-08-14)
4
17
  * Bump minimum required PHP version to 8.1
5
18
  * Zero-or-more or one-or-more repetitions of character classes are now
package/README.md CHANGED
@@ -128,6 +128,11 @@ object to `PEG.buildParser`. The following options are supported:
128
128
  determine that a rule can not match. This can affect failure
129
129
  reporting, since we might be able to fail on a parent rule before
130
130
  actually recursing into the child responsible.
131
+ * `optimizePureActions` = if `true`, defaults to enabling a rule
132
+ optimization which skips executing rule action blocks if the
133
+ result of that rule will not be used. This can be enabled or
134
+ disabled for individual rules via the `[pure]` rule attribute
135
+ described below.
131
136
  * `cacheInitHook` and `cacheRuleHook` — functions to generate custom cache
132
137
  control code
133
138
  * `allowedStartRules` — rules the parser will be allowed to start parsing from
@@ -561,6 +566,19 @@ Marks a rule as unreachable. If the `allowUselessChoice` option is
561
566
  false, this attribute permits a reference to the rule in a choice even
562
567
  if a previous option in the choice appears to always match.
563
568
 
569
+ #### [pure]
570
+
571
+ Marks a rule as not having side effects in its action blocks. This
572
+ allows action blocks in rules which have this attribute set to be
573
+ skipped (not executed) when the value of the rule is not needed.
574
+
575
+ #### [pure=false]
576
+
577
+ Marks a rule as having side effects in its action blocks. If the
578
+ `optimizePureActions` option is given to the parser, this ensures that
579
+ the action blocks for this rule are executed even if the value of
580
+ the rule is not needed.
581
+
564
582
  Rule parameter syntax
565
583
  ---------------------
566
584
 
@@ -571,11 +589,12 @@ All parameters referenced in the grammar have an initial value and can
571
589
  be used before their first assignment.
572
590
 
573
591
  Parameters have a type detected at compile time: boolean, integer,
574
- string or reference. Initial values for each type are:
592
+ string, reference, or labeled expression. Initial values for each type are:
575
593
  - boolean: false
576
594
  - integer: 0
577
595
  - string: ""
578
596
  - reference: null
597
+ - labeled expression: null (or the integer or string default value)
579
598
 
580
599
  The parameter namespace is global, but the value of a parameter reverts
581
600
  to its previous value after termination of the assigning rule reference.
@@ -590,6 +609,15 @@ Assert that the parameter "x" is true or nonzero
590
609
 
591
610
  Assert that the parameter "x" is false or zero
592
611
 
612
+ #### & < *parameter* == *value* >
613
+
614
+ Assert that the parameter "x" has the specified value.
615
+
616
+ #### ! < *parameter* == *value* >
617
+ #### & < *parameter* != *value* >
618
+
619
+ Assert that the parameter "x" does not have the specified value.
620
+
593
621
  #### *rule* < *parameter* = true >
594
622
 
595
623
  Match a parsing expression of a rule recursively, and assign *parameter* to
@@ -615,6 +643,14 @@ Assign x = x + 1.
615
643
 
616
644
  String assignment.
617
645
 
646
+ #### *rule* < *parameter* = $*label* >
647
+
648
+ Assign the value of the given labeled expression to the parameter.
649
+
650
+ Labeled expression parameters can't be intermixed with boolean
651
+ assignments to the same parameter, but they can co-exist with
652
+ integer or string assignments to the parameter.
653
+
618
654
  #### *rule* < & *parameter* = 1 >
619
655
 
620
656
  Create a reference (in/out) parameter and give it an initial value of 1.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 6.0.0
1
+ 6.1.0
@@ -43,8 +43,8 @@ let php = {
43
43
  maxFailPos: '$this->maxFailPos',
44
44
  assertionSuccess: 'false',
45
45
  inputLength: '$this->inputLength',
46
- advanceInputChar: 'self::advanceChar($this->input, $this->currPos);',
47
- consumeInputChar: 'self::consumeChar($this->input, $this->currPos);',
46
+ advanceInputChar: 'self::advanceChar($this->input, $this->currPos)',
47
+ consumeInputChar: 'self::consumeChar($this->input, $this->currPos)',
48
48
  result: '$result',
49
49
  actionArgPrefix: '$',
50
50
 
@@ -12,8 +12,14 @@ function analyzeParams(ast, options) {
12
12
 
13
13
  function registerParamType(name, type, location) {
14
14
  var paramInfo = getParamInfo(name);
15
- if (paramInfo.type !== undefined) {
16
- if (paramInfo.type !== type) {
15
+ if (
16
+ (paramInfo.type === 'labeled' && type === 'boolean') ||
17
+ (paramInfo.type === 'boolean' && type === 'labeled')
18
+ ){
19
+ throw new GrammarError("Labeled expression parameters can't also be boolean: " + name, location);
20
+ }
21
+ if (paramInfo.type !== undefined && paramInfo.type !== 'labeled') {
22
+ if (paramInfo.type !== type && type !== 'labeled') {
17
23
  throw new GrammarError("Type conflict in parameter " + name, location);
18
24
  }
19
25
  } else {
@@ -133,7 +139,17 @@ function analyzeParams(ast, options) {
133
139
  (new Traverser(ast, refScopeHandlers))
134
140
  .traverse(targetNode, assignment.name, refScope);
135
141
  }
136
- }
142
+ },
143
+ parameter_and: function(node) {
144
+ if (node.assert) {
145
+ registerParamType(node.parameter, node.assert.type, node.location);
146
+ }
147
+ },
148
+ parameter_not: function(node) {
149
+ if (node.assert) {
150
+ registerParamType(node.parameter, node.assert.type, node.location);
151
+ }
152
+ },
137
153
  })(ast);
138
154
 
139
155
  // For every reference parameter, traverse the call graph of each start rule,
@@ -6,7 +6,8 @@ var js = require("../language/javascript"),
6
6
  objects = require('../../utils/objects'),
7
7
  classNode = require("../charsets").classNode,
8
8
  asts = require("../asts"),
9
- fs = require("fs");
9
+ fs = require("fs"),
10
+ GrammarError = require("../../grammar-error");
10
11
 
11
12
  function generateJavascript(ast, options) {
12
13
  /**
@@ -682,6 +683,8 @@ function generateJavascript(ast, options) {
682
683
  } else {
683
684
  return 'null';
684
685
  }
686
+ } else if (type === 'labeled') {
687
+ return 'null';
685
688
  } else {
686
689
  throw new Error('Unknown param type: ' + type);
687
690
  }
@@ -761,9 +764,31 @@ function generateJavascript(ast, options) {
761
764
  var negate = node.type === 'parameter_not';
762
765
  var reg = context.getResultReg(result);
763
766
  var paramExpression = makeParamExpression(node.paramInfo);
767
+ if (node.assert) {
768
+ if (node.assert.type === 'boolean') {
769
+ if (node.assert.value === false) {
770
+ negate = !negate;
771
+ }
772
+ if (!negate) {
773
+ paramExpression = language.toBool(paramExpression);
774
+ }
775
+ } else if (node.assert.type === 'string') {
776
+ paramExpression = `${paramExpression} === ${js.stringify(node.assert.value)}`;
777
+ } else if (node.assert.type === 'labeled') {
778
+ if (context.env[node.assert.value] === undefined) {
779
+ throw new GrammarError(
780
+ 'Unknown label "' + node.assert.value + '" for labeled-expression assertion',
781
+ node.location
782
+ );
783
+ }
784
+ paramExpression = `${paramExpression} === ${context.env[node.assert.value]}`;
785
+ } else {
786
+ paramExpression = `${paramExpression} === ${node.assert.value}`;
787
+ }
788
+ }
764
789
  if (negate) {
765
790
  result.condition = `!(${paramExpression})`;
766
- } else if (!node.paramInfo.value || node.paramInfo.value.type === 'boolean') {
791
+ } else if (node.assert || node.paramInfo.type === 'boolean') {
767
792
  result.condition = paramExpression;
768
793
  } else {
769
794
  result.condition = language.toBool(paramExpression);
@@ -1074,6 +1099,13 @@ function generateJavascript(ast, options) {
1074
1099
  let assignment = node.assignments[i];
1075
1100
  let newValue;
1076
1101
 
1102
+ if (assignment.type === 'labeled' &&
1103
+ context.env[assignment.value] === undefined) {
1104
+ throw new GrammarError(
1105
+ 'Unknown label "' + assignment.value + '" for labeled-expression parameter',
1106
+ node.location
1107
+ );
1108
+ }
1077
1109
  if (assignment.isref) {
1078
1110
  if (assignment.type === 'increment') {
1079
1111
  newValue = `${language.refParamValue(assignment.name)} + ${assignment.value}`;
@@ -1081,6 +1113,8 @@ function generateJavascript(ast, options) {
1081
1113
  newValue = assignment.value ? 'true' : 'false';
1082
1114
  } else if (assignment.type === 'string') {
1083
1115
  newValue = js.stringify(assignment.value);
1116
+ } else if (assignment.type === 'labeled') {
1117
+ newValue = context.env[assignment.value];
1084
1118
  } else {
1085
1119
  newValue = assignment.value;
1086
1120
  }
@@ -1097,6 +1131,8 @@ function generateJavascript(ast, options) {
1097
1131
  newValue = `${language.paramArgName(assignment.name)} + ${assignment.value}`;
1098
1132
  } else if (assignment.type === 'string') {
1099
1133
  newValue = js.stringify(assignment.value);
1134
+ } else if (assignment.type === 'labeled') {
1135
+ newValue = context.env[assignment.value];
1100
1136
  } else {
1101
1137
  newValue = assignment.value;
1102
1138
  }
@@ -1190,14 +1226,18 @@ function generateJavascript(ast, options) {
1190
1226
  result.block = [`${savedPos} = ${language.currPos};`];
1191
1227
  }
1192
1228
  var subresult = recurse(node.expression, newContext);
1193
- var funcId = makeActionFunc(node.code, newContext);
1229
+ var canSkipAction = context.getDiscard() && node.pure;
1230
+ var funcId = canSkipAction ? null :
1231
+ makeActionFunc(node.code, newContext);
1194
1232
  result.append(subresult);
1195
1233
  if (node.alwaysMatch) {
1196
1234
  result.condition = 'true';
1197
1235
  }
1198
1236
  result.onSuccess([
1199
1237
  `${language.savedPos} = ${savedPos};`,
1200
- `${reg} = ${makeActionCall(funcId, newContext)};`
1238
+ canSkipAction ?
1239
+ `${reg} = true;` :
1240
+ `${reg} = ${makeActionCall(funcId, newContext)};`,
1201
1241
  ]);
1202
1242
  freeReg(freePos, result);
1203
1243
  return result;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ var visitor = require("../visitor"),
4
+ asts = require("../asts");
5
+
6
+ // Propagate `pure` attribute to `action` nodes
7
+
8
+ function markPure(ast, options) {
9
+ options = options || {};
10
+ var pureDefault = false;
11
+ if (options.optimizePureActions) {
12
+ pureDefault = true;
13
+ }
14
+
15
+ const propagatePure = visitor.build({
16
+ rule: function(rule) {
17
+ var pure = asts.getRuleAttributeValue(
18
+ rule, 'pure', pureDefault
19
+ );
20
+ propagatePure(rule.expression, { pure });
21
+ },
22
+ action: function(node, result) {
23
+ node.pure = result.pure;
24
+ },
25
+ });
26
+ propagatePure(ast);
27
+ }
28
+
29
+ module.exports = markPure;
@@ -11,6 +11,7 @@ function reportUnknownAttributes(ast) {
11
11
  cache: 'boolean',
12
12
  empty: 'boolean',
13
13
  unreachable: 'boolean',
14
+ pure: 'boolean',
14
15
  };
15
16
 
16
17
  var check = visitor.build({
package/lib/compiler.js CHANGED
@@ -20,6 +20,7 @@ var compiler = {
20
20
  },
21
21
  transform: {
22
22
  removeProxyRules: require("./compiler/passes/remove-proxy-rules"),
23
+ markPure: require("./compiler/passes/mark-pure"),
23
24
  inlineSimpleRules: require("./compiler/passes/inline-simple-rules"),
24
25
  optimizeCharacterClass:
25
26
  require("./compiler/passes/optimize-character-class"),
package/lib/parser.js CHANGED
@@ -377,20 +377,23 @@ function peg$parse(input, options = {}) {
377
377
  var peg$c7 = {"type":"literal","value":"]","description":"\"]\""};
378
378
  var peg$c8 = {"type":"literal","value":"/","description":"\"/\""};
379
379
  var peg$c9 = {"type":"class","value":"[0-9]","description":"[0-9]"};
380
- var peg$c10 = {"type":"literal","value":"@","description":"\"@\""};
381
- var peg$c11 = {"type":"literal","value":":","description":"\":\""};
382
- var peg$c12 = {"type":"literal","value":"<","description":"\"<\""};
383
- var peg$c13 = {"type":"literal","value":"&","description":"\"&\""};
384
- var peg$c14 = {"type":"literal","value":">","description":"\">\""};
385
- var peg$c15 = {"type":"class","value":"\"$\", \"&\" or \"!\"","description":"\"$\", \"&\" or \"!\""};
386
- var peg$c16 = {"type":"literal","value":"(","description":"\"(\""};
387
- var peg$c17 = {"type":"literal","value":")","description":"\")\""};
388
- var peg$c18 = {"type":"class","value":"\"?\", \"*\" or \"+\"","description":"\"?\", \"*\" or \"+\""};
389
- var peg$c19 = {"type":"other","description":"literal"};
390
- var peg$c20 = {"type":"other","description":"character class"};
391
- var peg$c21 = {"type":"literal","value":".","description":"\".\""};
392
- var peg$c22 = {"type":"class","value":"\"&\" or \"!\"","description":"\"&\" or \"!\""};
393
- var peg$c23 = {"type":"literal","value":"++","description":"\"++\""};
380
+ var peg$c10 = {"type":"literal","value":"$","description":"\"$\""};
381
+ var peg$c11 = {"type":"literal","value":"@","description":"\"@\""};
382
+ var peg$c12 = {"type":"literal","value":":","description":"\":\""};
383
+ var peg$c13 = {"type":"literal","value":"<","description":"\"<\""};
384
+ var peg$c14 = {"type":"literal","value":"&","description":"\"&\""};
385
+ var peg$c15 = {"type":"literal","value":">","description":"\">\""};
386
+ var peg$c16 = {"type":"class","value":"\"$\", \"&\" or \"!\"","description":"\"$\", \"&\" or \"!\""};
387
+ var peg$c17 = {"type":"literal","value":"(","description":"\"(\""};
388
+ var peg$c18 = {"type":"literal","value":")","description":"\")\""};
389
+ var peg$c19 = {"type":"class","value":"\"?\", \"*\" or \"+\"","description":"\"?\", \"*\" or \"+\""};
390
+ var peg$c20 = {"type":"other","description":"literal"};
391
+ var peg$c21 = {"type":"other","description":"character class"};
392
+ var peg$c22 = {"type":"literal","value":".","description":"\".\""};
393
+ var peg$c23 = {"type":"class","value":"\"&\" or \"!\"","description":"\"&\" or \"!\""};
394
+ var peg$c24 = {"type":"literal","value":"==","description":"\"==\""};
395
+ var peg$c25 = {"type":"literal","value":"!=","description":"\"!=\""};
396
+ var peg$c26 = {"type":"literal","value":"++","description":"\"++\""};
394
397
 
395
398
  // actions
396
399
  function peg$a0(initializer, rules) {
@@ -555,7 +558,15 @@ function peg$parse(input, options = {}) {
555
558
  };
556
559
 
557
560
  }
558
- function peg$a20(p, el) {
561
+ function peg$a20(name) {
562
+
563
+ return {
564
+ type: "labeled",
565
+ value: name
566
+ };
567
+
568
+ }
569
+ function peg$a21(p, el) {
559
570
 
560
571
  if (p !== null) {
561
572
  el.picked = true;
@@ -563,25 +574,25 @@ function peg$parse(input, options = {}) {
563
574
  return el;
564
575
 
565
576
  }
566
- function peg$a21() {
577
+ function peg$a22() {
567
578
  return "\b";
568
579
  }
569
- function peg$a22() {
580
+ function peg$a23() {
570
581
  return "\f";
571
582
  }
572
- function peg$a23() {
583
+ function peg$a24() {
573
584
  return "\n";
574
585
  }
575
- function peg$a24() {
586
+ function peg$a25() {
576
587
  return "\r";
577
588
  }
578
- function peg$a25() {
589
+ function peg$a26() {
579
590
  return "\t";
580
591
  }
581
- function peg$a26() {
592
+ function peg$a27() {
582
593
  return "\x0B";
583
594
  }
584
- function peg$a27(label, ampersand, parameter) {
595
+ function peg$a28(label, ampersand, parameter) {
585
596
 
586
597
  return {
587
598
  type: "labeled_param",
@@ -592,7 +603,7 @@ function peg$parse(input, options = {}) {
592
603
  };
593
604
 
594
605
  }
595
- function peg$a28(label, expression) {
606
+ function peg$a29(label, expression) {
596
607
 
597
608
  return {
598
609
  type: "labeled",
@@ -602,7 +613,7 @@ function peg$parse(input, options = {}) {
602
613
  };
603
614
 
604
615
  }
605
- function peg$a29(operator, expression) {
616
+ function peg$a30(operator, expression) {
606
617
 
607
618
  return {
608
619
  type: OPS_TO_PREFIXED_TYPES[operator],
@@ -611,7 +622,7 @@ function peg$parse(input, options = {}) {
611
622
  };
612
623
 
613
624
  }
614
- function peg$a30(expression, operator) {
625
+ function peg$a31(expression, operator) {
615
626
 
616
627
  return {
617
628
  type: OPS_TO_SUFFIXED_TYPES[operator],
@@ -620,7 +631,7 @@ function peg$parse(input, options = {}) {
620
631
  };
621
632
 
622
633
  }
623
- function peg$a31(value, ignoreCase) {
634
+ function peg$a32(value, ignoreCase) {
624
635
 
625
636
  return {
626
637
  type: "literal",
@@ -630,7 +641,7 @@ function peg$parse(input, options = {}) {
630
641
  };
631
642
 
632
643
  }
633
- function peg$a32(inverted, parts, ignoreCase) {
644
+ function peg$a33(inverted, parts, ignoreCase) {
634
645
 
635
646
  return {
636
647
  type: "class",
@@ -642,10 +653,10 @@ function peg$parse(input, options = {}) {
642
653
  };
643
654
 
644
655
  }
645
- function peg$a33() {
656
+ function peg$a34() {
646
657
  return { type: "any", location: location() };
647
658
  }
648
- function peg$a34(name, assign) {
659
+ function peg$a35(name, assign) {
649
660
 
650
661
  return {
651
662
  type: "rule_ref",
@@ -655,7 +666,7 @@ function peg$parse(input, options = {}) {
655
666
  };
656
667
 
657
668
  }
658
- function peg$a35(operator, code) {
669
+ function peg$a36(operator, code) {
659
670
 
660
671
  return {
661
672
  type: OPS_TO_SEMANTIC_PREDICATE_TYPES[operator],
@@ -664,16 +675,24 @@ function peg$parse(input, options = {}) {
664
675
  };
665
676
 
666
677
  }
667
- function peg$a36(operator, parameter) {
678
+ function peg$a37(operator, parameter, assert) {
668
679
 
680
+ var type = OPS_TO_PARAMETER_PREDICATE_TYPES[operator];
681
+ if (assert) {
682
+ if (assert[0] === "!=") {
683
+ type = OPS_INVERT[type];
684
+ }
685
+ assert = assert[1];
686
+ }
669
687
  return {
670
- type: OPS_TO_PARAMETER_PREDICATE_TYPES[operator],
688
+ type: type,
671
689
  parameter: parameter,
690
+ assert: assert,
672
691
  location: location()
673
692
  };
674
693
 
675
694
  }
676
- function peg$a37(begin, end) {
695
+ function peg$a38(begin, end) {
677
696
 
678
697
  if (begin.charCodeAt(0) > end.charCodeAt(0)) {
679
698
  error(
@@ -684,7 +703,7 @@ function peg$parse(input, options = {}) {
684
703
  return [begin, end];
685
704
 
686
705
  }
687
- function peg$a38(ampersand, name, assign) {
706
+ function peg$a39(ampersand, name, assign) {
688
707
 
689
708
  var type, value;
690
709
  if (assign) {
@@ -702,7 +721,7 @@ function peg$parse(input, options = {}) {
702
721
  };
703
722
 
704
723
  }
705
- function peg$a39() {
724
+ function peg$a40() {
706
725
 
707
726
  return {
708
727
  type: "increment",
@@ -735,6 +754,15 @@ function peg$parse(input, options = {}) {
735
754
  "!": "parameter_not"
736
755
  };
737
756
 
757
+ var OPS_INVERT = {
758
+ "parameter_and": "parameter_not",
759
+ "parameter_not": "parameter_and",
760
+ "semantic_and": "semantic_not",
761
+ "semantic_not": "semantic_and",
762
+ "simple_and": "simple_not",
763
+ "simple_not": "simple_and",
764
+ };
765
+
738
766
 
739
767
 
740
768
  // generated
@@ -2366,6 +2394,10 @@ function peg$parse(input, options = {}) {
2366
2394
  break choice_1;
2367
2395
  }
2368
2396
  r1 = peg$parseParameterValueString(silence);
2397
+ if (r1!==peg$FAILED) {
2398
+ break choice_1;
2399
+ }
2400
+ r1 = peg$parseParameterValueLabeled(silence);
2369
2401
  } // choice_1
2370
2402
  return r1;
2371
2403
  }
@@ -2650,6 +2682,39 @@ function peg$parse(input, options = {}) {
2650
2682
  // free p2
2651
2683
  return r1;
2652
2684
  }
2685
+ function peg$parseParameterValueLabeled(silence) {
2686
+ var r1,p2,p3,r4,r5;
2687
+ p2 = peg$currPos;
2688
+ seq_1: {
2689
+ p3 = peg$currPos;
2690
+ if (input.charCodeAt(peg$currPos) === 36) {
2691
+ r4 = true;
2692
+ peg$currPos += 1;
2693
+ } else {
2694
+ if (!silence) { peg$fail(peg$c10); }
2695
+ r4 = peg$FAILED;
2696
+ r1 = peg$FAILED;
2697
+ break seq_1;
2698
+ }
2699
+ peg$discard__();
2700
+ r5 = peg$parseIdentifier(silence);
2701
+ // name <- r5
2702
+ if (r5===peg$FAILED) {
2703
+ peg$currPos = p3;
2704
+ r1 = peg$FAILED;
2705
+ break seq_1;
2706
+ }
2707
+ r1 = true;
2708
+ } // seq_1
2709
+ if (r1!==peg$FAILED) {
2710
+ peg$savedPos = p2;
2711
+ r1 = peg$a20(r5);
2712
+ }
2713
+ // free r4
2714
+ // free p3
2715
+ // free p2
2716
+ return r1;
2717
+ }
2653
2718
  function peg$parsePickedSequenceElement(silence) {
2654
2719
  var r1,p2,p3,r4,r5;
2655
2720
  p2 = peg$currPos;
@@ -2678,7 +2743,7 @@ function peg$parse(input, options = {}) {
2678
2743
  } // seq_1
2679
2744
  if (r1!==peg$FAILED) {
2680
2745
  peg$savedPos = p2;
2681
- r1 = peg$a20(r4, r5);
2746
+ r1 = peg$a21(r4, r5);
2682
2747
  }
2683
2748
  // free p3
2684
2749
  // free p2
@@ -2713,7 +2778,7 @@ function peg$parse(input, options = {}) {
2713
2778
  r1 = true;
2714
2779
  peg$currPos += 1;
2715
2780
  peg$savedPos = p2;
2716
- r1 = peg$a21();
2781
+ r1 = peg$a22();
2717
2782
  break choice_1;
2718
2783
  } else {
2719
2784
  r1 = peg$FAILED;
@@ -2724,7 +2789,7 @@ function peg$parse(input, options = {}) {
2724
2789
  r1 = true;
2725
2790
  peg$currPos += 1;
2726
2791
  peg$savedPos = p2;
2727
- r1 = peg$a22();
2792
+ r1 = peg$a23();
2728
2793
  break choice_1;
2729
2794
  } else {
2730
2795
  r1 = peg$FAILED;
@@ -2735,7 +2800,7 @@ function peg$parse(input, options = {}) {
2735
2800
  r1 = true;
2736
2801
  peg$currPos += 1;
2737
2802
  peg$savedPos = p2;
2738
- r1 = peg$a23();
2803
+ r1 = peg$a24();
2739
2804
  break choice_1;
2740
2805
  } else {
2741
2806
  r1 = peg$FAILED;
@@ -2746,7 +2811,7 @@ function peg$parse(input, options = {}) {
2746
2811
  r1 = true;
2747
2812
  peg$currPos += 1;
2748
2813
  peg$savedPos = p2;
2749
- r1 = peg$a24();
2814
+ r1 = peg$a25();
2750
2815
  break choice_1;
2751
2816
  } else {
2752
2817
  r1 = peg$FAILED;
@@ -2757,7 +2822,7 @@ function peg$parse(input, options = {}) {
2757
2822
  r1 = true;
2758
2823
  peg$currPos += 1;
2759
2824
  peg$savedPos = p2;
2760
- r1 = peg$a25();
2825
+ r1 = peg$a26();
2761
2826
  break choice_1;
2762
2827
  } else {
2763
2828
  r1 = peg$FAILED;
@@ -2768,7 +2833,7 @@ function peg$parse(input, options = {}) {
2768
2833
  r1 = true;
2769
2834
  peg$currPos += 1;
2770
2835
  peg$savedPos = p2;
2771
- r1 = peg$a26();
2836
+ r1 = peg$a27();
2772
2837
  } else {
2773
2838
  r1 = peg$FAILED;
2774
2839
  }
@@ -2998,7 +3063,7 @@ function peg$parse(input, options = {}) {
2998
3063
  r1 = "@";
2999
3064
  peg$currPos += 1;
3000
3065
  } else {
3001
- if (!silence) { peg$fail(peg$c10); }
3066
+ if (!silence) { peg$fail(peg$c11); }
3002
3067
  r1 = peg$FAILED;
3003
3068
  }
3004
3069
  return r1;
@@ -4146,7 +4211,7 @@ function peg$parse(input, options = {}) {
4146
4211
  r5 = true;
4147
4212
  peg$currPos += 1;
4148
4213
  } else {
4149
- if (!silence) { peg$fail(peg$c11); }
4214
+ if (!silence) { peg$fail(peg$c12); }
4150
4215
  r5 = peg$FAILED;
4151
4216
  peg$currPos = p3;
4152
4217
  r1 = peg$FAILED;
@@ -4157,7 +4222,7 @@ function peg$parse(input, options = {}) {
4157
4222
  r6 = true;
4158
4223
  peg$currPos += 1;
4159
4224
  } else {
4160
- if (!silence) { peg$fail(peg$c12); }
4225
+ if (!silence) { peg$fail(peg$c13); }
4161
4226
  r6 = peg$FAILED;
4162
4227
  peg$currPos = p3;
4163
4228
  r1 = peg$FAILED;
@@ -4168,7 +4233,7 @@ function peg$parse(input, options = {}) {
4168
4233
  r7 = "&";
4169
4234
  peg$currPos += 1;
4170
4235
  } else {
4171
- if (!silence) { peg$fail(peg$c13); }
4236
+ if (!silence) { peg$fail(peg$c14); }
4172
4237
  r7 = peg$FAILED;
4173
4238
  r7 = null;
4174
4239
  }
@@ -4186,7 +4251,7 @@ function peg$parse(input, options = {}) {
4186
4251
  r9 = true;
4187
4252
  peg$currPos += 1;
4188
4253
  } else {
4189
- if (!silence) { peg$fail(peg$c14); }
4254
+ if (!silence) { peg$fail(peg$c15); }
4190
4255
  r9 = peg$FAILED;
4191
4256
  peg$currPos = p3;
4192
4257
  r1 = peg$FAILED;
@@ -4196,7 +4261,7 @@ function peg$parse(input, options = {}) {
4196
4261
  } // seq_1
4197
4262
  if (r1!==peg$FAILED) {
4198
4263
  peg$savedPos = p2;
4199
- r1 = peg$a27(r4, r7, r8);
4264
+ r1 = peg$a28(r4, r7, r8);
4200
4265
  }
4201
4266
  // free r5,r6,r9
4202
4267
  // free p3
@@ -4219,7 +4284,7 @@ function peg$parse(input, options = {}) {
4219
4284
  r5 = true;
4220
4285
  peg$currPos += 1;
4221
4286
  } else {
4222
- if (!silence) { peg$fail(peg$c11); }
4287
+ if (!silence) { peg$fail(peg$c12); }
4223
4288
  r5 = peg$FAILED;
4224
4289
  peg$currPos = p3;
4225
4290
  r1 = peg$FAILED;
@@ -4237,7 +4302,7 @@ function peg$parse(input, options = {}) {
4237
4302
  } // seq_1
4238
4303
  if (r1!==peg$FAILED) {
4239
4304
  peg$savedPos = p2;
4240
- r1 = peg$a28(r4, r6);
4305
+ r1 = peg$a29(r4, r6);
4241
4306
  }
4242
4307
  // free r5
4243
4308
  // free p3
@@ -4268,7 +4333,7 @@ function peg$parse(input, options = {}) {
4268
4333
  } // seq_1
4269
4334
  if (r1!==peg$FAILED) {
4270
4335
  peg$savedPos = p2;
4271
- r1 = peg$a29(r4, r5);
4336
+ r1 = peg$a30(r4, r5);
4272
4337
  break choice_1;
4273
4338
  }
4274
4339
  // free p3
@@ -4306,7 +4371,7 @@ function peg$parse(input, options = {}) {
4306
4371
  r1 = true;
4307
4372
  peg$currPos += 1;
4308
4373
  peg$savedPos = p2;
4309
- r1 = peg$a21();
4374
+ r1 = peg$a22();
4310
4375
  break choice_1;
4311
4376
  } else {
4312
4377
  r1 = peg$FAILED;
@@ -4317,7 +4382,7 @@ function peg$parse(input, options = {}) {
4317
4382
  r1 = true;
4318
4383
  peg$currPos += 1;
4319
4384
  peg$savedPos = p2;
4320
- r1 = peg$a22();
4385
+ r1 = peg$a23();
4321
4386
  break choice_1;
4322
4387
  } else {
4323
4388
  r1 = peg$FAILED;
@@ -4328,7 +4393,7 @@ function peg$parse(input, options = {}) {
4328
4393
  r1 = true;
4329
4394
  peg$currPos += 1;
4330
4395
  peg$savedPos = p2;
4331
- r1 = peg$a23();
4396
+ r1 = peg$a24();
4332
4397
  break choice_1;
4333
4398
  } else {
4334
4399
  r1 = peg$FAILED;
@@ -4339,7 +4404,7 @@ function peg$parse(input, options = {}) {
4339
4404
  r1 = true;
4340
4405
  peg$currPos += 1;
4341
4406
  peg$savedPos = p2;
4342
- r1 = peg$a24();
4407
+ r1 = peg$a25();
4343
4408
  break choice_1;
4344
4409
  } else {
4345
4410
  r1 = peg$FAILED;
@@ -4350,7 +4415,7 @@ function peg$parse(input, options = {}) {
4350
4415
  r1 = true;
4351
4416
  peg$currPos += 1;
4352
4417
  peg$savedPos = p2;
4353
- r1 = peg$a25();
4418
+ r1 = peg$a26();
4354
4419
  break choice_1;
4355
4420
  } else {
4356
4421
  r1 = peg$FAILED;
@@ -4361,7 +4426,7 @@ function peg$parse(input, options = {}) {
4361
4426
  r1 = true;
4362
4427
  peg$currPos += 1;
4363
4428
  peg$savedPos = p2;
4364
- r1 = peg$a26();
4429
+ r1 = peg$a27();
4365
4430
  } else {
4366
4431
  r1 = peg$FAILED;
4367
4432
  }
@@ -4458,7 +4523,7 @@ function peg$parse(input, options = {}) {
4458
4523
  peg$currPos++;
4459
4524
  } else {
4460
4525
  r1 = peg$FAILED;
4461
- if (!silence) { peg$fail(peg$c15); }
4526
+ if (!silence) { peg$fail(peg$c16); }
4462
4527
  }
4463
4528
  return r1;
4464
4529
  }
@@ -4486,7 +4551,7 @@ function peg$parse(input, options = {}) {
4486
4551
  } // seq_1
4487
4552
  if (r1!==peg$FAILED) {
4488
4553
  peg$savedPos = p2;
4489
- r1 = peg$a30(r4, r5);
4554
+ r1 = peg$a31(r4, r5);
4490
4555
  break choice_1;
4491
4556
  }
4492
4557
  // free p3
@@ -4575,7 +4640,7 @@ function peg$parse(input, options = {}) {
4575
4640
  r3 = true;
4576
4641
  peg$currPos += 1;
4577
4642
  } else {
4578
- if (!silence) { peg$fail(peg$c16); }
4643
+ if (!silence) { peg$fail(peg$c17); }
4579
4644
  r3 = peg$FAILED;
4580
4645
  r1 = peg$FAILED;
4581
4646
  break seq_1;
@@ -4592,7 +4657,7 @@ function peg$parse(input, options = {}) {
4592
4657
  r4 = true;
4593
4658
  peg$currPos += 1;
4594
4659
  } else {
4595
- if (!silence) { peg$fail(peg$c17); }
4660
+ if (!silence) { peg$fail(peg$c18); }
4596
4661
  r4 = peg$FAILED;
4597
4662
  peg$currPos = p2;
4598
4663
  r1 = peg$FAILED;
@@ -4610,7 +4675,7 @@ function peg$parse(input, options = {}) {
4610
4675
  peg$currPos++;
4611
4676
  } else {
4612
4677
  r1 = peg$FAILED;
4613
- if (!silence) { peg$fail(peg$c18); }
4678
+ if (!silence) { peg$fail(peg$c19); }
4614
4679
  }
4615
4680
  return r1;
4616
4681
  }
@@ -4697,9 +4762,9 @@ function peg$parse(input, options = {}) {
4697
4762
  } // seq_1
4698
4763
  if (r1!==peg$FAILED) {
4699
4764
  peg$savedPos = p2;
4700
- r1 = peg$a31(r4, r5);
4765
+ r1 = peg$a32(r4, r5);
4701
4766
  } else {
4702
- if (!silence) { peg$fail(peg$c19); }
4767
+ if (!silence) { peg$fail(peg$c20); }
4703
4768
  }
4704
4769
  // free p3
4705
4770
  // free p2
@@ -4764,9 +4829,9 @@ function peg$parse(input, options = {}) {
4764
4829
  } // seq_1
4765
4830
  if (r1!==peg$FAILED) {
4766
4831
  peg$savedPos = p2;
4767
- r1 = peg$a32(r5, r6, r8);
4832
+ r1 = peg$a33(r5, r6, r8);
4768
4833
  } else {
4769
- if (!silence) { peg$fail(peg$c20); }
4834
+ if (!silence) { peg$fail(peg$c21); }
4770
4835
  }
4771
4836
  // free r4,r7
4772
4837
  // free p3
@@ -4780,9 +4845,9 @@ function peg$parse(input, options = {}) {
4780
4845
  r1 = true;
4781
4846
  peg$currPos += 1;
4782
4847
  peg$savedPos = p2;
4783
- r1 = peg$a33();
4848
+ r1 = peg$a34();
4784
4849
  } else {
4785
- if (!silence) { peg$fail(peg$c21); }
4850
+ if (!silence) { peg$fail(peg$c22); }
4786
4851
  r1 = peg$FAILED;
4787
4852
  }
4788
4853
  // free p2
@@ -4862,7 +4927,7 @@ function peg$parse(input, options = {}) {
4862
4927
  } // seq_1
4863
4928
  if (r1!==peg$FAILED) {
4864
4929
  peg$savedPos = p2;
4865
- r1 = peg$a34(r4, r5);
4930
+ r1 = peg$a35(r4, r5);
4866
4931
  }
4867
4932
  // free r6
4868
4933
  // free p3
@@ -4892,14 +4957,14 @@ function peg$parse(input, options = {}) {
4892
4957
  } // seq_1
4893
4958
  if (r1!==peg$FAILED) {
4894
4959
  peg$savedPos = p2;
4895
- r1 = peg$a35(r4, r5);
4960
+ r1 = peg$a36(r4, r5);
4896
4961
  }
4897
4962
  // free p3
4898
4963
  // free p2
4899
4964
  return r1;
4900
4965
  }
4901
4966
  function peg$parseParameterPredicateExpression(silence) {
4902
- var r1,p2,p3,r4,r5,r6,r7;
4967
+ var r1,p2,p3,r4,r5,r6,r7,p8,r9,r10;
4903
4968
  p2 = peg$currPos;
4904
4969
  seq_1: {
4905
4970
  p3 = peg$currPos;
@@ -4914,7 +4979,7 @@ function peg$parse(input, options = {}) {
4914
4979
  r5 = true;
4915
4980
  peg$currPos += 1;
4916
4981
  } else {
4917
- if (!silence) { peg$fail(peg$c12); }
4982
+ if (!silence) { peg$fail(peg$c13); }
4918
4983
  r5 = peg$FAILED;
4919
4984
  peg$currPos = p3;
4920
4985
  r1 = peg$FAILED;
@@ -4929,12 +4994,35 @@ function peg$parse(input, options = {}) {
4929
4994
  break seq_1;
4930
4995
  }
4931
4996
  peg$discard__();
4997
+ seq_2: {
4998
+ p8 = peg$currPos;
4999
+ r9 = peg$parseEqualityOperator(silence);
5000
+ if (r9===peg$FAILED) {
5001
+ r7 = peg$FAILED;
5002
+ break seq_2;
5003
+ }
5004
+ peg$discard__();
5005
+ r10 = peg$parseParameterValue(silence);
5006
+ if (r10===peg$FAILED) {
5007
+ peg$currPos = p8;
5008
+ r7 = peg$FAILED;
5009
+ break seq_2;
5010
+ }
5011
+ peg$discard__();
5012
+ r7 = [r9,r10];
5013
+ } // seq_2
5014
+ if (r7===peg$FAILED) {
5015
+ r7 = null;
5016
+ }
5017
+ // free r9,r10
5018
+ // free p8
5019
+ // assert <- r7
4932
5020
  if (input.charCodeAt(peg$currPos) === 62) {
4933
- r7 = true;
5021
+ r10 = true;
4934
5022
  peg$currPos += 1;
4935
5023
  } else {
4936
- if (!silence) { peg$fail(peg$c14); }
4937
- r7 = peg$FAILED;
5024
+ if (!silence) { peg$fail(peg$c15); }
5025
+ r10 = peg$FAILED;
4938
5026
  peg$currPos = p3;
4939
5027
  r1 = peg$FAILED;
4940
5028
  break seq_1;
@@ -4943,9 +5031,9 @@ function peg$parse(input, options = {}) {
4943
5031
  } // seq_1
4944
5032
  if (r1!==peg$FAILED) {
4945
5033
  peg$savedPos = p2;
4946
- r1 = peg$a36(r4, r6);
5034
+ r1 = peg$a37(r4, r6, r7);
4947
5035
  }
4948
- // free r5,r7
5036
+ // free r5,r10
4949
5037
  // free p3
4950
5038
  // free p2
4951
5039
  return r1;
@@ -4981,7 +5069,7 @@ function peg$parse(input, options = {}) {
4981
5069
  } // seq_1
4982
5070
  if (r1!==peg$FAILED) {
4983
5071
  peg$savedPos = p2;
4984
- r1 = peg$a37(r4, r6);
5072
+ r1 = peg$a38(r4, r6);
4985
5073
  }
4986
5074
  // free r5
4987
5075
  // free p3
@@ -5074,7 +5162,7 @@ function peg$parse(input, options = {}) {
5074
5162
  r4 = true;
5075
5163
  peg$currPos += 1;
5076
5164
  } else {
5077
- if (!silence) { peg$fail(peg$c12); }
5165
+ if (!silence) { peg$fail(peg$c13); }
5078
5166
  r4 = peg$FAILED;
5079
5167
  r1 = peg$FAILED;
5080
5168
  break seq_1;
@@ -5125,7 +5213,7 @@ function peg$parse(input, options = {}) {
5125
5213
  r9 = true;
5126
5214
  peg$currPos += 1;
5127
5215
  } else {
5128
- if (!silence) { peg$fail(peg$c14); }
5216
+ if (!silence) { peg$fail(peg$c15); }
5129
5217
  r9 = peg$FAILED;
5130
5218
  peg$currPos = p3;
5131
5219
  r1 = peg$FAILED;
@@ -5343,7 +5431,7 @@ function peg$parse(input, options = {}) {
5343
5431
  peg$currPos++;
5344
5432
  } else {
5345
5433
  r1 = peg$FAILED;
5346
- if (!silence) { peg$fail(peg$c22); }
5434
+ if (!silence) { peg$fail(peg$c23); }
5347
5435
  }
5348
5436
  return r1;
5349
5437
  }
@@ -5354,10 +5442,61 @@ function peg$parse(input, options = {}) {
5354
5442
  peg$currPos++;
5355
5443
  } else {
5356
5444
  r1 = peg$FAILED;
5357
- if (!silence) { peg$fail(peg$c22); }
5445
+ if (!silence) { peg$fail(peg$c23); }
5358
5446
  }
5359
5447
  return r1;
5360
5448
  }
5449
+ function peg$parseEqualityOperator(silence) {
5450
+ var r1,p2,r3,r4;
5451
+ choice_1: {
5452
+ seq_1: {
5453
+ p2 = peg$currPos;
5454
+ r1 = input.substr(peg$currPos,2);
5455
+ if (r1 === "==") {
5456
+ peg$currPos += 2;
5457
+ } else {
5458
+ if (!silence) { peg$fail(peg$c24); }
5459
+ r1 = peg$FAILED;
5460
+ r1 = peg$FAILED;
5461
+ break seq_1;
5462
+ }
5463
+ if (input.charCodeAt(peg$currPos) === 61) {
5464
+ r3 = true;
5465
+ peg$currPos += 1;
5466
+ } else {
5467
+ if (!silence) { peg$fail(peg$c1); }
5468
+ r3 = peg$FAILED;
5469
+ r3 = null;
5470
+ }
5471
+ } // seq_1
5472
+ if (r1!==peg$FAILED) {
5473
+ break choice_1;
5474
+ }
5475
+ // free p2
5476
+ seq_2: {
5477
+ p2 = peg$currPos;
5478
+ r1 = input.substr(peg$currPos,2);
5479
+ if (r1 === "!=") {
5480
+ peg$currPos += 2;
5481
+ } else {
5482
+ if (!silence) { peg$fail(peg$c25); }
5483
+ r1 = peg$FAILED;
5484
+ r1 = peg$FAILED;
5485
+ break seq_2;
5486
+ }
5487
+ if (input.charCodeAt(peg$currPos) === 61) {
5488
+ r4 = true;
5489
+ peg$currPos += 1;
5490
+ } else {
5491
+ if (!silence) { peg$fail(peg$c1); }
5492
+ r4 = peg$FAILED;
5493
+ r4 = null;
5494
+ }
5495
+ } // seq_2
5496
+ // free p2
5497
+ } // choice_1
5498
+ return r1;
5499
+ }
5361
5500
  function peg$parseParameterAssignment(silence) {
5362
5501
  var r1,p2,p3,r4,r5,r6,p7,r8;
5363
5502
  p2 = peg$currPos;
@@ -5367,7 +5506,7 @@ function peg$parse(input, options = {}) {
5367
5506
  r4 = "&";
5368
5507
  peg$currPos += 1;
5369
5508
  } else {
5370
- if (!silence) { peg$fail(peg$c13); }
5509
+ if (!silence) { peg$fail(peg$c14); }
5371
5510
  r4 = peg$FAILED;
5372
5511
  r4 = null;
5373
5512
  }
@@ -5415,7 +5554,7 @@ function peg$parse(input, options = {}) {
5415
5554
  } // seq_1
5416
5555
  if (r1!==peg$FAILED) {
5417
5556
  peg$savedPos = p2;
5418
- r1 = peg$a38(r4, r5, r6);
5557
+ r1 = peg$a39(r4, r5, r6);
5419
5558
  }
5420
5559
  // free r8
5421
5560
  // free p3
@@ -5429,9 +5568,9 @@ function peg$parse(input, options = {}) {
5429
5568
  r1 = true;
5430
5569
  peg$currPos += 2;
5431
5570
  peg$savedPos = p2;
5432
- r1 = peg$a39();
5571
+ r1 = peg$a40();
5433
5572
  } else {
5434
- if (!silence) { peg$fail(peg$c23); }
5573
+ if (!silence) { peg$fail(peg$c26); }
5435
5574
  r1 = peg$FAILED;
5436
5575
  }
5437
5576
  // free p2
package/lib/peg.js CHANGED
@@ -4,7 +4,7 @@ var objects = require("./utils/objects");
4
4
 
5
5
  var PEG = {
6
6
  /* WikiPEG version (uses semantic versioning). */
7
- VERSION: "6.0.0",
7
+ VERSION: "6.1.0",
8
8
 
9
9
  GrammarError: require("./grammar-error"),
10
10
  parser: require("./parser"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikipeg",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "Parser generator for JavaScript and PHP",
5
5
  "license": "MIT",
6
6
  "homepage": "https://gerrit.wikimedia.org/r/plugins/gitiles/wikipeg/",