-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlanguage.grammar
60 lines (44 loc) · 1.79 KB
/
language.grammar
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# work in progress...
# RULES:
# {<rule>}* : 0 or more of <rule>, optionally space separated
# {<rule>}+ : 1 or more of <rule>, optionally space separated
# {<rule>}? : 0 or 1 of <rule>
# any rule or string that is separated by a space means they may be
# 0 or more spaces in between them
# any rule or string that is not separated by a space means they
# must not have spaces in between them
<program> = {<procedure>}+
<procedure> = proc <space> <identifier> ( <identifier-list> ) <block>
<infix-start> = infixl | infixr
<infix-procedure> = <infix-start> <identifier> ( <identifier> , <identifier> ) [ <number> ] <block>
<statement> = <identifier> = <expression> ;
| <expression> ;
| return {<expression>}? ;
| <block>
| when <expression> then <statement>
| when <expression> then <statement> otherwise <statement>
# TODO: unless statement
| while <expression> then <loop-statement>
| <expression> `<identifier>` <expression>
<loop-statement> = <statement>
| break ;
| continue ;
| <loop-block>
<block> = { {<statement>}* }
<loop-block> = { {<loop-statement>}* }
<expression> = <prefix-op> <expression>
| <expression> <infix-op> <expression>
| ( <expression> )
| <identifier> ( <expression-list> )
| <identifier>
| <number>
| <boolean>
| <string>
<expression-list> = <expression>
| <expression-list> , <expression>
<identifier> = # string of <digit> | <alpha> | ! | ?, but not all <digit>
<number> = # string of <digit>
<boolean> = !t | !f
<string> = "{<character>}*"
<boolean> = !t | !f
<space> = # space (ascii 10), not to be confused with whitespace