# also includes quotes and format strings STRING = !SPECIALS NUMBER = 1-9 ALFA = a-zA-Z EOL = \n IDENT = ALFA (ALFA | NUMBER)* VARIABLE = $IDENT INDEX = VALUE ( "[" VALUE "]" ) + PRIMITIVE_VALUES = NUMBER | STRING | VARIABLE | INDEX # group and object destructors/bindings will be here BINDABLE = PRIMITIVE_VALUES VALUE = PRIMITIVE_VALUES | GROUP # statements are expressions, so it is possible to write `echo (if true { echo true } else { echo false })` GROUP = "(" STATEMENT ")" # no padding can be here, must be TEXT=VALUE ENV_VAR_SPECIFICATION = STRING = VALUE COMMAND = ( ENV_VAR_SPECIFICATION WHITESPACE ) * ( VALUE WHITESPACE ) + # in the future this could also support other ops like add+set SET = set BINDABLE = VALUE FUNCTION = fn STRING "(" ( BINDABLE , )* BINDABLE ")" { STATEMENTS } FOR = for BINDABLE in VALUE { STATEMENTS } ( else { STATEMENTS } )? IF = if VALUE { STATEMENTS } ( else if VALUE { STATEMENTS } ) * ( else { STATEMENTS } )? WHILE = while VALUE { STATEMENTS } ( else { STATEMENTS } )? LOOP = loop { STATEMENTS } BREAK = break STATEMENT = COMMAND | SET | FOR | IF | WHILE | LOOP | FUNCTION | BREAK STATEMENTS = ( STATEMENT (; | EOL) )* STATEMENT?