BNF Grammar: Difference between revisions

Content added Content deleted
Line 6,507: Line 6,507:


=={{header|JavaScript}}==
=={{header|JavaScript}}==
<pre>
"Name" = 'JavaScript Grammar'
"Author" = 'M.Schnoor-Matriciani'
"Version" = '0.9'
"About" = 'JavaScript Grammar, Subset of ECMA Edition 3'

"Start Symbol" = <Program>
"Case Sensitive" = 'True'
! ------------------------------------------------- Sets

{ID Head} = {Letter} + [_] + [$]
{ID Tail} = {Alphanumeric} + [_] + [$]
{String Chars1} = {Printable} + {HT} - ["\]
{String Chars2} = {Printable} + {HT} - [\'']
{Hex Digit} = {Digit} + [ABCDEF] + [abcdef]
{RegExp Chars} = {Letter}+{Digit}+['^']+['$']+['*']+['+']+['?']+['{']+['}']+['|']+['-']+['.']+[',']+['#']+['[']+[']']+['_']+['<']+['>']
{Non Terminator} = {String Chars1} - {CR} - {LF}
{Non Zero Digits}={Digit}-[0]

! ------------------------------------------------- Terminals

Identifier = {ID Head}{ID Tail}*
StringLiteral = '"' ( {String Chars1} | '\' {Printable} )* '"' | '' ( {String Chars2} | '\' {Printable} )* ''

HexIntegerLiteral = '0x' {Hex Digit}+

RegExp = '/' ({RegExp Chars} | '\' {Non Terminator})+ '/' ( 'g' | 'i' | 'm' )*
DecimalLiteral= {Non Zero Digits}+ '.' {Digit}* ('e' | 'E' ) {Non Zero Digits}+ {Digit}* | {Non Zero Digits}+ '.' {Digit}* | '0' '.' {Digit}+ ('e' | 'E' ) {Non Zero Digits}+ {Digit}* | {Non Zero Digits}+ {Digit}* | '0' | '0' '.' {Digit}+

Comment Start = '/*'
Comment End = '*/'
Comment Line = '//'

! ------------------------------------------------- Rules

<Literal> ::= <Null Literal>
| <Boolean Literal>
| <Numeric Literal>
| StringLiteral

<Null Literal> ::= null
<Boolean Literal> ::= 'true'
| 'false'

<Numeric Literal> ::= DecimalLiteral
| HexIntegerLiteral

<Regular Expression Literal> ::= RegExp

<Primary Expression> ::= 'this'
| Identifier
| <Literal>
| <Array Literal>
| <Object Literal>
| '(' <Expression> ')'
| <Regular Expression Literal>

<Array Literal> ::= '[' ']'
| '[' <Elision> ']'
| '[' <Element List> ']'
| '[' <Element List> ',' <Elision> ']'

<Elision> ::= ','
| <Elision> ','

<Element List> ::= <Elision> <Assignment Expression>
| <Element List> ',' <Elision> <Assignment Expression>
| <Element List> ',' <Assignment Expression>
| <Assignment Expression>

<Object Literal> ::= '{' <Property Name and Value List> '}'

<Property Name and Value List> ::= <Property Name> ':' <Assignment Expression>
| <Property Name and Value List> ',' <Property Name> ':' <Assignment Expression>

<Property Name> ::= Identifier
| StringLiteral
| <Numeric Literal>

<Member Expression > ::= <Primary Expression>
| <Function Expression>
| <Member Expression> '[' <Expression> ']'
| <Member Expression> '.' Identifier
| 'new' <Member Expression> <Arguments>

<New Expression> ::= <Member Expression>
| new <New Expression>

<Call Expression> ::= <Member Expression> <Arguments>
| <Call Expression> <Arguments>
| <Call Expression> '[' <Expression> ']'
| <Call Expression> '.' Identifier

<Arguments> ::= '(' ')'
| '(' <Argument List> ')'

<Argument List> ::= <Assignment Expression>
| <Argument List> ',' <Assignment Expression>


<Left Hand Side Expression> ::= <New Expression>
| <Call Expression>

<Postfix Expression> ::= <Left Hand Side Expression>
| <Postfix Expression> '++'
| <Postfix Expression> '--'

<Unary Expression> ::= <Postfix Expression>
| 'delete' <Unary Expression>
| 'void' <Unary Expression>
| 'typeof' <Unary Expression>
| '++' <Unary Expression>
| '--' <Unary Expression>
| '+' <Unary Expression>
| '-' <Unary Expression>
| '~' <Unary Expression>
| '!' <Unary Expression>

<Multiplicative Expression> ::= <Unary Expression>
| <Unary Expression> '*' <Multiplicative Expression>
| <Unary Expression> '/' <Multiplicative Expression>
| <Unary Expression> '%' <Multiplicative Expression>

<Additive Expression> ::= <Additive Expression>'+'<Multiplicative Expression>
| <Additive Expression>'-'<Multiplicative Expression>
| <Multiplicative Expression>



<Shift Expression> ::= <Shift Expression> '<<' <Additive Expression>
| <Shift Expression> '>>' <Additive Expression>
| <Shift Expression> '>>>' <Additive Expression>
| <Additive Expression>

<Relational Expression>::= <Shift Expression>
| <Relational Expression> '<' <Shift Expression>
| <Relational Expression> '>' <Shift Expression>
| <Relational Expression> '<=' <Shift Expression>
| <Relational Expression> '>=' <Shift Expression>
| <Relational Expression> 'instanceof' <Shift Expression>

<Equality Expression> ::= <Relational Expression>
| <Equality Expression> '==' <Relational Expression>
| <Equality Expression> '!=' <Relational Expression>
| <Equality Expression> '===' <Relational Expression>
| <Equality Expression> '!==' <Relational Expression>

<Bitwise And Expression> ::= <Equality Expression>
| <Bitwise And Expression> '&' <Equality Expression>

<Bitwise XOr Expression> ::= <Bitwise And Expression>
| <Bitwise XOr Expression> '^' <Bitwise And Expression>

<Bitwise Or Expression> ::= <Bitwise XOr Expression>
| <Bitwise Or Expression> '|' <Bitwise XOr Expression>

<Logical And Expression> ::= <Bitwise Or Expression>
| <Logical And Expression> '&&' <Bitwise Or Expression>

<Logical Or Expression> ::= <Logical And Expression>
| <Logical Or Expression> '||' <Logical And Expression>

<Conditional Expression> ::= <Logical Or Expression>
| <Logical Or Expression> '?' <Assignment Expression> ':' <Assignment Expression>

<Assignment Expression> ::= <Conditional Expression>
| <Left Hand Side Expression> <Assignment Operator> <Assignment Expression>
<Assignment Operator> ::= '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '>>>=' | '&=' | '^=' | '|='

<Expression> ::= <Assignment Expression>
| <Expression> ',' <Assignment Expression>

<Statement> ::= <Block>
| <Variable Statement>
| <Empty Statement>
| <If Statement>
| <If Else Statement>
| <Iteration Statement>
| <Continue Statement>
| <Break Statement>
| <Return Statement>
| <With Statement>
| <Labelled Statement>
| <Switch Statement>
| <Throw Statement>
| <Try Statement>
| <Expression>

<Block > ::= '{' '}'
| '{' <Statement List> '}'

<Statement List> ::= <Statement>
| <Statement List> <Statement>

<Variable Statement> ::= var <Variable Declaration List> ';'
<Variable Declaration List> ::= <Variable Declaration>
| <Variable Declaration List> ',' <Variable Declaration>

<Variable Declaration> ::= Identifier
| Identifier <Initializer>

<Initializer> ::= '=' <Assignment Expression>

<Empty Statement> ::= ';'

<If Statement> ::= 'if' '(' <Expression> ')' <Statement>
<If Else Statement> ::= 'if' '(' <Expression> ')' <Statement> 'else' <Statement>

<Iteration Statement> ::= 'do' <Statement> 'while' '(' <Expression> ')' ';'
| 'while' '(' <Expression> ')' <Statement>
| 'for' '(' <Expression> ';' <Expression> ';' <Expression> ')' <Statement>
| 'for' '(' 'var' <Variable Declaration List> ';' <Expression> ';' <Expression> ')' <Statement>
| 'for' '(' <Left Hand Side Expression> in <Expression> ')' <Statement>
| 'for' '(' 'var' <Variable Declaration> in <Expression> ')' <Statement>

<Continue Statement> ::= 'continue' ';'
| 'continue' Identifier ';'

<Break Statement> ::= 'break' ';'
| 'break' Identifier ';'

<Return Statement> ::= 'return' ';'
| 'return' <Expression> ';'

<With Statement> ::= 'with' '(' <Expression> ')' <Statement> ';'

<Switch Statement> ::= 'switch' '(' <Expression> ')' <Case Block>

<Case Block> ::= '{' '}'
| '{' <Case Clauses> '}'
| '{' <Case Clauses> <Default Clause> '}'
| '{' <Case Clauses> <Default Clause> <Case Clauses> '}'
| '{' <Default Clause> <Case Clauses> '}'
| '{' <Default Clause> '}'

<Case Clauses> ::= <Case Clause>
| <Case Clauses> <Case Clause>

<Case Clause> ::= 'case' <Expression> ':' <Statement List>
| 'case' <Expression> ':'

<Default Clause> ::= 'default' ':'
| 'default' ':' <Statement List>

<Labelled Statement> ::= Identifier ':' <Statement>

<Throw Statement> ::= 'throw' <Expression>

<Try Statement> ::= 'try' <Block> <Catch>
| 'try' <Block> <Finally>
| 'try' <Block> <Catch> <Finally>

<Catch> ::= 'catch' '(' Identifier ')' <Block>

<Finally> ::= 'finally' <Block>

<Function Declaration> ::= 'function' Identifier '(' <Formal Parameter List> ')' '{' <Function Body> '}'
| 'function' Identifier '(' ')' '{' <Function Body> '}'

<Function Expression> ::= 'function' '(' ')' '{' <Function Body> '}'
| 'function' '(' <Formal Parameter List> ')' '{' <Function Body> '}'


<Formal Parameter List> ::= Identifier
| <Formal Parameter List> ',' Identifier

<Function Body> ::= <Source Elements>
|

<Program> ::= <Source Elements>

<Source Elements> ::= <Source Element>
| <Source Elements> <Source Element>

<Source Element> ::= <Statement>
| <Function Declaration>

</pre>

=={{header|JoCaml}}==
=={{header|JoCaml}}==
=={{header|Joy}}==
=={{header|Joy}}==