This is a LR(1) grammar written by waldemar that describes the state of ECMAScript as of February 1999. The grammar is complete except for semicolon insertion (the OptionalSemicolon grammar state can sometimes reduce to «empty») and distinguishing RegularExpression from / and /=. Also, there is some controversy about elision in array literals, so this feature has been omitted for now.

Grammar syntax

Grammar productions may expand nonterminals into empty right sides. Such right sides are indicated as «empty».

A number of rules in the grammar occur in groups of analogous rules. Rather than list them individually, these groups have been summarized using the shorthand illustrated by the example below:

Statements such as

a  {normalinitial}
b  {allowInnoIn}

introduce grammar arguments a and b. If these arguments later parametrize the nonterminal on the left side of a rule, that rule is implicitly replicated into a set of rules in each of which a grammar argument is consistently substituted by one of its variants. For example,

AssignmentExpressiona,b 
   ConditionalExpressiona,b
|  LeftSideExpressiona = AssignmentExpressionnormal,b
|  LeftSideExpressiona CompoundAssignment AssignmentExpressionnormal,b

expands into the following four rules:

AssignmentExpressionnormal,allowIn 
   ConditionalExpressionnormal,allowIn
|  LeftSideExpressionnormal = AssignmentExpressionnormal,allowIn
|  LeftSideExpressionnormal CompoundAssignment AssignmentExpressionnormal,allowIn
AssignmentExpressionnormal,noIn 
   ConditionalExpressionnormal,noIn
|  LeftSideExpressionnormal = AssignmentExpressionnormal,noIn
|  LeftSideExpressionnormal CompoundAssignment AssignmentExpressionnormal,noIn
AssignmentExpressioninitial,allowIn 
   ConditionalExpressioninitial,allowIn
|  LeftSideExpressioninitial = AssignmentExpressionnormal,allowIn
|  LeftSideExpressioninitial CompoundAssignment AssignmentExpressionnormal,allowIn
AssignmentExpressioninitial,noIn 
   ConditionalExpressioninitial,noIn
|  LeftSideExpressioninitial = AssignmentExpressionnormal,noIn
|  LeftSideExpressioninitial CompoundAssignment AssignmentExpressionnormal,noIn

AssignmentExpressionnormal,allowIn is now an unparametrized nonterminal and processed normally by the grammar.

Some of the expanded rules (such as the fourth one in the example above) may be unreachable from the starting nonterminal Program; these are ignored.

Expressions

a  {normalinitial}
b  {allowInnoIn}

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

LeftSideExpressiona 
   CallExpressiona
|  ShortNewExpression
CallExpressiona 
   PrimaryExpressiona
|  FullNewExpression
|  CallExpressiona MemberOperator
|  CallExpressiona 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

PostfixExpressiona 
   LeftSideExpressiona
|  LeftSideExpressiona ++
|  LeftSideExpressiona --

Unary Operators

UnaryExpressiona 
   PostfixExpressiona
|  delete LeftSideExpressionnormal
|  void UnaryExpressionnormal
|  typeof UnaryExpressionnormal
|  ++ LeftSideExpressionnormal
|  -- LeftSideExpressionnormal
|  + UnaryExpressionnormal
|  - UnaryExpressionnormal
|  ~ UnaryExpressionnormal
|  ! UnaryExpressionnormal

Multiplicative Operators

MultiplicativeExpressiona 
   UnaryExpressiona
|  MultiplicativeExpressiona * UnaryExpressionnormal
|  MultiplicativeExpressiona / UnaryExpressionnormal
|  MultiplicativeExpressiona % UnaryExpressionnormal

Additive Operators

AdditiveExpressiona 
   MultiplicativeExpressiona
|  AdditiveExpressiona + MultiplicativeExpressionnormal
|  AdditiveExpressiona - MultiplicativeExpressionnormal

Bitwise Shift Operators

ShiftExpressiona 
   AdditiveExpressiona
|  ShiftExpressiona << AdditiveExpressionnormal
|  ShiftExpressiona >> AdditiveExpressionnormal
|  ShiftExpressiona >>> AdditiveExpressionnormal

Relational Operators

RelationalExpressiona,allowIn 
   ShiftExpressiona
|  RelationalExpressiona,allowIn < ShiftExpressionnormal
|  RelationalExpressiona,allowIn > ShiftExpressionnormal
|  RelationalExpressiona,allowIn <= ShiftExpressionnormal
|  RelationalExpressiona,allowIn >= ShiftExpressionnormal
|  RelationalExpressiona,allowIn instanceof ShiftExpressionnormal
|  RelationalExpressiona,allowIn in ShiftExpressionnormal
RelationalExpressiona,noIn 
   ShiftExpressiona
|  RelationalExpressiona,noIn < ShiftExpressionnormal
|  RelationalExpressiona,noIn > ShiftExpressionnormal
|  RelationalExpressiona,noIn <= ShiftExpressionnormal
|  RelationalExpressiona,noIn >= ShiftExpressionnormal
|  RelationalExpressiona,noIn instanceof ShiftExpressionnormal

Equality Operators

EqualityExpressiona,b 
   RelationalExpressiona,b
|  EqualityExpressiona,b == RelationalExpressionnormal,b
|  EqualityExpressiona,b != RelationalExpressionnormal,b
|  EqualityExpressiona,b === RelationalExpressionnormal,b
|  EqualityExpressiona,b !== RelationalExpressionnormal,b

Binary Bitwise Operators

BitwiseAndExpressiona,b 
   EqualityExpressiona,b
|  BitwiseAndExpressiona,b & EqualityExpressionnormal,b
BitwiseXorExpressiona,b 
   BitwiseAndExpressiona,b
|  BitwiseXorExpressiona,b ^ BitwiseAndExpressionnormal,b
BitwiseOrExpressiona,b 
   BitwiseXorExpressiona,b
|  BitwiseOrExpressiona,b | BitwiseXorExpressionnormal,b

Binary Logical Operators

LogicalAndExpressiona,b 
   BitwiseOrExpressiona,b
|  LogicalAndExpressiona,b && BitwiseOrExpressionnormal,b
LogicalOrExpressiona,b 
   LogicalAndExpressiona,b
|  LogicalOrExpressiona,b || LogicalAndExpressionnormal,b

Conditional Operator

ConditionalExpressiona,b 
   LogicalOrExpressiona,b
|  LogicalOrExpressiona,b ? AssignmentExpressionnormal,b : AssignmentExpressionnormal,b

Assignment Operators

AssignmentExpressiona,b 
   ConditionalExpressiona,b
|  LeftSideExpressiona = AssignmentExpressionnormal,b
|  LeftSideExpressiona CompoundAssignment AssignmentExpressionnormal,b
CompoundAssignment 
   *=
|  /=
|  %=
|  +=
|  -=
|  <<=
|  >>=
|  >>>=
|  &=
|  ^=
|  |=

Expressions

Expressiona,b 
   AssignmentExpressiona,b
|  Expressiona,b , AssignmentExpressionnormal,b
OptionalExpression 
   Expressionnormal,allowIn
|  «empty»

Statements

w  {noShortIffull}
Statementw 
   EmptyStatement
|  ExpressionStatement OptionalSemicolon
|  VariableDefinition OptionalSemicolon
|  Block
|  LabeledStatementw
|  IfStatementw
|  SwitchStatement
|  DoStatement OptionalSemicolon
|  WhileStatementw
|  ForStatementw
|  WithStatementw
|  ContinueStatement OptionalSemicolon
|  BreakStatement OptionalSemicolon
|  ReturnStatement OptionalSemicolon
|  ThrowStatement OptionalSemicolon
|  TryStatement
OptionalSemicolon  ;

Empty Statement

EmptyStatement  ;

Expression Statement

ExpressionStatement  Expressioninitial,allowIn

Variable Definition

VariableDefinition  var VariableDeclarationListallowIn
VariableDeclarationListb 
   VariableDeclarationb
|  VariableDeclarationListb , VariableDeclarationb
VariableDeclarationb  Identifier VariableInitializerb
VariableInitializerb 
   «empty»
|  = AssignmentExpressionnormal,b

Block

Block  { BlockStatements }
BlockStatements 
   «empty»
|  BlockStatementsPrefix
BlockStatementsPrefix 
   Statementfull
|  BlockStatementsPrefix Statementfull

Labeled Statements

LabeledStatementw  Identifier : Statementw

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

WhileStatementw  while ParenthesizedExpression Statementw

For Statements

ForStatementw 
   for ( ForInitializer ; OptionalExpression ; OptionalExpression ) Statementw
|  for ( ForInBinding in Expressionnormal,allowIn ) Statementw
ForInitializer 
   «empty»
|  Expressionnormal,noIn
|  var VariableDeclarationListnoIn
ForInBinding 
   LeftSideExpressionnormal
|  var VariableDeclarationnoIn

With Statement

WithStatementw  with ParenthesizedExpression Statementw

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