summaryrefslogtreecommitdiff
path: root/grammar.bnf
diff options
context:
space:
mode:
Diffstat (limited to 'grammar.bnf')
-rw-r--r--grammar.bnf19
1 files changed, 13 insertions, 6 deletions
diff --git a/grammar.bnf b/grammar.bnf
index 3dcb1c6..d798f9d 100644
--- a/grammar.bnf
+++ b/grammar.bnf
@@ -3,10 +3,13 @@
3program ::= (statement ';'?)*; 3program ::= (statement ';'?)*;
4statement ::= definition; 4statement ::= definition;
5definition ::= 'def' def-spec '=' expression 5definition ::= 'def' def-spec '=' expression
6 | 'def' '_' '=' expression; 6 | 'def' '_' '=' expression
7 ;
8
7def-spec ::= IDENTIFIER arg-spec*; 9def-spec ::= IDENTIFIER arg-spec*;
8arg-spec ::= '(' arg-spec ')' | IDENTIFIER | arg-spec-tuple | '_'; 10arg-spec ::= '(' arg-spec ')' | IDENTIFIER | arg-spec-tuple | '_';
9arg-spec-tuple ::= '(' ')' | '(' arg-spec ',' arg-spec (',' arg-spec)* ','? ')'; 11arg-spec-tuple ::= '(' ')' | '(' arg-spec ',' arg-spec (',' arg-spec)* ','? ')';
12
10expression ::= binary-expression | unary-expression; 13expression ::= binary-expression | unary-expression;
11unary-expression ::= unop+ simple-expression; 14unary-expression ::= unop+ simple-expression;
12binary-expression ::= call-expression (binop call-expression)*; 15binary-expression ::= call-expression (binop call-expression)*;
@@ -21,23 +24,27 @@ simple-expression ::= '(' expression ')'
21 | IDENTIFIER 24 | IDENTIFIER
22 | STRING 25 | STRING
23 | array 26 | array
27 | map
24 | tuple 28 | tuple
29 | do-expression
30 | fn-expression
25 | if-else-expression 31 | if-else-expression
26 | let-in-expression 32 | let-in-expression
27 | fn-expression 33 ;
28 | do-expression;
29 34
30array ::= '[' ']' | '[' expression (',' expression)* ','? ']'; 35array ::= '[' ']' | '[' expression (',' expression)* ','? ']';
36map ::= '{' '}' | '{' expression '->' expression (',' expression '->' expression) ','? '}';
31// Note that tuples always have either zero or at least two elements 37// Note that tuples always have either zero or at least two elements
32// A tuple with only one element is just '(' expression ')' -- a parenthese-wrapped expression 38// A tuple with only one element is just '(' expression ')' -- a parenthese-wrapped expression
33// Also '(' expression ',' ')' is illegal 39// Also '(' expression ',' ')' is illegal
34tuple ::= '(' ')' | '(' expression ',' expression (',' expression)* ','? ')'; 40tuple ::= '(' ')' | '(' expression ',' expression (',' expression)* ','? ')';
35 41
42do-expression ::= 'do' expression (';' expression)* 'end';
43fn-expression ::= 'fn' arg-spec+ '->' expression
44 | 'fn' arg-spec+ do-expression
45 ;
36if-else-expression ::= 'if' expression 'then' expression 'else' expression; 46if-else-expression ::= 'if' expression 'then' expression 'else' expression;
37let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expression)* 'in' expression; 47let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expression)* 'in' expression;
38fn-expression ::= 'fn' arg-spec+ '->' expression
39 | 'fn' arg-spec+ do-expression;
40do-expression ::= 'do' expression (';' expression)* 'end';
41 48
42repl-program ::= (repl-statement ';'?)* '\n'; // currently, hard-limited by the newline :sweat_smile: 49repl-program ::= (repl-statement ';'?)* '\n'; // currently, hard-limited by the newline :sweat_smile:
43repl-statement ::= statement | expression; 50repl-statement ::= statement | expression;