summaryrefslogtreecommitdiff
path: root/grammar.bnf
diff options
context:
space:
mode:
Diffstat (limited to 'grammar.bnf')
-rw-r--r--grammar.bnf29
1 files changed, 29 insertions, 0 deletions
diff --git a/grammar.bnf b/grammar.bnf
new file mode 100644
index 0000000..256e58a
--- /dev/null
+++ b/grammar.bnf
@@ -0,0 +1,29 @@
1program ::= (statement ';'?)*;
2statement ::= definition | expression;
3definition ::= 'def' def-spec '=' expression;
4def-spec ::= IDENTIFIER arg-spec*;
5arg-spec ::= IDENTIFIER;
6expression ::= binary-expression | unary-expression;
7unary-expression ::= unop+ simple-expression;
8binary-expression ::= call-expression (binop call-expression)*;
9call-expression ::= simple-expression+;
10binop ::= '*' | '/' | '+' | '-' | '?=' | '/=' | '>' | '>=' | '<' | '<=';
11unop ::= '+' | '-' | '!';
12simple-expression ::= '(' expression ')'
13 | 'true' | 'false'
14 | INTEGER
15 | IDENTIFIER
16 | STRING
17 | array
18 | if-else-expression
19 | let-in-expression
20 | fn-expression
21 | do-expression;
22
23array ::= '(' ')' | '[' ']' | '[' expression (',' expression)* ','? ']';
24
25if-else-expression ::= 'if' expression 'then' expression 'else' expression;
26let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expression)* 'in' expression;
27fn-expression ::= 'fn' arg-spec+ '->' expression
28 | 'fn' arg-spec+ do-expression;
29do-expression ::= 'do' expression (';' expression)* 'end';