-
Notifications
You must be signed in to change notification settings - Fork 5
JS Eden Syntax Reference
Note that the use of { and } means repeat this bit until it no longer matches. Actual brackets are escaped with a slash. Same goes for | (although currently this is not used in the language).
EXPRESSION ->
TERM with SCOPE
| TERM :: SCOPE
| TERM
E -> # | epsilon
E' ->
? EXPRESSION : EXPRESSION
| if EXPRESSION else EXPRESSION
| epsilon
These are the binary operators organised by precedence.
TERM -> T { && T | || T }
T -> T' E'
T' -> T'' { < T'' | <= T'' | > T'' | >= T'' | == T'' | != T'' }
T'' -> T''' { + T''' | - T''' | // T'''}
T''' -> T'''' { * T'''' | / T'''' | % T'''' | ^ T''''}
T'''' -> FACTOR E
Unary operators, literals or a primary.
FACTOR ->
( EXPRESSION )
| - FACTOR
| number
| string
| << observable\n string \nobservable
| boolean
| character
| JAVASCRIPT
| $ #
| $ number
| [ ELIST ]
| & LVALUE
| @
| * FACTOR
| ! FACTOR
| PRIMARY
Right-hand-side use of an observable or backticks, and list indices or function calls.
PRIMARY -> observable {\{ EXPRESSION \}} PRIMARY' | ` EXPRESSION ` PRIMARY'
PRIMARY' ->
( ELIST ) PRIMARY''
| . PRIMARY
| [ EXPRESSION ] PRIMARY'''
| epsilon
PRIMARY'' ->
( ELIST ) PRIMARY''
| [ EXPRESSION ] PRIMARY''
| epsilon
PRIMARY''' ->
. PRIMARY
| ( ELIST ) PRIMARY''
| [ EXPRESSION ] PRIMARY''
| epsilon
Specification of scope overrides. Note that only "in" should support RANGE, the other two should be "EXPRESSION" but need to be range for backward compatibility.
SCOPE -> ( SCOPE' ) | SCOPE'
SCOPE' ->
observable is RANGE SCOPE''
| observable in RANGE SCOPE''
| observable = RANGE SCOPE''
SCOPE'' -> , SCOPE' | epsilon
SCOPEPATTERN -> observable {[ EXPRESSION ]}
ELIST -> EXPRESSION ELIST' | epsilon
ELIST' -> , EXPRESSION ELIST' | epsilon
OLIST -> observable OLIST'
OLIST' -> , observable OLIST' | epsilon
PARAS -> para OLIST ; PARAS | epsilon
LOCALS ->
auto OLIST ; LOCALS
| local OLIST ; LOCALS
| epsilon
ACTION -> observable : OLIST FUNCBODY
IF -> ( EXPRESSION ) STATEMENT IF'
IF' -> else STATEMENT | epsilon
WHILE -> ( EXPRESSION ) STATEMENT
The _OPT means optional.
FOR ->
( STATEMENT'_OPT ; EXPRESSION_OPT ; STATEMENT'_OPT ) STATEMENT
| ( observable in RANGE ) STATEMENT
RANGE ->
EXPRESSION .. EXPRESSION
| EXPRESSION
STATEMENT'_OPT -> STATEMENT' | epsilon
EXPRESSION_OPT -> EXPRESSION | epsilon
DO ->
CODESELECTOR DO';
| \{ SCRIPT \} DO';
DO' ->
with SCOPE
| :: SCOPE
| epsilon
This can only be used inside procs and funcs. Default and break can also be used with this.
SWITCH -> ( EXPRESSION ) \{ SCRIPT \}
CASE -> string : | number : | character :
FUNCTION -> observable FUNCBODY
FUNCBODY -> \{ PARAS LOCALS SCRIPT \}
WHEN -> ( EXPRESSION ) STATEMENT WHEN'
WHEN' ->
with SCOPE
| :: SCOPE
| epsilon
IMPORT -> name IMPORT'
IMPORT' -> / IMPORT | IMPORT''
IMPORT'' ->
@ name IMPORT'''
| @ number IMPORT'''
| IMPORT'''
IMPORT''' -> noexec IMPORT''' | force IMPORT''' | create IMPORT''' |
refresh IMPORT''' | rebase IMPORT''' |
;
These should be deprecated as not fitting with the language.
INSERT -> LVALUE , EXPRESSION , EXPRESSION ;
DELETE -> LVALUE , EXPRESSION ;
APPEND -> LVALUE , EXPRESSION ;
SHIFT -> LVALUE ;
Wait cannot be used in a proc or func. The expression must return a number of milliseconds, any other type will fail at run-time.
WAIT -> EXPRESSION ;
Left-hand-side of a statement can be an observable, a pointer dereference or a backticks combined with list indices.
LVALUE ->
observable LVALUE''
| * PRIMARY LVALUE'
| ` EXPRESSION ` LVALUE'
LVALUE' -> [ EXPRESSION ] LVALUE' | . observable LVALUE' | epsilon
LVALUE'' ->
\{ EXPRESSION \} LVALUE''
| observable LVALUE''
| epsilon
STATEMENT ->
{ SCRIPT } |
when WHEN |
proc ACTION |
func FUNCTION |
action NAMEDSCRIPT |
for FOR |
while WHILE |
switch SWITCH |
case CASE |
default : |
if IF |
return EOPT ; |
continue ; |
break ; |
? CODESELECTOR ; |
insert INSERT |
delete DELETE |
append APPEND |
shift SHIFT |
require REQUIRE |
after AFTER |
import IMPORT |
LVALUE STATEMENT'' ; |
local LOCALS ; |
auto LOCALS ; |
wait EXPRESSION ; |
epsilon
STATEMENT' -> LVALUE STATEMENT''
STATEMENT'' ->
is EXPRESSION |
in RANGE |
= EXPRESSION |
+= EXPRESSION |
-= EXPRESSION |
/= EXPRESSION |
*= EXPRESSION |
~> [ OLIST ] |
++ |
-- |
( ELIST )
NAMEDSCRIPT -> observable \{ SCRIPT \}
SCRIPT -> STATEMENT SCRIPT | epsilon