Merge branch 'master' of github.com:pegjs/pegjs
This commit is contained in:
commit
b0056d7a9f
1992
lib/parser.js
1992
lib/parser.js
File diff suppressed because one or more lines are too long
136
src/parser.pegjs
136
src/parser.pegjs
|
@ -39,6 +39,45 @@
|
||||||
"!": "semantic_not"
|
"!": "semantic_not"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const RESERVED_WORDS = [
|
||||||
|
"break",
|
||||||
|
"case",
|
||||||
|
"catch",
|
||||||
|
"class",
|
||||||
|
"const",
|
||||||
|
"continue",
|
||||||
|
"debugger",
|
||||||
|
"default",
|
||||||
|
"delete",
|
||||||
|
"do",
|
||||||
|
"else",
|
||||||
|
"enum",
|
||||||
|
"export",
|
||||||
|
"extends",
|
||||||
|
"false",
|
||||||
|
"finally",
|
||||||
|
"for",
|
||||||
|
"function",
|
||||||
|
"if",
|
||||||
|
"import",
|
||||||
|
"instanceof",
|
||||||
|
"in",
|
||||||
|
"new",
|
||||||
|
"null",
|
||||||
|
"return",
|
||||||
|
"super",
|
||||||
|
"switch",
|
||||||
|
"this",
|
||||||
|
"throw",
|
||||||
|
"true",
|
||||||
|
"try",
|
||||||
|
"typeof",
|
||||||
|
"var",
|
||||||
|
"void",
|
||||||
|
"while",
|
||||||
|
"with"
|
||||||
|
];
|
||||||
|
|
||||||
function extractOptional(optional, index) {
|
function extractOptional(optional, index) {
|
||||||
return optional ? optional[index] : null;
|
return optional ? optional[index] : null;
|
||||||
}
|
}
|
||||||
|
@ -129,9 +168,13 @@ SequenceExpression
|
||||||
|
|
||||||
LabeledExpression
|
LabeledExpression
|
||||||
= label:Identifier __ ":" __ expression:PrefixedExpression {
|
= label:Identifier __ ":" __ expression:PrefixedExpression {
|
||||||
|
if (RESERVED_WORDS.indexOf(label[0]) >= 0) {
|
||||||
|
error(`Label can't be a reserved word "${label[0]}".`, label[1]);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
type: "labeled",
|
type: "labeled",
|
||||||
label: label,
|
label: label[0],
|
||||||
expression: expression,
|
expression: expression,
|
||||||
location: location()
|
location: location()
|
||||||
};
|
};
|
||||||
|
@ -240,7 +283,7 @@ SingleLineComment
|
||||||
= "//" (!LineTerminator SourceCharacter)*
|
= "//" (!LineTerminator SourceCharacter)*
|
||||||
|
|
||||||
Identifier
|
Identifier
|
||||||
= !ReservedWord name:IdentifierName { return name; }
|
= name:IdentifierName { return [name, location()]; }
|
||||||
|
|
||||||
IdentifierName "identifier"
|
IdentifierName "identifier"
|
||||||
= head:IdentifierStart tail:IdentifierPart* { return head + tail.join(""); }
|
= head:IdentifierStart tail:IdentifierPart* { return head + tail.join(""); }
|
||||||
|
@ -277,56 +320,6 @@ UnicodeDigit
|
||||||
UnicodeConnectorPunctuation
|
UnicodeConnectorPunctuation
|
||||||
= Pc
|
= Pc
|
||||||
|
|
||||||
ReservedWord
|
|
||||||
= Keyword
|
|
||||||
/ FutureReservedWord
|
|
||||||
/ NullLiteral
|
|
||||||
/ BooleanLiteral
|
|
||||||
|
|
||||||
Keyword
|
|
||||||
= BreakToken
|
|
||||||
/ CaseToken
|
|
||||||
/ CatchToken
|
|
||||||
/ ContinueToken
|
|
||||||
/ DebuggerToken
|
|
||||||
/ DefaultToken
|
|
||||||
/ DeleteToken
|
|
||||||
/ DoToken
|
|
||||||
/ ElseToken
|
|
||||||
/ FinallyToken
|
|
||||||
/ ForToken
|
|
||||||
/ FunctionToken
|
|
||||||
/ IfToken
|
|
||||||
/ InstanceofToken
|
|
||||||
/ InToken
|
|
||||||
/ NewToken
|
|
||||||
/ ReturnToken
|
|
||||||
/ SwitchToken
|
|
||||||
/ ThisToken
|
|
||||||
/ ThrowToken
|
|
||||||
/ TryToken
|
|
||||||
/ TypeofToken
|
|
||||||
/ VarToken
|
|
||||||
/ VoidToken
|
|
||||||
/ WhileToken
|
|
||||||
/ WithToken
|
|
||||||
|
|
||||||
FutureReservedWord
|
|
||||||
= ClassToken
|
|
||||||
/ ConstToken
|
|
||||||
/ EnumToken
|
|
||||||
/ ExportToken
|
|
||||||
/ ExtendsToken
|
|
||||||
/ ImportToken
|
|
||||||
/ SuperToken
|
|
||||||
|
|
||||||
NullLiteral
|
|
||||||
= NullToken
|
|
||||||
|
|
||||||
BooleanLiteral
|
|
||||||
= TrueToken
|
|
||||||
/ FalseToken
|
|
||||||
|
|
||||||
LiteralMatcher "literal"
|
LiteralMatcher "literal"
|
||||||
= value:StringLiteral ignoreCase:"i"? {
|
= value:StringLiteral ignoreCase:"i"? {
|
||||||
return {
|
return {
|
||||||
|
@ -498,45 +491,6 @@ Pc = [\u005F\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]
|
||||||
// Separator, Space
|
// Separator, Space
|
||||||
Zs = [\u0020\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]
|
Zs = [\u0020\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]
|
||||||
|
|
||||||
// Tokens
|
|
||||||
|
|
||||||
BreakToken = "break" !IdentifierPart
|
|
||||||
CaseToken = "case" !IdentifierPart
|
|
||||||
CatchToken = "catch" !IdentifierPart
|
|
||||||
ClassToken = "class" !IdentifierPart
|
|
||||||
ConstToken = "const" !IdentifierPart
|
|
||||||
ContinueToken = "continue" !IdentifierPart
|
|
||||||
DebuggerToken = "debugger" !IdentifierPart
|
|
||||||
DefaultToken = "default" !IdentifierPart
|
|
||||||
DeleteToken = "delete" !IdentifierPart
|
|
||||||
DoToken = "do" !IdentifierPart
|
|
||||||
ElseToken = "else" !IdentifierPart
|
|
||||||
EnumToken = "enum" !IdentifierPart
|
|
||||||
ExportToken = "export" !IdentifierPart
|
|
||||||
ExtendsToken = "extends" !IdentifierPart
|
|
||||||
FalseToken = "false" !IdentifierPart
|
|
||||||
FinallyToken = "finally" !IdentifierPart
|
|
||||||
ForToken = "for" !IdentifierPart
|
|
||||||
FunctionToken = "function" !IdentifierPart
|
|
||||||
IfToken = "if" !IdentifierPart
|
|
||||||
ImportToken = "import" !IdentifierPart
|
|
||||||
InstanceofToken = "instanceof" !IdentifierPart
|
|
||||||
InToken = "in" !IdentifierPart
|
|
||||||
NewToken = "new" !IdentifierPart
|
|
||||||
NullToken = "null" !IdentifierPart
|
|
||||||
ReturnToken = "return" !IdentifierPart
|
|
||||||
SuperToken = "super" !IdentifierPart
|
|
||||||
SwitchToken = "switch" !IdentifierPart
|
|
||||||
ThisToken = "this" !IdentifierPart
|
|
||||||
ThrowToken = "throw" !IdentifierPart
|
|
||||||
TrueToken = "true" !IdentifierPart
|
|
||||||
TryToken = "try" !IdentifierPart
|
|
||||||
TypeofToken = "typeof" !IdentifierPart
|
|
||||||
VarToken = "var" !IdentifierPart
|
|
||||||
VoidToken = "void" !IdentifierPart
|
|
||||||
WhileToken = "while" !IdentifierPart
|
|
||||||
WithToken = "with" !IdentifierPart
|
|
||||||
|
|
||||||
// Skipped
|
// Skipped
|
||||||
|
|
||||||
__
|
__
|
||||||
|
|
|
@ -308,6 +308,91 @@ describe( "PEG.js API", function () {
|
||||||
|
|
||||||
// The |plugins| option is tested in plugin API tests.
|
// The |plugins| option is tested in plugin API tests.
|
||||||
|
|
||||||
|
describe( "reserved words", function () {
|
||||||
|
|
||||||
|
const RESERVED_WORDS = [
|
||||||
|
"break",
|
||||||
|
"case",
|
||||||
|
"catch",
|
||||||
|
"class",
|
||||||
|
"const",
|
||||||
|
"continue",
|
||||||
|
"debugger",
|
||||||
|
"default",
|
||||||
|
"delete",
|
||||||
|
"do",
|
||||||
|
"else",
|
||||||
|
"enum",
|
||||||
|
"export",
|
||||||
|
"extends",
|
||||||
|
"false",
|
||||||
|
"finally",
|
||||||
|
"for",
|
||||||
|
"function",
|
||||||
|
"if",
|
||||||
|
"import",
|
||||||
|
"instanceof",
|
||||||
|
"in",
|
||||||
|
"new",
|
||||||
|
"null",
|
||||||
|
"return",
|
||||||
|
"super",
|
||||||
|
"switch",
|
||||||
|
"this",
|
||||||
|
"throw",
|
||||||
|
"true",
|
||||||
|
"try",
|
||||||
|
"typeof",
|
||||||
|
"var",
|
||||||
|
"void",
|
||||||
|
"while",
|
||||||
|
"with"
|
||||||
|
];
|
||||||
|
|
||||||
|
describe( "throws an exception on reserved JS words used as labels", function () {
|
||||||
|
|
||||||
|
for ( const label of RESERVED_WORDS ) {
|
||||||
|
|
||||||
|
it( label, function () {
|
||||||
|
|
||||||
|
expect( () => {
|
||||||
|
|
||||||
|
peg.generate( [
|
||||||
|
"start = " + label + ":end",
|
||||||
|
"end = 'a'"
|
||||||
|
].join( "\n" ), { output: "source" } );
|
||||||
|
|
||||||
|
} ).to.throw( peg.parser.SyntaxError );
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
describe( "not throws an exception on reserved JS words used as rule name", function () {
|
||||||
|
|
||||||
|
for ( const rule of RESERVED_WORDS ) {
|
||||||
|
|
||||||
|
it( rule, function () {
|
||||||
|
|
||||||
|
expect( () => {
|
||||||
|
|
||||||
|
peg.generate( [
|
||||||
|
"start = " + rule,
|
||||||
|
rule + " = 'a'"
|
||||||
|
].join( "\n" ), { output: "source" } );
|
||||||
|
|
||||||
|
} ).to.not.throw( peg.parser.SyntaxError );
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
it( "accepts custom options", function () {
|
it( "accepts custom options", function () {
|
||||||
|
|
||||||
peg.generate( "start = 'a'", { foo: 42 } );
|
peg.generate( "start = 'a'", { foo: 42 } );
|
||||||
|
|
Loading…
Reference in a new issue