Skip to content
Kevin Lindsey edited this page Apr 2, 2014 · 3 revisions
// level 0

statements
    :   statements statement
    |   statement
    ;

// level 1

statement
    :   function-declaration
    |   if-statement
    |   sym-declaration
    |   sym-declaration ';'
    |   expression
    |   expression ';'
    ;

// level 2

function-declaration
    :   'func' name '(' parameters ')' block
    |   'func' name '(' ')' block
    ;

if-statement
    :   'if' '(' expression ')' block
    |   'if' '(' expression ')' block 'else' block
    |   'if' '(' expression ')' block else-if
    ;

sym-declaration
    :   'sym' name '=' expression
    |   'sym' name
    ;

expression
    :   conditional
    ;

// level 3

parameters
    :   parameters ',' parameter
    |   parameter
    ;

block
    :   '{' statements '}'
    |   '{' '}'
    ;

else-if
    :   'elsif' '(' expression ')' block else-if
    |   'elsif' '(' expression ')' block 'else' block
    |   'elsif' '(' expression ')' block
    ;

name
    :   IDENTIFIER
    |   STRING
    ;

conditional
    :   logical-or-expression '?' conditional ':' conditional
    ;

// level 4

parameter
    :   IDENTIFIER
    |   IDENTIFIER '=' simple-type
    ;

logical-or-expression
    :   logical-or-expression logical-or-operators logical-and-expression
    |   logical-and-expression
    ;

// level 5

simple-type
    :   NUMBER
    |   'true'
    |   'false'
    |   STRING
    |   'null'
    |   'undefined'
    ;

logical-or-operators
    :   '||'
    |   'or'
    ;

logical-and-expression
    :   logical-and-expression logical-and-operators equality-expression
    |   equality-expression
    ;

// level 6

logical-and-operators
    :   '&&'
    |   'and'
    ;

equality-expression
    :   equality-expression equality-operators relational-expression
    |   relational-expression
    ;

// level 7

equality-operators
    :   '=='
    |   'eq'
    |   '!='
    |   'ne'
    ;

relational-expression
    :   relational-expression relational-operators additive-expression
    |   additive-expression
    ;

// level 8

relational-operators
    :   '<'
    |   'lt'
    |   '<='
    |   'le'
    |   '>='
    |   'ge'
    |   '>'
    |   'gt'
    ;

additive-expression
    :   additive-expression additive-operators multiplicative-expression
    |   multiplicative-expression
    ;

// level 8

additive-operators
    :   '+'
    |   '-'
    ;

multiplicative-expression
    :   multiplicative-expression multiplicative-operators unary-expression
    |   unary-expression
    ;

// level 9

multiplicative-operators
    :   '*'
    |   '/'
    ;

unary-expression
    :   unary-expression unary-operator invocation-expression
    |   invocation-expression
    ;

// level 10

unary-operator
    :   '!'
    |   'not'
    |   '-'
    ;

invocation-expression
    :   member-expression '(' arguments ')'
    |   member-expression '(' ')'
    |   invocation-expression '(' arguments ')'
    |   invocation-expression '(' ')'
    |   invocation-expression '[' expression ']'
    |   invocation-expression '.' IDENTIFIER
    |   invocation-expression '{' expression '}'
    ;

// level 11

arguments
    :   arguments ',' expression
    |   expression
    ;

member-expression
    :   member-expression '[' expression ']'
    |   member-expression '.' IDENTIFIER
    |   member-expression '{' expression '}'
    |   function-expression
    |   primary
    ;

// level 12

function-expression
    :   'func' '(' parameters ')' block
    |   'func' '(' ')' block
    ;

primary
    :   IDENTIFIER
    |   'this'
    |   '(' expression ')'
    |   array-literal
    |   object-literal
    |   simple-type
    ;

// level 13

array-literal
    :   '[' elements ']'
    |   '[' ']'
    ;

object-literal
    :   '{' keyValues '}'
    |   '{' '}'
    ;

// level 14

elements
    :   elements ',' expression
    |   expression
    ;

keyValues
    :   keyValues ',' keyValue
    |   keyValue
    ;

// level 15

keyValue
    :   name ':' expression
    ;

Clone this wiki locally