Implemented negative character classes (e.g. [^a-z]).

redux
David Majda 14 years ago
parent b3381b9352
commit 4f4bb34ded

File diff suppressed because it is too large Load Diff

@ -63,7 +63,7 @@ braced: "{" (braced / nonBraceCharacter)* "}" { return $1 + $2.join("") + $3; }
nonBraceCharacters: nonBraceCharacter+ { return $1.join(""); } nonBraceCharacters: nonBraceCharacter+ { return $1.join(""); }
nonBraceCharacter: !("{" / "}") . { return $2; } nonBraceCharacter: [^{}] { return $1; }
colon: ":" __ { return $1; } colon: ":" __ { return $1; }
slash: "/" __ { return $1; } slash: "/" __ { return $1; }
@ -125,8 +125,8 @@ singleQuotedCharacter
simpleSingleQuotedCharacter: !("'" / "\\" / eolChar) . { return $2; } simpleSingleQuotedCharacter: !("'" / "\\" / eolChar) . { return $2; }
class "character class": "[" (classCharacterRange / classCharacter)* "]" __ { class "character class": "[" "^"? (classCharacterRange / classCharacter)* "]" __ {
return $2.join(""); return $2 + $3.join("");
} }
classCharacterRange: bracketDelimitedCharacter "-" bracketDelimitedCharacter { classCharacterRange: bracketDelimitedCharacter "-" bracketDelimitedCharacter {

@ -205,6 +205,19 @@ test("classes", function() {
doesNotParse(nonEmptyClassParser, ""); doesNotParse(nonEmptyClassParser, "");
doesNotParse(nonEmptyClassParser, "ab"); doesNotParse(nonEmptyClassParser, "ab");
var invertedEmptyClassParser = PEG.buildParser('start: []');
doesNotParse(invertedEmptyClassParser, "");
doesNotParse(invertedEmptyClassParser, "a");
doesNotParse(invertedEmptyClassParser, "ab");
var invertedNonEmptyClassParser = PEG.buildParser('start: [^ab-d]');
doesNotParse(invertedNonEmptyClassParser, "a", "a");
doesNotParse(invertedNonEmptyClassParser, "b", "b");
doesNotParse(invertedNonEmptyClassParser, "c", "c");
doesNotParse(invertedNonEmptyClassParser, "d", "d");
doesNotParse(invertedNonEmptyClassParser, "");
doesNotParse(invertedNonEmptyClassParser, "ab");
/* /*
* Test that the parsing position moves forward after successful parsing of * Test that the parsing position moves forward after successful parsing of
* a class. * a class.

@ -276,6 +276,7 @@ with (PEG.Grammar) {
test("parses class", function() { test("parses class", function() {
grammarParserParses("start: []", classGrammar("")); grammarParserParses("start: []", classGrammar(""));
grammarParserParses("start: [a-d]", classGrammar("a-d")); grammarParserParses("start: [a-d]", classGrammar("a-d"));
grammarParserParses("start: [^a-d]", classGrammar("^a-d"));
grammarParserParses("start: [a]", classGrammar("a")); grammarParserParses("start: [a]", classGrammar("a"));
grammarParserParses("start: [a-de-hi-l]", classGrammar("a-de-hi-l")); grammarParserParses("start: [a-de-hi-l]", classGrammar("a-de-hi-l"));

Loading…
Cancel
Save