rush/syntax.deg
2025-04-03 14:16:50 +02:00

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?