April 2002 Draft
JavaScript 2.0
Formal Description
Syntactic Grammar
previousupnext

Tuesday, February 26, 2002

This LALR(1) grammar describes the syntax of the JavaScript 2.0 proposal. The starting nonterminal is Program. See also the description of the grammar notation.

This document is also available as a Word 98 rtf file.

Terminals

General tokens: Identifier Number RegularExpression String VirtualSemicolon

Punctuation tokens: ! != !== % %= & && &&= &= ( ) * *= + ++ += , - -- -= . ... / /= : :: ; < << <<= <= = == === > >= >> >>= >>> >>>= ? [ ] ^ ^= ^^ ^^= { | |= || ||= } ~

Reserved words: abstract as break case catch class const continue default delete do else export extends false final finally for function if implements import in instanceof interface is namespace new null package private public return static super switch this throw true try typeof use var void while with

Future reserved words: debugger enum goto native protected synchronized throws transient volatile

Non-reserved words: exclude get include named set

Expressions

β ∈ {allowInnoIn}

Identifiers

Identifier 
   Identifier
|  get
|  set
|  exclude
|  include
|  named

Qualified Identifiers

Qualifier 
   Identifier
|  public
|  private
SimpleQualifiedIdentifier 
   Identifier
|  Qualifier :: Identifier
ExpressionQualifiedIdentifier ⇒ ParenExpression :: Identifier
QualifiedIdentifier 
   SimpleQualifiedIdentifier
|  ExpressionQualifiedIdentifier

Unit Expressions

UnitExpression 
   ParenListExpression
|  Number [no line break] String
|  UnitExpression [no line break] String

Primary Expressions

PrimaryExpression 
   null
|  true
|  false
|  public
|  Number
|  String
|  this
|  RegularExpression
|  UnitExpression
|  ArrayLiteral
|  ObjectLiteral
|  FunctionExpression
ParenExpression ⇒ ( AssignmentExpressionallowIn )
ParenListExpression 
   ParenExpression
|  ( ListExpressionallowIn , AssignmentExpressionallowIn )

Function Expressions

FunctionExpression 
   function FunctionSignature Block
|  function Identifier FunctionSignature Block

Object Literals

ObjectLiteral 
   { }
|  { FieldList }
FieldList 
   LiteralField
|  FieldList , LiteralField
LiteralField ⇒ FieldName : AssignmentExpressionallowIn
FieldName 
   Identifier
|  String
|  Number

Array Literals

ArrayLiteral ⇒ [ ElementList ]
ElementList 
   LiteralElement
|  ElementList , LiteralElement
LiteralElement 
   «empty»
|  AssignmentExpressionallowIn

Super Expressions

SuperExpression 
   super
|  FullSuperExpression
FullSuperExpression ⇒ super ParenExpression

Postfix Expressions

PostfixExpression 
   AttributeExpression
|  FullPostfixExpression
|  ShortNewExpression
PostfixExpressionOrSuper 
   PostfixExpression
|  SuperExpression
AttributeExpression 
   SimpleQualifiedIdentifier
|  AttributeExpression MemberOperator
|  AttributeExpression Arguments
FullPostfixExpression 
   PrimaryExpression
|  ExpressionQualifiedIdentifier
|  FullNewExpression
|  FullPostfixExpression MemberOperator
|  SuperExpression DotOperator
|  FullPostfixExpression Arguments
|  FullSuperExpression Arguments
|  PostfixExpressionOrSuper [no line break] ++
|  PostfixExpressionOrSuper [no line break] --
FullNewExpression 
   new FullNewSubexpression Arguments
|  new FullSuperExpression Arguments
FullNewSubexpression 
   PrimaryExpression
|  QualifiedIdentifier
|  FullNewExpression
|  FullNewSubexpression MemberOperator
|  SuperExpression DotOperator
ShortNewExpression 
   new ShortNewSubexpression
|  new SuperExpression
ShortNewSubexpression 
   FullNewSubexpression
|  ShortNewExpression

Member Operators

MemberOperator 
   DotOperator
|  . ParenExpression
DotOperator 
   . QualifiedIdentifier
|  Brackets
Brackets 
   [ ]
|  [ ListExpressionallowIn ]
|  [ NamedArgumentList ]
Arguments 
   ParenExpressions
|  ( NamedArgumentList )
ParenExpressions 
   ( )
|  ParenListExpression
NamedArgumentList 
   LiteralField
|  ListExpressionallowIn , LiteralField
|  NamedArgumentList , LiteralField

Unary Operators

UnaryExpression 
   PostfixExpression
|  delete PostfixExpression
|  void UnaryExpression
|  typeof UnaryExpression
|  ++ PostfixExpressionOrSuper
|  -- PostfixExpressionOrSuper
|  + UnaryExpressionOrSuper
|  - UnaryExpressionOrSuper
|  ~ UnaryExpressionOrSuper
|  ! UnaryExpression
UnaryExpressionOrSuper 
   UnaryExpression
|  SuperExpression

Multiplicative Operators

MultiplicativeExpression 
   UnaryExpression
|  MultiplicativeExpressionOrSuper * UnaryExpressionOrSuper
|  MultiplicativeExpressionOrSuper / UnaryExpressionOrSuper
|  MultiplicativeExpressionOrSuper % UnaryExpressionOrSuper
MultiplicativeExpressionOrSuper 
   MultiplicativeExpression
|  SuperExpression

Additive Operators

AdditiveExpression 
   MultiplicativeExpression
|  AdditiveExpressionOrSuper + MultiplicativeExpressionOrSuper
|  AdditiveExpressionOrSuper - MultiplicativeExpressionOrSuper
AdditiveExpressionOrSuper 
   AdditiveExpression
|  SuperExpression

Bitwise Shift Operators

ShiftExpression 
   AdditiveExpression
|  ShiftExpressionOrSuper << AdditiveExpressionOrSuper
|  ShiftExpressionOrSuper >> AdditiveExpressionOrSuper
|  ShiftExpressionOrSuper >>> AdditiveExpressionOrSuper
ShiftExpressionOrSuper 
   ShiftExpression
|  SuperExpression

Relational Operators

RelationalExpressionallowIn 
   ShiftExpression
|  RelationalExpressionOrSuperallowIn < ShiftExpressionOrSuper
|  RelationalExpressionOrSuperallowIn > ShiftExpressionOrSuper
|  RelationalExpressionOrSuperallowIn <= ShiftExpressionOrSuper
|  RelationalExpressionOrSuperallowIn >= ShiftExpressionOrSuper
|  RelationalExpressionallowIn is ShiftExpression
|  RelationalExpressionallowIn as ShiftExpression
|  RelationalExpressionallowIn in ShiftExpressionOrSuper
|  RelationalExpressionallowIn instanceof ShiftExpression
RelationalExpressionnoIn 
   ShiftExpression
|  RelationalExpressionOrSupernoIn < ShiftExpressionOrSuper
|  RelationalExpressionOrSupernoIn > ShiftExpressionOrSuper
|  RelationalExpressionOrSupernoIn <= ShiftExpressionOrSuper
|  RelationalExpressionOrSupernoIn >= ShiftExpressionOrSuper
|  RelationalExpressionnoIn is ShiftExpression
|  RelationalExpressionnoIn as ShiftExpression
|  RelationalExpressionnoIn instanceof ShiftExpression
RelationalExpressionOrSuperβ 
   RelationalExpressionβ
|  SuperExpression

Equality Operators

EqualityExpressionβ 
   RelationalExpressionβ
|  EqualityExpressionOrSuperβ == RelationalExpressionOrSuperβ
|  EqualityExpressionOrSuperβ != RelationalExpressionOrSuperβ
|  EqualityExpressionOrSuperβ === RelationalExpressionOrSuperβ
|  EqualityExpressionOrSuperβ !== RelationalExpressionOrSuperβ
EqualityExpressionOrSuperβ 
   EqualityExpressionβ
|  SuperExpression

Binary Bitwise Operators

BitwiseAndExpressionβ 
   EqualityExpressionβ
|  BitwiseAndExpressionOrSuperβ & EqualityExpressionOrSuperβ
BitwiseXorExpressionβ 
   BitwiseAndExpressionβ
|  BitwiseXorExpressionOrSuperβ ^ BitwiseAndExpressionOrSuperβ
BitwiseOrExpressionβ 
   BitwiseXorExpressionβ
|  BitwiseOrExpressionOrSuperβ | BitwiseXorExpressionOrSuperβ
BitwiseAndExpressionOrSuperβ 
   BitwiseAndExpressionβ
|  SuperExpression
BitwiseXorExpressionOrSuperβ 
   BitwiseXorExpressionβ
|  SuperExpression
BitwiseOrExpressionOrSuperβ 
   BitwiseOrExpressionβ
|  SuperExpression

Binary Logical Operators

LogicalAndExpressionβ 
   BitwiseOrExpressionβ
|  LogicalAndExpressionβ && BitwiseOrExpressionβ
LogicalXorExpressionβ 
   LogicalAndExpressionβ
|  LogicalXorExpressionβ ^^ LogicalAndExpressionβ
LogicalOrExpressionβ 
   LogicalXorExpressionβ
|  LogicalOrExpressionβ || LogicalXorExpressionβ

Conditional Operator

ConditionalExpressionβ 
   LogicalOrExpressionβ
|  LogicalOrExpressionβ ? AssignmentExpressionβ : AssignmentExpressionβ
NonAssignmentExpressionβ 
   LogicalOrExpressionβ
|  LogicalOrExpressionβ ? NonAssignmentExpressionβ : NonAssignmentExpressionβ

Assignment Operators

AssignmentExpressionβ 
   ConditionalExpressionβ
|  PostfixExpression = AssignmentExpressionβ
|  PostfixExpressionOrSuper CompoundAssignment AssignmentExpressionβ
|  PostfixExpressionOrSuper CompoundAssignment SuperExpression
|  PostfixExpression LogicalAssignment AssignmentExpressionβ
CompoundAssignment 
   *=
|  /=
|  %=
|  +=
|  -=
|  <<=
|  >>=
|  >>>=
|  &=
|  ^=
|  |=
LogicalAssignment 
   &&=
|  ^^=
|  ||=

Comma Expressions

ListExpressionβ 
   AssignmentExpressionβ
|  ListExpressionβ , AssignmentExpressionβ
OptionalExpression 
   ListExpressionallowIn
|  «empty»

Type Expressions

TypeExpressionβ ⇒ NonAssignmentExpressionβ

Statements

ω ∈ {abbrevnoShortIffull}
Statementω 
   ExpressionStatement Semicolonω
|  SuperStatement Semicolonω
|  Block
|  LabeledStatementω
|  IfStatementω
|  SwitchStatement
|  DoStatement Semicolonω
|  WhileStatementω
|  ForStatementω
|  WithStatementω
|  ContinueStatement Semicolonω
|  BreakStatement Semicolonω
|  ReturnStatement Semicolonω
|  ThrowStatement Semicolonω
|  TryStatement
Substatementω 
   EmptyStatement
|  Statementω
|  SimpleVariableDefinition Semicolonω
|  Attributes [no line break] { Substatements }
Substatements 
   «empty»
|  SubstatementsPrefix Substatementabbrev
SubstatementsPrefix 
   «empty»
|  SubstatementsPrefix Substatementfull
Semicolonabbrev 
   ;
|  VirtualSemicolon
|  «empty»
SemicolonnoShortIf 
   ;
|  VirtualSemicolon
|  «empty»
Semicolonfull 
   ;
|  VirtualSemicolon

Empty Statement

EmptyStatement ⇒ ;

Expression Statement

ExpressionStatement ⇒ [lookahead∉{function{}] ListExpressionallowIn

Super Statement

SuperStatement ⇒ super Arguments

Block Statement

Block ⇒ { Directives }

Labeled Statements

LabeledStatementω ⇒ Identifier : Substatementω

If Statement

IfStatementabbrev 
   if ParenListExpression Substatementabbrev
|  if ParenListExpression SubstatementnoShortIf else Substatementabbrev
IfStatementfull 
   if ParenListExpression Substatementfull
|  if ParenListExpression SubstatementnoShortIf else Substatementfull
IfStatementnoShortIf ⇒ if ParenListExpression SubstatementnoShortIf else SubstatementnoShortIf

Switch Statement

SwitchStatement ⇒ switch ParenListExpression { CaseStatements }
CaseStatements 
   «empty»
|  CaseLabel
|  CaseLabel CaseStatementsPrefix CaseStatementabbrev
CaseStatementsPrefix 
   «empty»
|  CaseStatementsPrefix CaseStatementfull
CaseStatementω 
   Substatementω
|  CaseLabel
CaseLabel 
   case ListExpressionallowIn :
|  default :

Do-While Statement

DoStatement ⇒ do Substatementabbrev while ParenListExpression

While Statement

WhileStatementω ⇒ while ParenListExpression Substatementω

For Statements

ForStatementω 
   for ( ForInitialiser ; OptionalExpression ; OptionalExpression ) Substatementω
|  for ( ForInBinding in ListExpressionallowIn ) Substatementω
ForInitialiser 
   «empty»
|  ListExpressionnoIn
|  VariableDefinitionKind VariableBindingListnoIn
|  Attributes [no line break] VariableDefinitionKind VariableBindingListnoIn
ForInBinding 
   PostfixExpression
|  VariableDefinitionKind VariableBindingnoIn
|  Attributes [no line break] VariableDefinitionKind VariableBindingnoIn

With Statement

WithStatementω ⇒ with ParenListExpression Substatementω

Continue and Break Statements

ContinueStatement 
   continue
|  continue [no line break] Identifier
BreakStatement 
   break
|  break [no line break] Identifier

Return Statement

ReturnStatement 
   return
|  return [no line break] ListExpressionallowIn

Throw Statement

ThrowStatement ⇒ throw [no line break] ListExpressionallowIn

Try Statement

TryStatement 
   try Block CatchClauses
|  try Block FinallyClause
|  try Block CatchClauses FinallyClause
CatchClauses 
   CatchClause
|  CatchClauses CatchClause
CatchClause ⇒ catch ( Parameter ) Block
FinallyClause ⇒ finally Block

Directives

Directiveω 
   EmptyStatement
|  Statementω
|  AnnotatableDirectiveω
|  Attributes [no line break] AnnotatableDirectiveω
|  Attributes [no line break] { Directives }
|  PackageDefinition
|  IncludeDirective Semicolonω
|  Pragma Semicolonω
AnnotatableDirectiveω 
   ExportDefinition Semicolonω
|  VariableDefinition Semicolonω
|  FunctionDefinitionω
|  ClassDefinition
|  NamespaceDefinition Semicolonω
|  InterfaceDefinitionω
|  ImportDirective Semicolonω
|  UseDirective Semicolonω
Directives 
   «empty»
|  DirectivesPrefix Directiveabbrev
DirectivesPrefix 
   «empty»
|  DirectivesPrefix Directivefull

Attributes

Attributes 
   Attribute
|  AttributeCombination
AttributeCombination ⇒ Attribute [no line break] Attributes
Attribute 
   AttributeExpression
|  true
|  false
|  public
|  NonexpressionAttribute
NonexpressionAttribute 
   abstract
|  final
|  private
|  static

Use Directive

UseDirective ⇒ use namespace ParenListExpression

Import Directive

ImportDirective 
   import ImportBinding IncludesExcludes
|  import ImportBinding , namespace ParenListExpression IncludesExcludes
ImportBinding 
   ImportSource
|  Identifier = ImportSource
ImportSource 
   String
|  PackageName
IncludesExcludes 
   «empty»
|  , exclude ( NamePatterns )
|  , include ( NamePatterns )
NamePatterns 
   «empty»
|  NamePatternList
NamePatternList 
   QualifiedIdentifier
|  NamePatternList , QualifiedIdentifier

Include Directive

IncludeDirective ⇒ include [no line break] String

Pragma

Pragma ⇒ use PragmaItems
PragmaItems 
   PragmaItem
|  PragmaItems , PragmaItem
PragmaItem 
   PragmaExpr
|  PragmaExpr ?
PragmaExpr 
   Identifier
|  Identifier ( PragmaArgument )
PragmaArgument 
   true
|  false
|  Number
|  - Number
|  String

Definitions

Export Definition

ExportDefinition ⇒ export ExportBindingList
ExportBindingList 
   ExportBinding
|  ExportBindingList , ExportBinding
ExportBinding 
   FunctionName
|  FunctionName = FunctionName

Variable Definition

VariableDefinition ⇒ VariableDefinitionKind VariableBindingListallowIn
VariableDefinitionKind 
   var
|  const
VariableBindingListβ 
   VariableBindingβ
|  VariableBindingListβ , VariableBindingβ
VariableBindingβ ⇒ TypedIdentifierβ VariableInitialisationβ
VariableInitialisationβ 
   «empty»
|  = VariableInitialiserβ
VariableInitialiserβ 
   AssignmentExpressionβ
|  NonexpressionAttribute
|  AttributeCombination
TypedIdentifierβ 
   Identifier
|  Identifier : TypeExpressionβ

Simple Variable Definition

A SimpleVariableDefinition represents the subset of VariableDefinition expansions that may be used when the variable definition is used as a Substatementω instead of a Directiveω in non-strict mode. In strict mode variable definitions may not be used as substatements.

SimpleVariableDefinition ⇒ var UntypedVariableBindingList
UntypedVariableBindingList 
   UntypedVariableBinding
|  UntypedVariableBindingList , UntypedVariableBinding
UntypedVariableBinding ⇒ Identifier VariableInitialisationallowIn

Function Definition

FunctionDefinitionω 
   FunctionDeclaration Block
|  FunctionDeclaration Semicolonω
FunctionDeclaration ⇒ function FunctionName FunctionSignature
FunctionName 
   Identifier
|  get [no line break] Identifier
|  set [no line break] Identifier
|  String
FunctionSignature ⇒ ParameterSignature ResultSignature
ParameterSignature ⇒ ( Parameters )
Parameters 
   «empty»
|  AllParameters
AllParameters 
   Parameter
|  Parameter , AllParameters
|  OptionalParameters
OptionalParameters 
   OptionalParameter
|  OptionalParameter , OptionalParameters
|  RestAndNamedParameters
RestAndNamedParameters 
   NamedParameters
|  RestParameter
|  RestParameter , NamedParameters
|  NamedRestParameter
NamedParameters 
   NamedParameter
|  NamedParameter , NamedParameters
Parameter 
   TypedIdentifierallowIn
|  const TypedIdentifierallowIn
OptionalParameter ⇒ Parameter = AssignmentExpressionallowIn
TypedInitialiser ⇒ TypedIdentifierallowIn = AssignmentExpressionallowIn
NamedParameter 
   named TypedInitialiser
|  const named TypedInitialiser
|  named const TypedInitialiser
RestParameter 
   ...
|  ... Parameter
NamedRestParameter 
   ... named Identifier
|  ... const named Identifier
|  ... named const Identifier
ResultSignature 
   «empty»
|  : TypeExpressionallowIn

Class Definition

ClassDefinition ⇒ class Identifier Inheritance Block
Inheritance 
   «empty»
|  extends TypeExpressionallowIn
|  implements TypeExpressionList
|  extends TypeExpressionallowIn implements TypeExpressionList

Interface Definition

InterfaceDefinitionω 
   interface Identifier ExtendsList Block
|  interface Identifier Semicolonω
ExtendsList 
   «empty»
|  extends TypeExpressionList
TypeExpressionList 
   TypeExpressionallowIn

Namespace Definition

NamespaceDefinition ⇒ namespace Identifier

Package Definition

PackageDefinition 
   package Block
|  package PackageName Block
PackageName 
   Identifier
|  PackageName . Identifier

Programs

Program ⇒ Directives

Waldemar Horwat
Last modified Tuesday, February 26, 2002
previousupnext