Compensate for IE's lack of Array.prototype.indexOf function.
This commit is contained in:
parent
05381fedfa
commit
e79e869993
|
@ -56,6 +56,24 @@ PEG.buildParser = function(grammar, startRule) {
|
||||||
/* Array manipulation utility functions. */
|
/* Array manipulation utility functions. */
|
||||||
|
|
||||||
PEG.ArrayUtils = {
|
PEG.ArrayUtils = {
|
||||||
|
/*
|
||||||
|
* The code needs to be in sync with a code template in
|
||||||
|
* PEG.Grammar.Action.prototype.compile.
|
||||||
|
*/
|
||||||
|
contains: function(array, value) {
|
||||||
|
/*
|
||||||
|
* Stupid IE does not have Array.prototype.indexOf, otherwise this function
|
||||||
|
* would be a one-liner.
|
||||||
|
*/
|
||||||
|
var length = array.length;
|
||||||
|
for (var i = 0; i < length; i++) {
|
||||||
|
if (array[i] === value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
each: function(array, callback) {
|
each: function(array, callback) {
|
||||||
var length = array.length;
|
var length = array.length;
|
||||||
for (var i = 0; i < length; i++) {
|
for (var i = 0; i < length; i++) {
|
||||||
|
@ -289,7 +307,7 @@ PEG.Grammar.extendNodes("checkNoLeftRecursion", {
|
||||||
|
|
||||||
RuleRef:
|
RuleRef:
|
||||||
function(grammar, appliedRules) {
|
function(grammar, appliedRules) {
|
||||||
if (appliedRules.indexOf(this._name) !== -1) {
|
if (PEG.ArrayUtils.contains(appliedRules, this._name)) {
|
||||||
throw new PEG.Grammar.GrammarError("Left recursion detected for rule \"" + this._name + "\".");
|
throw new PEG.Grammar.GrammarError("Left recursion detected for rule \"" + this._name + "\".");
|
||||||
}
|
}
|
||||||
grammar[this._name].checkNoLeftRecursion(grammar, appliedRules);
|
grammar[this._name].checkNoLeftRecursion(grammar, appliedRules);
|
||||||
|
@ -443,13 +461,28 @@ PEG.Compiler = {
|
||||||
" + '\"';",
|
" + '\"';",
|
||||||
" },",
|
" },",
|
||||||
" ",
|
" ",
|
||||||
|
/* This needs to be in sync with PEG.ArrayUtils.contains. */
|
||||||
|
" _arrayContains: function(array, value) {",
|
||||||
|
" /*",
|
||||||
|
" * Stupid IE does not have Array.prototype.indexOf, otherwise this function",
|
||||||
|
" * would be a one-liner.",
|
||||||
|
" */",
|
||||||
|
" var length = array.length;",
|
||||||
|
" for (var i = 0; i < length; i++) {",
|
||||||
|
" if (array[i] === value) {",
|
||||||
|
" return true;",
|
||||||
|
" }",
|
||||||
|
" }",
|
||||||
|
" return false;",
|
||||||
|
" },",
|
||||||
|
" ",
|
||||||
" _matchFailed: function(failure) {",
|
" _matchFailed: function(failure) {",
|
||||||
" if (this._pos > this._rightmostMatchFailuresPos) {",
|
" if (this._pos > this._rightmostMatchFailuresPos) {",
|
||||||
" this._rightmostMatchFailuresPos = this._pos;",
|
" this._rightmostMatchFailuresPos = this._pos;",
|
||||||
" this._rightmostMatchFailuresExpected = [];",
|
" this._rightmostMatchFailuresExpected = [];",
|
||||||
" }",
|
" }",
|
||||||
" ",
|
" ",
|
||||||
" if (this._rightmostMatchFailuresExpected.indexOf(failure) === -1) {",
|
" if (!this._arrayContains(this._rightmostMatchFailuresExpected, failure)) {",
|
||||||
" this._rightmostMatchFailuresExpected.push(failure);",
|
" this._rightmostMatchFailuresExpected.push(failure);",
|
||||||
" }",
|
" }",
|
||||||
" },",
|
" },",
|
||||||
|
|
|
@ -19,13 +19,27 @@ PEG.grammarParser = (function(){
|
||||||
+ '"';
|
+ '"';
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_arrayContains: function(array, value) {
|
||||||
|
/*
|
||||||
|
* Stupid IE does not have Array.prototype.indexOf, otherwise this function
|
||||||
|
* would be a one-liner.
|
||||||
|
*/
|
||||||
|
var length = array.length;
|
||||||
|
for (var i = 0; i < length; i++) {
|
||||||
|
if (array[i] === value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
_matchFailed: function(failure) {
|
_matchFailed: function(failure) {
|
||||||
if (this._pos > this._rightmostMatchFailuresPos) {
|
if (this._pos > this._rightmostMatchFailuresPos) {
|
||||||
this._rightmostMatchFailuresPos = this._pos;
|
this._rightmostMatchFailuresPos = this._pos;
|
||||||
this._rightmostMatchFailuresExpected = [];
|
this._rightmostMatchFailuresExpected = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._rightmostMatchFailuresExpected.indexOf(failure) === -1) {
|
if (!this._arrayContains(this._rightmostMatchFailuresExpected, failure)) {
|
||||||
this._rightmostMatchFailuresExpected.push(failure);
|
this._rightmostMatchFailuresExpected.push(failure);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -61,6 +61,16 @@ global.doesNotParseWithPos = function(parser, input, line, column) {
|
||||||
|
|
||||||
module("PEG.ArrayUtils");
|
module("PEG.ArrayUtils");
|
||||||
|
|
||||||
|
test("contains", function() {
|
||||||
|
ok(!PEG.ArrayUtils.contains([], 42));
|
||||||
|
|
||||||
|
ok(PEG.ArrayUtils.contains([1, 2, 3], 1));
|
||||||
|
ok(PEG.ArrayUtils.contains([1, 2, 3], 2));
|
||||||
|
ok(PEG.ArrayUtils.contains([1, 2, 3], 3));
|
||||||
|
ok(!PEG.ArrayUtils.contains([1, 2, 3], 42));
|
||||||
|
ok(!PEG.ArrayUtils.contains([1, 2, 3], "2")); // Does it use |===|?
|
||||||
|
});
|
||||||
|
|
||||||
test("each", function() {
|
test("each", function() {
|
||||||
var sum;
|
var sum;
|
||||||
function increment(x) { sum += x; }
|
function increment(x) { sum += x; }
|
||||||
|
|
Loading…
Reference in a new issue