mirror of
https://github.com/danbulant/rush
synced 2026-05-19 04:18:35 +00:00
41 lines
No EOL
1.2 KiB
Text
41 lines
No EOL
1.2 KiB
Text
|
|
# 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? |