overview

Below is a formal expression of the ObjectTalk scripting language in Extended Backus–Naur Form (EBNF). You can read more about this notation on Wikipedia. The pretty diagrams were created using the "RailRoad Diagram Generator" which translates EBNF into HTML with pictures. This tool is highly recommended for visualizing grammar.

module

Railroad Diagram

module ::= statement*

statement

Railroad Diagram

statement ::= expression ";"
| block
| "var" name ("=" expression)? ";"
| "class" name ":" expression block
| "function" name "(" ((name ("," name)*)?) ")" block
| "if" expression block ("elif" expression block)* ("else" block)?
| "while" expression block
| "do" block "while" expression ";"
| "for" name "in" expression block
| "throw" expression ";"
| "try" block "catch" name block
| "return" expression ";"

block

Railroad Diagram

block ::= "{" statement* "}"

expression

Railroad Diagram

expression ::= conditional (
    "=" expression |
    "*=" expression |
    "/=" expression |
    "%=" expression |
    "+=" expression |
    "-=" expression |
    "|=" expression |
    "^=" expression |
    "&=" expression)*

conditional

Railroad Diagram

conditional ::= or ("?" expression ":" expression)?

or

Railroad Diagram

or ::= and ("||" and)*

and

Railroad Diagram

and ::= bytewise-or ("&&" bytewise-or)*

bytewise-or

Railroad Diagram

bytewise-or ::= bytewise-xor ("|" bytewise-xor)*

bytewise-xor

Railroad Diagram

bytewise-xor ::= bytewise-and ("^" bytewise-and)*

bytewise-and

Railroad Diagram

bytewise-and ::= equal ("&" equal)*

equal

Railroad Diagram

equal ::= relation ("==" relation  | "!=" relation)*

relation

Railroad Diagram

relation ::= shift (
    "<" shift |
    "<=" shift |
    ">" shift |
    ">=" shift |
    "in" shift |
    "not in" shift)*

shift

Railroad Diagram

shift ::= addition ("<<" addition | ">>" addition)*

addition

Railroad Diagram

addition ::= multiplication ("+" multiplication | "-" multiplication)*

multiplication

Railroad Diagram

multiplication ::= prefix ("*" prefix | "/" prefix | "%" prefix)*

prefix

Railroad Diagram

prefix ::= ("-" | "!" | "^" | "++" | "--")? postfix

postfix

Railroad Diagram

postfix ::= primary ("[" expression "]" | "(" expression ("," expression)* ")" | "." name | "++" | "--")*

primary

Railroad Diagram

primary ::= "(" expression ")"
| "[" expression ("," expression)* "]"
| "{" string ":" expression ("," string ":" expression)* "}"
| integer
| real
| string
| function
| name
| "super" "." name

integer

Railroad Diagram

integer ::= [-+]? [0-9][0-9]*

real

Railroad Diagram

real ::= [-]? [0-9][0-9]*.[0-9][0-9]* ([Ee] [-]? [0-9][0-9]*)?

string

Railroad Diagram

string ::= '"' (Char - ["\] | '\' ["\bfnrt] | "\u"  [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f])* '"'

function

Railroad Diagram

function ::= "function" "(" ((name ("," name)*)?) ")" block

name

Railroad Diagram

name ::= [a-zA-Z_][a-zA-Z0-9_]*