Expressions
  {normal, initial}
  {allowIn, noIn}
Primary Expressions
PrimaryExpressionnormal 
	SimpleExpression
|	FunctionExpression
|	ObjectLiteral
PrimaryExpressioninitial  SimpleExpression
SimpleExpression 
	this
|	null
|	true
|	false
|	Number
|	String
|	Identifier
|	RegularExpression
|	ParenthesizedExpression
|	ArrayLiteral
ParenthesizedExpression  ( Expressionnormal,allowIn )
Function Expressions
FunctionExpression 
	AnonymousFunction
|	NamedFunction
Object Literals
ObjectLiteral 
	{ }
|	{ FieldList }
FieldList 
	LiteralField
|	FieldList , LiteralField
LiteralField  Identifier : AssignmentExpressionnormal,allowIn
Array Literals
ArrayLiteral 
	[ ]
|	[ ElementList ]
ElementList 
	LiteralElement
|	ElementList , LiteralElement
LiteralElement  AssignmentExpressionnormal,allowIn
Left-Side Expressions
LeftSideExpression 
	CallExpression
|	ShortNewExpression
CallExpression 
	PrimaryExpression
|	FullNewExpression
|	CallExpression MemberOperator
|	CallExpression Arguments
FullNewExpression  new FullNewSubexpression Arguments
ShortNewExpression  new ShortNewSubexpression
FullNewSubexpression 
	PrimaryExpressionnormal
|	FullNewExpression
|	FullNewSubexpression MemberOperator
ShortNewSubexpression 
	FullNewSubexpression
|	ShortNewExpression
MemberOperator 
	[ Expressionnormal,allowIn ]
|	. Identifier
Arguments 
	( )
|	( ArgumentList )
ArgumentList 
	AssignmentExpressionnormal,allowIn
|	ArgumentList , AssignmentExpressionnormal,allowIn
Postfix Operators
PostfixExpression 
	LeftSideExpression
|	LeftSideExpression ++
|	LeftSideExpression --
Unary Operators
UnaryExpression 
	PostfixExpression
|	delete LeftSideExpressionnormal
|	void UnaryExpressionnormal
|	typeof UnaryExpressionnormal
|	++ LeftSideExpressionnormal
|	-- LeftSideExpressionnormal
|	+ UnaryExpressionnormal
|	- UnaryExpressionnormal
|	~ UnaryExpressionnormal
|	! UnaryExpressionnormal
Multiplicative Operators
MultiplicativeExpression 
	UnaryExpression
|	MultiplicativeExpression * UnaryExpressionnormal
|	MultiplicativeExpression / UnaryExpressionnormal
|	MultiplicativeExpression % UnaryExpressionnormal
Additive Operators
AdditiveExpression 
	MultiplicativeExpression
|	AdditiveExpression + MultiplicativeExpressionnormal
|	AdditiveExpression - MultiplicativeExpressionnormal
Bitwise Shift Operators
ShiftExpression 
	AdditiveExpression
|	ShiftExpression << AdditiveExpressionnormal
|	ShiftExpression >> AdditiveExpressionnormal
|	ShiftExpression >>> AdditiveExpressionnormal
Relational Operators
RelationalExpression,allowIn 
	ShiftExpression
|	RelationalExpression,allowIn < ShiftExpressionnormal
|	RelationalExpression,allowIn > ShiftExpressionnormal
|	RelationalExpression,allowIn <= ShiftExpressionnormal
|	RelationalExpression,allowIn >= ShiftExpressionnormal
|	RelationalExpression,allowIn instanceof ShiftExpressionnormal
|	RelationalExpression,allowIn in ShiftExpressionnormal
RelationalExpression,noIn 
	ShiftExpression
|	RelationalExpression,noIn < ShiftExpressionnormal
|	RelationalExpression,noIn > ShiftExpressionnormal
|	RelationalExpression,noIn <= ShiftExpressionnormal
|	RelationalExpression,noIn >= ShiftExpressionnormal
|	RelationalExpression,noIn instanceof ShiftExpressionnormal
Equality Operators
EqualityExpression, 
	RelationalExpression,
|	EqualityExpression, == RelationalExpressionnormal,
|	EqualityExpression, != RelationalExpressionnormal,
|	EqualityExpression, === RelationalExpressionnormal,
|	EqualityExpression, !== RelationalExpressionnormal,
Binary Bitwise Operators
BitwiseAndExpression, 
	EqualityExpression,
|	BitwiseAndExpression, & EqualityExpressionnormal,
BitwiseXorExpression, 
	BitwiseAndExpression,
|	BitwiseXorExpression, ^ BitwiseAndExpressionnormal,
BitwiseOrExpression, 
	BitwiseXorExpression,
|	BitwiseOrExpression, | BitwiseXorExpressionnormal,
Binary Logical Operators
LogicalAndExpression, 
	BitwiseOrExpression,
|	LogicalAndExpression, && BitwiseOrExpressionnormal,
LogicalOrExpression, 
	LogicalAndExpression,
|	LogicalOrExpression, || LogicalAndExpressionnormal,
Conditional Operator
ConditionalExpression, 
	LogicalOrExpression,
|	LogicalOrExpression, ? AssignmentExpressionnormal, : AssignmentExpressionnormal,
Assignment Operators
AssignmentExpression, 
	ConditionalExpression,
|	LeftSideExpression = AssignmentExpressionnormal,
|	LeftSideExpression CompoundAssignment AssignmentExpressionnormal,
CompoundAssignment 
	*=
|	/=
|	%=
|	+=
|	-=
|	<<=
|	>>=
|	>>>=
|	&=
|	^=
|	|=
Expressions
Expression, 
	AssignmentExpression,
|	Expression, , AssignmentExpressionnormal,
OptionalExpression 
	Expressionnormal,allowIn
|	«empty»
Statements
  {noShortIf, full}
Statement 
	EmptyStatement
|	ExpressionStatement OptionalSemicolon
|	VariableDefinition OptionalSemicolon
|	Block
|	LabeledStatement
|	IfStatement
|	SwitchStatement
|	DoStatement OptionalSemicolon
|	WhileStatement
|	ForStatement
|	WithStatement
|	ContinueStatement OptionalSemicolon
|	BreakStatement OptionalSemicolon
|	ReturnStatement OptionalSemicolon
|	ThrowStatement OptionalSemicolon
|	TryStatement
OptionalSemicolon  ;
Empty Statement
EmptyStatement  ;
Expression Statement
ExpressionStatement  Expressioninitial,allowIn
Variable Definition
VariableDefinition  var VariableDeclarationListallowIn
VariableDeclarationList 
	VariableDeclaration
|	VariableDeclarationList , VariableDeclaration
VariableDeclaration  Identifier VariableInitializer
VariableInitializer 
	«empty»
|	= AssignmentExpressionnormal,
Block
Block  { BlockStatements }
BlockStatements 
	«empty»
|	BlockStatementsPrefix
BlockStatementsPrefix 
	Statementfull
|	BlockStatementsPrefix Statementfull
Labeled Statements
LabeledStatement  Identifier : Statement
If Statement
IfStatementfull 
	if ParenthesizedExpression Statementfull
|	if ParenthesizedExpression StatementnoShortIf else Statementfull
IfStatementnoShortIf  if ParenthesizedExpression StatementnoShortIf else StatementnoShortIf
Switch Statement
SwitchStatement 
	switch ParenthesizedExpression { }
|	switch ParenthesizedExpression { CaseGroups LastCaseGroup }
CaseGroups 
	«empty»
|	CaseGroups CaseGroup
CaseGroup  CaseGuards BlockStatementsPrefix
LastCaseGroup  CaseGuards BlockStatements
CaseGuards 
	CaseGuard
|	CaseGuards CaseGuard
CaseGuard 
	case Expressionnormal,allowIn :
|	default :
Do-While Statement
DoStatement  do Statementfull while ParenthesizedExpression
While Statement
WhileStatement  while ParenthesizedExpression Statement
For Statements
ForStatement 
	for ( ForInitializer ; OptionalExpression ; OptionalExpression ) Statement
|	for ( ForInBinding in Expressionnormal,allowIn ) Statement
ForInitializer 
	«empty»
|	Expressionnormal,noIn
|	var VariableDeclarationListnoIn
ForInBinding 
	LeftSideExpressionnormal
|	var VariableDeclarationnoIn
With Statement
WithStatement  with ParenthesizedExpression Statement
Continue and Break Statements
ContinueStatement  continue OptionalLabel
BreakStatement  break OptionalLabel
OptionalLabel 
	«empty»
|	Identifier
Return Statement
ReturnStatement  return OptionalExpression
Throw Statement
ThrowStatement  throw Expressionnormal,allowIn
Try Statement
TryStatement 
	try Block CatchClauses
|	try Block FinallyClause
|	try Block CatchClauses FinallyClause
CatchClauses 
	CatchClause
|	CatchClauses CatchClause
CatchClause  catch ( Identifier ) Block
FinallyClause  finally Block
Function Definition
FunctionDefinition  NamedFunction
AnonymousFunction  function FormalParametersAndBody
NamedFunction  function Identifier FormalParametersAndBody
FormalParametersAndBody  ( FormalParameters ) { TopStatements }
FormalParameters 
	«empty»
|	FormalParametersPrefix
FormalParametersPrefix 
	FormalParameter
|	FormalParametersPrefix , FormalParameter
FormalParameter  Identifier
Programs
Program  TopStatements
TopStatements 
	«empty»
|	TopStatementsPrefix
TopStatementsPrefix 
	TopStatement
|	TopStatementsPrefix TopStatement
TopStatement 
	Statementfull
|	FunctionDefinition