BNF for a small subset of JavaScript

NonTerminals

/* Program */
Program ::= ( SourceElements )? <EOF>
SourceElements ::= ( SourceElement )+
Statements ::= ( Statement )+
SourceElement ::= FunctionDeclaration
| Statement
/* Function Definition */
FunctionDeclaration ::= "function" Identifier "(" ( FormalParameterList )? ")" FunctionBody
FormalParameterList ::= Identifier ( "," Identifier )*
FunctionBody ::= "{" ( Statements )? ( ReturnStatement )? "}"
/* STATEMENTS */
Statement ::= Block
| VariableStatement
| EmptyStatement
| IfStatement
| IterationStatement
| SelectionStatement
| UpdateStatement
| MethodCallStatement
| FunctionCallStatement
| AllocationStatement
| AssignmentStatement
SelectionStatement ::= Identifier "=" ReceiverExpression "." Identifier ";"
UpdateStatement ::= ReceiverExpression "." Identifier "=" PrimaryExpression ";"
MethodCallStatement ::= Identifier "=" ReceiverExpression "." Identifier Arguments ";"
FunctionCallStatement ::= Identifier "=" Identifier Arguments ";"
AllocationStatement ::= Identifier "=" "new" Identifier Arguments ";"
AssignmentStatement ::= Identifier "=" Expression ";"
ReceiverExpression ::= "this"
| Identifier
Block ::= "{" ( StatementList )? "}"
StatementList ::= ( Statement )+
VariableStatement ::= "var" VariableDeclarationList ( ";" )?
VariableDeclarationList ::= Identifier ( "," Identifier )*
EmptyStatement ::= ";"
IfStatement ::= "if" "(" Expression ")" Statement ( "else" Statement )?
IterationStatement ::= "while" "(" Expression ")" Statement
ReturnStatement ::= "return" ( PrimaryExpression )? ( ";" )?
PrimaryExpression ::= "this"
| Identifier
| Literal
Arguments ::= "(" ( ArgumentList )? ")"
ArgumentList ::= PrimaryExpression ( "," PrimaryExpression )*
MemberExpression ::= Identifier
| Literal
| ParenExpression
ParenExpression ::= "(" Expression ")"
MultiplicativeExpression ::= MemberExpression ( MultiplicativeOperator MemberExpression )*
MultiplicativeOperator ::= ( "*" | <SLASH> | "%" )
AdditiveExpression ::= MultiplicativeExpression ( AdditiveOperator MultiplicativeExpression )*
AdditiveOperator ::= ( "+" | "-" )
RelationalExpression ::= AdditiveExpression ( RelationalOperator AdditiveExpression )*
RelationalOperator ::= ( "<" | ">" | "<=" | ">=" )
EqualityExpression ::= RelationalExpression ( EqualityOperator RelationalExpression )*
EqualityOperator ::= ( "==" | "!=" | "===" | "!==" )
LogicalANDExpression ::= EqualityExpression ( LogicalANDOperator EqualityExpression )*
LogicalANDOperator ::= "&&"
Expression ::= LogicalANDExpression ( LogicalOROperator LogicalANDExpression )*
LogicalOROperator ::= "||"
Literal ::= <DECIMAL_LITERAL>
| <HEX_INTEGER_LITERAL>
| <STRING_LITERAL>
| <BOOLEAN_LITERAL>
| <NULL_LITERAL>
| <REGULAR_EXPRESSION_LITERAL>
Identifier ::= <IDENTIFIER_NAME>