From 97b4f889cd2c3a692da98e681016414587ebf204 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 25 Aug 2024 17:56:34 +0800 Subject: Added maps --- grammar.bnf | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'grammar.bnf') diff --git a/grammar.bnf b/grammar.bnf index 3dcb1c6..d798f9d 100644 --- a/grammar.bnf +++ b/grammar.bnf @@ -3,10 +3,13 @@ program ::= (statement ';'?)*; statement ::= definition; definition ::= 'def' def-spec '=' expression - | 'def' '_' '=' expression; + | 'def' '_' '=' expression + ; + def-spec ::= IDENTIFIER arg-spec*; arg-spec ::= '(' arg-spec ')' | IDENTIFIER | arg-spec-tuple | '_'; arg-spec-tuple ::= '(' ')' | '(' arg-spec ',' arg-spec (',' arg-spec)* ','? ')'; + expression ::= binary-expression | unary-expression; unary-expression ::= unop+ simple-expression; binary-expression ::= call-expression (binop call-expression)*; @@ -21,23 +24,27 @@ simple-expression ::= '(' expression ')' | IDENTIFIER | STRING | array + | map | tuple + | do-expression + | fn-expression | if-else-expression | let-in-expression - | fn-expression - | do-expression; + ; array ::= '[' ']' | '[' expression (',' expression)* ','? ']'; +map ::= '{' '}' | '{' expression '->' expression (',' expression '->' expression) ','? '}'; // Note that tuples always have either zero or at least two elements // A tuple with only one element is just '(' expression ')' -- a parenthese-wrapped expression // Also '(' expression ',' ')' is illegal tuple ::= '(' ')' | '(' expression ',' expression (',' expression)* ','? ')'; +do-expression ::= 'do' expression (';' expression)* 'end'; +fn-expression ::= 'fn' arg-spec+ '->' expression + | 'fn' arg-spec+ do-expression + ; if-else-expression ::= 'if' expression 'then' expression 'else' expression; let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expression)* 'in' expression; -fn-expression ::= 'fn' arg-spec+ '->' expression - | 'fn' arg-spec+ do-expression; -do-expression ::= 'do' expression (';' expression)* 'end'; repl-program ::= (repl-statement ';'?)* '\n'; // currently, hard-limited by the newline :sweat_smile: repl-statement ::= statement | expression; -- cgit v1.2.3