blob: 9ddaffcd61a2f7ab3a40cedaaf2b18561bf615a1 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
// Comments are introduced by # and terminated by newline
program ::= (statement ';'?)*;
statement ::= definition | expression;
definition ::= 'def' def-spec '=' expression;
def-spec ::= IDENTIFIER arg-spec*;
arg-spec ::= IDENTIFIER | '(' ')';
expression ::= binary-expression | unary-expression;
unary-expression ::= unop+ simple-expression;
binary-expression ::= call-expression (binop call-expression)*;
call-expression ::= simple-expression+;
binop ::= '*' | '/' | '+' | '-' | '?=' | '/=' | '>' | '>=' | '<' | '<=';
unop ::= '+' | '-' | '!';
simple-expression ::= '(' expression ')'
| 'true' | 'false'
| '(' ')'
| INTEGER
| IDENTIFIER
| STRING
| array
| if-else-expression
| let-in-expression
| fn-expression
| do-expression;
array ::= '[' ']' | '[' expression (',' 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';
|