Created
January 5, 2011 05:03
-
-
Save erichocean/765956 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; The entire ECMAScript grammar expressed as a single PEG | |
; Parser rules which share a name with ECMA-262 productions are intended to match the same language. | |
Program ← | |
(S? (Statement / FunctionDeclaration))* S? | |
FunctionBody ← | |
(S? (Statement / FunctionDeclaration))* S? | |
FunctionDeclaration ← | |
FunctionTok S? Identifier S? "(" S? FormalParameterList? S? ")" S? "{" S? FunctionBody S? "}" | |
FunctionExpr ← | |
FunctionTok S? Identifier? S? "(" S? FormalParameterList? S? ")" S? "{" S? FunctionBody S? "}" | |
FormalParameterList ← | |
Identifier ("," S? Identifier)* | |
UseStrictDirective ← | |
"use" S "strict" S ( "," !(LineTerminator) SourceCharacter )* | |
; Statements | |
Statement | |
← Block | |
/ VariableStatement | |
/ EmptyStatement | |
/ ExprStatement | |
/ IfStatement | |
/ IterationStatement | |
/ ContinueStatement | |
/ BreakStatement | |
/ ReturnStatement | |
/ WithStatement | |
/ LabelledStatement | |
/ SwitchStatement | |
/ ThrowStatement | |
/ TryStatement | |
/ DebuggerStatement | |
Block ← "{" (S? Statement)* S? "}" | |
VariableStatement ← | |
VarTok S? VariableDeclaration (S? "," S? VariableDeclaration)* EOS | |
VariableDeclarationListNoIn ← | |
VariableDeclarationNoIn (S? "," S? VariableDeclarationNoIn)* | |
VariableDeclaration ← | |
Identifier (S? "=" !("=") S? AssignmentExpr)? | |
VariableDeclarationNoIn ← | |
Identifier (S? "=" !("=") S? AssignmentExprNoIn)? | |
; an empty statement is marked by an explicit semicolon, ASI does not apply | |
EmptyStatement ← ";" | |
ExprStatement ← !("{" / FunctionTok) Expr EOS | |
IfStatement ← IfTok S? "(" S? Expr S? ")" S? Statement (S? ElseTok S? Statement)? | |
IterationStatement ← | |
DoWhileStatement | |
/ WhileStatement | |
/ ForInStatement | |
/ ForStatement | |
DoWhileStatement ← | |
DoTok S? Statement S? WhileTok S? "(" S? Expr S? ")" EOS | |
WhileStatement ← | |
WhileTok S? "(" S? Expr S? ")" S? Statement | |
ForInStatement ← | |
ForTok S? "(" S? LeftHandSideExpr S? InTok S? Expr S? ")" S? Statement | |
/ ForTok S? "(" S? VarTok S? VariableDeclarationNoIn S? InTok S? Expr S? ")" S? Statement | |
ForStatement ← | |
ForTok S? "(" S? ExprNoIn? S? ";" S? Expr? S? ";" S? Expr? S? ")" S? Statement | |
/ ForTok S? "(" S? VarTok S? VariableDeclarationListNoIn S? ";" S? Expr? S? ";" S? Expr? S? ")" S? Statement | |
ContinueStatement ← | |
ContinueTok SnoLB? (Identifier EOS / EOSnoLB) | |
BreakStatement ← | |
BreakTok SnoLB? (Identifier EOS / EOSnoLB) | |
ReturnStatement ← | |
ReturnTok SnoLB? (EOSnoLB / Expr EOS) | |
WithStatement ← | |
WithTok S? "(" S? Expr S? ")" S? Statement | |
LabelledStatement ← | |
Identifier S? ":" S? Statement | |
SwitchStatement ← | |
SwitchTok S? "(" S? Expr S? ")" S? "{" CaseClause* (DefaultClause CaseClause*)? S? "}" | |
CaseClause ← | |
S? CaseTok S? Expr S? ":" (S? Statement)* | |
DefaultClause ← | |
S? DefaultTok S? ":" (S? Statement)* | |
ThrowStatement ← | |
ThrowTok SnoLB? (EOSnoLB / Expr EOS) | |
TryStatement ← | |
TryTok S? Block S? (Catch S? Finally? / Finally) | |
Catch ← | |
CatchTok S? "(" S? Identifier S? ")" S? Block | |
Finally ← | |
FinallyTok S? Block | |
DebuggerStatement ← | |
DebuggerTok S? EOS | |
; Exprs | |
Expr ← | |
AssignmentExpr (S? "," S? AssignmentExpr)* | |
ExprNoIn ← | |
AssignmentExprNoIn (S? "," S? AssignmentExprNoIn)* | |
AssignmentExpr ← | |
LeftHandSideExpr S? AssignmentOperator S? AssignmentExpr | |
/ ConditionalExpr | |
AssignmentExprNoIn ← | |
LeftHandSideExpr S? AssignmentOperator S? AssignmentExprNoIn | |
/ ConditionalExprNoIn | |
AssignmentOperator ← | |
"=" !("=") / "*=" / "/=" / "%=" / "+=" / "-=" / "<<=" / ">>=" / ">>>=" / "&=" / "^=" / "|=" | |
ConditionalExpr ← | |
LogicalOrExpr (S? "?" S? AssignmentExpr S? ":" S? AssignmentExpr)? | |
ConditionalExprNoIn ← | |
LogicalOrExprNoIn (S? "?" S? AssignmentExprNoIn S? ":" S? AssignmentExprNoIn)? | |
LogicalOrExpr ← | |
LogicalAndExpr (S? "||" S? LogicalAndExpr)* | |
LogicalOrExprNoIn ← | |
LogicalAndExprNoIn (S? "||" S? LogicalAndExprNoIn)* | |
LogicalAndExpr ← | |
BitwiseOrExpr (S? "&&" S? BitwiseOrExpr)* | |
LogicalAndExprNoIn ← | |
BitwiseOrExprNoIn (S? "&&" S? BitwiseOrExprNoIn)* | |
BitwiseOrExpr ← | |
BitwiseXOrExpr (S? "|" !("=") S? BitwiseXOrExpr)* | |
BitwiseOrExprNoIn ← | |
BitwiseXOrExprNoIn (S? "|" !("=") S? BitwiseXOrExprNoIn)* | |
BitwiseXOrExpr ← | |
BitwiseAndExpr (S? "^" !("=") S? BitwiseAndExpr)* | |
BitwiseXOrExprNoIn ← | |
BitwiseAndExprNoIn (S? "^" !("=") S? BitwiseAndExprNoIn)* | |
BitwiseAndExpr ← | |
EqualityExpr (S? "&" !("=") S? EqualityExpr)* | |
BitwiseAndExprNoIn ← | |
EqualityExprNoIn (S? "&" !("=") S? EqualityExprNoIn)* | |
EqualityExpr ← | |
RelationalExpr (S? EqualityOp S? RelationalExpr)* | |
EqualityExprNoIn ← | |
RelationalExprNoIn (S? EqualityOp S? RelationalExprNoIn)* | |
EqualityOp ← "===" / "!==" / "==" / "!=" | |
RelationalExpr ← | |
ShiftExpr (S? RelationalOp S? ShiftExpr)* | |
RelationalExprNoIn ← | |
ShiftExpr (S? RelationalOpNoIn S? ShiftExpr)* | |
RelationalOp ← | |
"<=" / ">=" / "<" / ">" / InstanceOfTok / InTok | |
RelationalOpNoIn ← | |
"<=" / ">=" / "<" / ">" / InstanceOfTok | |
ShiftExpr ← | |
AdditiveExpr (S? ShiftOp S? AdditiveExpr)* | |
ShiftOp ← | |
"<<" / ">>>" / ">>" | |
AdditiveExpr ← | |
MultiplicativeExpr (S? AdditiveOp S? MultiplicativeExpr)* | |
AdditiveOp ← | |
"+" !("+"/"=") | |
/ "-" !("-"/"=") | |
MultiplicativeExpr ← | |
UnaryExpr (S? MultiplicativeOp S? UnaryExpr)* | |
MultiplicativeOp ← | |
("*" / "/" / "%") !("=") | |
UnaryExpr ← | |
PostfixExpr | |
/ DeleteTok S? UnaryExpr | |
/ VoidTok S? UnaryExpr | |
/ TypeofTok S? UnaryExpr | |
/ "++" S? UnaryExpr | |
/ "--" S? UnaryExpr | |
/ "+" S? UnaryExpr | |
/ "-" S? UnaryExpr | |
/ "~" S? UnaryExpr | |
/ "!" S? UnaryExpr | |
; why isn't ++a++ a valid UnaryExpr? | |
; answer: it is, and parses as ++(a++), the evaluation of which must throw a ReferenceError per spec | |
; Firefox currently makes this a syntax error which is wrong, Opera gets it right | |
PostfixExpr ← | |
LeftHandSideExpr (SnoLB? ("++"/"--"))? | |
LeftHandSideExpr ← | |
CallExpr | |
/ NewExpr | |
CallExpr ← | |
MemberExpr S? Arguments (S? Arguments / S? "[" S? Expr S? "]" / S? "." S? IdentifierName)* | |
Arguments ← | |
"(" S? ArgumentList? S? ")" | |
ArgumentList ← | |
AssignmentExpr (S? "," S? AssignmentExpr)* | |
NewExpr ← | |
MemberExpr | |
/ NewTok S? NewExpr | |
MemberExpr ← | |
( PrimaryExpr | |
/ FunctionExpr | |
/ NewTok S? MemberExpr S? Arguments | |
) ( S? "[" S? Expr S? "]" | |
/ S? "." S? IdentifierName | |
)* | |
PrimaryExpr ← | |
ThisTok | |
/ Identifier | |
/ Literal | |
/ ArrayLiteral | |
/ ObjectLiteral | |
/ "(" S? Expr S? ")" | |
ArrayLiteral ← | |
"[" Elision? S? "]" | |
/ "[" ElementList S? "]" | |
/ "[" ElementList S? "," Elision? S? "]" | |
ElementList ← | |
Elision? S? AssignmentExpr (S? "," Elision? S? AssignmentExpr)* | |
Elision ← | |
(S? ",")+ | |
ObjectLiteral ← | |
"{" ( S? PropertyNameAndValueList S? ","? )? S? "}" | |
PropertyNameAndValueList ← | |
PropertyAssignment (S? "," S? PropertyAssignment)* | |
PropertyAssignment ← | |
PropertyName S? ":" S? AssignmentExpr | |
/ "get" S? PropertyName S? "(" S? ")" S? "{" S? FunctionBody S? "}" | |
/ "set" S? PropertyName S? "(" S? PropertySetParameterList S? ")" S? "{" S? FunctionBody S? "}" | |
PropertyName ← | |
IdentifierName / StringLiteral / NumericLiteral | |
PropertySetParameterList ← | |
Identifier | |
; Lexical tokens | |
Literal | |
← NullLiteral | |
/ BooleanLiteral | |
/ NumericLiteral | |
/ StringLiteral | |
/ RegularExpressionLiteral | |
NullLiteral | |
← NullTok | |
BooleanLiteral | |
← TrueTok | |
/ FalseTok | |
NumericLiteral ← DecimalLiteral !(IdentifierStart) | |
/ HexIntegerLiteral !(IdentifierStart) | |
DecimalLiteral ← DecimalIntegerLiteral "." DecimalDigit* ExponentPart? | |
/ "." DecimalDigit+ ExponentPart? | |
/ DecimalIntegerLiteral ExponentPart? | |
DecimalIntegerLiteral ← "0" | |
/ [1-9] DecimalDigit* | |
DecimalDigit ← [0-9] | |
ExponentPart ← [eE] SignedInteger | |
SignedInteger ← DecimalDigit+ | |
/ "+" DecimalDigit+ | |
/ "-" DecimalDigit+ | |
HexIntegerLiteral ← "0x" HexDigit+ | |
/ "0X" HexDigit+ | |
DQ ← [U+0022] | |
SQ ← [U+0027] | |
StringLiteral ← DQ DoubleStringCharacter* DQ | |
/ SQ SingleStringCharacter* SQ | |
RS ← [U+005C] | |
DoubleStringCharacter ← !( DQ / RS / LineTerminator ) SourceCharacter | |
/ RS EscapeSequence | |
/ LineContinuation | |
SingleStringCharacter ← !( SQ / RS / LineTerminator ) SourceCharacter | |
/ RS EscapeSequence | |
/ LineContinuation | |
LineContinuation ← RS LineTerminatorSequence | |
EscapeSequence ← CharacterEscapeSequence | |
/ "0" !(DecimalDigit) | |
/ HexEscapeSequence | |
/ UnicodeEscapeSequence | |
CharacterEscapeSequence ← SingleEscapeCharacter | |
/ NonEscapeCharacter | |
SingleEscapeCharacter ← [ U+0027 U+0022 U+005C b f n r t v ] | |
NonEscapeCharacter ← !(EscapeCharacter / LineTerminator) SourceCharacter | |
EscapeCharacter ← SingleEscapeCharacter | |
/ DecimalDigit | |
/ [ x u ] | |
HexEscapeSequence ← "x" HexDigit HexDigit | |
UnicodeEscapeSequence ← "u" HexDigit{4} | |
RegularExpressionLiteral ← "/" RegularExpressionBody "/" RegularExpressionFlags | |
RegularExpressionBody ← RegularExpressionFirstChar RegularExpressionChar* | |
RegularExpressionFirstChar ← !( LineTerminator / [ * U+005C / [ ] ) SourceCharacter | |
/ RegularExpressionBackslashSequence | |
/ RegularExpressionClass | |
RegularExpressionChar ← !( LineTerminator / [ U+005C / [ ] ) SourceCharacter | |
/ RegularExpressionBackslashSequence | |
/ RegularExpressionClass | |
RegularExpressionBackslashSequence ← RS !(LineTerminator) SourceCharacter | |
RegularExpressionClass ← "[" RegularExpressionClassChar* "]" | |
RegularExpressionClassChar ← !(LineTerminator / [ U+005C U+005D ]) SourceCharacter | |
/ RegularExpressionBackslashSequence | |
RegularExpressionFlags ← IdentifierPart* | |
SourceCharacter ← [ U+0000-U+10FFFF ] | |
WhiteSpace ← [ U+0009 | |
U+000B | |
U+000C | |
U+0020 | |
U+0085 | |
U+00A0 | |
U+200B | |
U+FEFF | |
[:Zs:] ] | |
LF ← [ U+000A ] | |
CR ← [ U+000D ] | |
LS ← [ U+2028 ] | |
PS ← [ U+2029 ] | |
LineTerminator ← LF / CR / LS / PS | |
LineTerminatorSequence ← LF / CR LF / CR / LS / PS | |
Comment ← MultiLineComment | |
/ SingleLineComment | |
MultiLineComment ← "/*" (!("*/") SourceCharacter)* "*/" | |
MultiLineCommentNoLB ← "/*" (!("*/") !(LineTerminator) SourceCharacter)* "*/" | |
SingleLineComment ← "//" [^ U+000A U+000D U+2028 U+2029 ]* | |
S ← ( WhiteSpace / LineTerminatorSequence / Comment )+ | |
SnoLB ← ( WhiteSpace / SingleLineComment / MultiLineCommentNoLB )+ | |
EOS | |
← S? ";" | |
/ SnoLB? LineTerminatorSequence | |
/ SnoLB? &("}") | |
/ S? EOF | |
EOSnoLB | |
← SnoLB? ";" | |
/ SnoLB? LineTerminatorSequence | |
/ SnoLB? &("}") | |
/ SnoLB? EOF | |
EOF | |
← !(SourceCharacter) | |
ReservedWord | |
← ( Keyword | |
/ FutureReservedWord | |
/ "null" | |
/ "true" | |
/ "false" | |
) !(IdentifierPart) | |
Keyword | |
← "break" / "case" / "catch" / "continue" / "debugger" / "default" / "delete" / "do" / "else" / "finally" / "for" / "function" / "if" / "instanceof" / "in" / "new" / "return" / "switch" / "this" / "throw" / "try" / "typeof" / "var" / "void" / "while" / "with" | |
FutureReservedWord | |
← "abstract" / "boolean" / "byte" / "char" / "class" / "const" / "double" / "enum" / "export" / "extends" / "final" / "float" / "goto" / "implements" / "import" / "interface" / "int" / "long" / "native" / "package" / "private" / "protected" / "public" / "short" / "static" / "super" / "synchronized" / "throws" / "transient" / "volatile" | |
Identifier ← !(ReservedWord) IdentifierName | |
IdentifierName ← IdentifierStart IdentifierPart* | |
IdentifierStart ← UnicodeLetter | |
/ "$" | |
/ "_" | |
/ RS UnicodeEscapeSequence | |
IdentifierPart ← IdentifierStart | |
/ [ [:Mn:] [:Mc:] | |
[:Nd:] | |
[:Pc:] ] | |
UnicodeLetter ← [ [:Lu:] | |
[:Ll:] | |
[:Lt:] | |
[:Lm:] | |
[:Lo:] | |
[:Nl:] ] | |
HexDigit ← [ 0-9 a-f A-F ] | |
; generated by ECMAScript_unified_tokens in ECMAScript_outputs.js | |
FalseTok ← "false" !(IdentifierPart) | |
TrueTok ← "true" !(IdentifierPart) | |
NullTok ← "null" !(IdentifierPart) | |
BreakTok ← "break" !(IdentifierPart) | |
ContinueTok ← "continue" !(IdentifierPart) | |
DebuggerTok ← "debugger" !(IdentifierPart) | |
InTok ← "in" !(IdentifierPart) | |
InstanceOfTok ← "instanceof" !(IdentifierPart) | |
DeleteTok ← "delete" !(IdentifierPart) | |
FunctionTok ← "function" !(IdentifierPart) | |
NewTok ← "new" !(IdentifierPart) | |
ThisTok ← "this" !(IdentifierPart) | |
TypeofTok ← "typeof" !(IdentifierPart) | |
VoidTok ← "void" !(IdentifierPart) | |
IfTok ← "if" !(IdentifierPart) | |
ElseTok ← "else" !(IdentifierPart) | |
DoTok ← "do" !(IdentifierPart) | |
WhileTok ← "while" !(IdentifierPart) | |
ForTok ← "for" !(IdentifierPart) | |
VarTok ← "var" !(IdentifierPart) | |
ReturnTok ← "return" !(IdentifierPart) | |
CaseTok ← "case" !(IdentifierPart) | |
DefaultTok ← "default" !(IdentifierPart) | |
SwitchTok ← "switch" !(IdentifierPart) | |
ThrowTok ← "throw" !(IdentifierPart) | |
CatchTok ← "catch" !(IdentifierPart) | |
FinallyTok ← "finally" !(IdentifierPart) | |
TryTok ← "try" !(IdentifierPart) | |
WithTok ← "with" !(IdentifierPart) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment