diff --git a/README.md b/README.md index 4740a0d..83fdf2e 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,9 @@ let literal = "$var" # or perhaps ` ? let formatted = f"$var" +# these are builtin commands rather than syntax structures (unlike let/while etc) +# they simply accept arguments and work with them as with any other +# builtin commands accept structures rather than strings test 1 = 1 # perhaps (( x )) could be used for math expressions? # basically just alias to (calc x) diff --git a/syntax.deg b/syntax.deg new file mode 100644 index 0000000..f59db2e --- /dev/null +++ b/syntax.deg @@ -0,0 +1,32 @@ + +# 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 + +GROUP = "(" COMMAND ")" + +COMMAND = ( VALUE WHITESPACE ) + + +LET = let BINDABLE = VALUE + +FOR = for BINDABLE in VALUE { STATEMENTS } +IF = if VALUE { STATEMENTS } ( else if VALUE { STATEMENTS } ) * ( else { STATEMENTS } )? +WHILE = while VALUE { STATEMENTS } ( else { STATEMENTS } )? +LOOP = loop { STATEMENTS } + +STATEMENT = COMMAND | LET | FOR | IF | WHILE | LOOP +STATEMENTS = ( STATEMENT (; | EOL) )* STATEMENT? \ No newline at end of file