-
Notifications
You must be signed in to change notification settings - Fork 6
EM Syntax
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
;