aboutsummaryrefslogtreecommitdiff
path: root/docs/grammar.md
blob: d172254dcd429ab206616b3af11b767f8fb787e2 (plain)
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
33
34
35
36
37
38
39
Formal grammar definition for Sloth.

```
program             → statement* ;
block               → "{" statement* "}"

statement           → exprStmt
                    | valStmt
                    | varStmt
                    | returnStmt
                    | printStmt
                    | functionStmt
                    | ifStmt
                    | forStmt ;

exprStmt            → expression ";" ;
valStmt             → "val" IDENTIFIER "=" expression ";" ;
varStmt             → "var" IDENTIFIER "=" expression ";" ;
returnStmt          → "return" expression ";" ;
printStmt           → "print" expression ";" ;

functionStmt        → "fn" IDENTIFIER "(" (IDENTIFIER ":" IDENTIFIER)* ")" block ;
ifStmt              → "if" expression block ;
forStmt             → "for" IDENTIFIER "in" expression ".." expression block ;

expression          → logical_or ;

logical_or          → logical_and ( "||" logical_and )* ;
logical_and         → equality ( "&&" equality )* ;
equality            → comparison ( ( "!=" | "==" ) comparison )* ;
comparison          → bitwise_shift ( ( "<" | ">" | "<=" | ">=" ) bitwise_shift )* ;
bitwise_shifting    → additive ( ( "<<" | ">>" ) additive )* ;
additive            → multiplicative ( ( "+" | "-" ) multiplicative )* ;
multiplicative      → unary ( ( "*" | "/" | "%" ) unary )* ;
unary               → ( "!" | "+" | "-" ) unary | call ;

call                → primary ( "(" arguments? ")" )* ;
primary             → "true" | "false" | NUMBER | STRING | IDENTIFIER | "(" expression ")" ;
```