Browse Source

PEG.js grammar: Fix line continuation handling

Before this commit, a line continuation (backslash followed by a line
terminator character) contributed a character to a string or a character
class it was used in. In JavaScript and many other languages, line
continuation doesn't contribute anything.

This commit aligns PEG.js line continuation behavior with JavaScript.
redux
David Majda 8 years ago
committed by David Majda
parent
commit
fb72c430e6
  1. 2
      lib/parser.js
  2. 12
      spec/parser.spec.js
  3. 2
      src/parser.pegjs

2
lib/parser.js

@ -281,7 +281,7 @@ module.exports = (function() {
},
peg$c111 = "\\u",
peg$c112 = { type: "literal", value: "\\u", description: "\"\\\\u\"" },
peg$c113 = function(eol) { return eol; },
peg$c113 = function(eol) { return ""; },
peg$c114 = /^[0-9]/,
peg$c115 = { type: "class", value: "[0-9]", description: "[0-9]" },
peg$c116 = /^[0-9a-fA-F]/,

12
spec/parser.spec.js

@ -392,7 +392,7 @@ describe("PEG.js grammar parser", function() {
expect('start = "\\0"' ).toParseAs(literalGrammar("\x00"));
expect('start = "\\xFF"' ).toParseAs(literalGrammar("\xFF"));
expect('start = "\\uFFFF"').toParseAs(literalGrammar("\uFFFF"));
expect('start = "\\\n"' ).toParseAs(literalGrammar("\n"));
expect('start = "\\\n"' ).toParseAs(literalGrammar(""));
});
/* Canonical simpleDoubleQuotedCharacter is "a". */
@ -418,7 +418,7 @@ describe("PEG.js grammar parser", function() {
expect("start = '\\0'" ).toParseAs(literalGrammar("\x00"));
expect("start = '\\xFF'" ).toParseAs(literalGrammar("\xFF"));
expect("start = '\\uFFFF'").toParseAs(literalGrammar("\uFFFF"));
expect("start = '\\\n'" ).toParseAs(literalGrammar("\n"));
expect("start = '\\\n'" ).toParseAs(literalGrammar(""));
});
/* Canonical simpleSingleQuotedCharacter is "a". */
@ -471,7 +471,7 @@ describe("PEG.js grammar parser", function() {
expect('start = [\\0]' ).toParseAs(classGrammar(["\x00"], "[\\0]"));
expect('start = [\\xFF]' ).toParseAs(classGrammar(["\xFF"], "[\\xFF]"));
expect('start = [\\uFFFF]').toParseAs(classGrammar(["\uFFFF"], "[\\uFFFF]"));
expect('start = [\\\n]' ).toParseAs(classGrammar(["\n"], "[\\\n]"));
expect('start = [\\\n]' ).toParseAs(classGrammar([""], "[\\\n]"));
});
/* Canonical simpleBracketDelimiedCharacter is "a". */
@ -518,11 +518,7 @@ describe("PEG.js grammar parser", function() {
/* Canonical eolEscapeSequence is "\\\n". */
it("parses eolEscapeSequence", function() {
expect('start = "\\\n"' ).toParseAs(literalGrammar("\n"));
expect('start = "\\\r\n"' ).toParseAs(literalGrammar("\r\n"));
expect('start = "\\\r"' ).toParseAs(literalGrammar("\r"));
expect('start = "\\\u2028"').toParseAs(literalGrammar("\u2028"));
expect('start = "\\\u2029"').toParseAs(literalGrammar("\u2029"));
expect('start = "\\\n"' ).toParseAs(literalGrammar(""));
});
/* Trivial character class rules are not tested. */

2
src/parser.pegjs

@ -308,7 +308,7 @@ unicodeEscapeSequence
}
eolEscapeSequence
= "\\" eol:eol { return eol; }
= "\\" eol:eol { return ""; }
digit
= [0-9]

Loading…
Cancel
Save