-
Notifications
You must be signed in to change notification settings - Fork 0
/
GRAMMAR
102 lines (77 loc) · 3.1 KB
/
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<program> ::= <statement>*
<statement> ::= <statement-let>
| <statement-if-elif-else>
| <statement-for>
| <statement-while>
| <statement-break>
| <statement-continue>
| <statement-try>
| <statement-error>
| <statement-return>
| <statement-assign>
| <expression>
<statement-let> ::= "let" <identifier> "=" <expression> ";"
<statement-if-elif-else> ::= "if" <expression> <block> ("elif" <expression> <block>)* ("else" <block>)?
<statement-for> ::= "for" <identifier> ".&"? ("," <identifier> ".&"?)? "in" <expression> <block>
<statement-while> ::= "while" <expression> <block>
<statement-break> ::= "break" ";"
<statement-continue> ::= "continue" ";"
<statement-try> ::= "try" <block> "else" <identifier>? <block>
<statement-error> ::= "error" <expression> ";"
<statement-return> ::= "return" <expression>? ";"
<statement-assign> ::= <expression> "=" <expression> ";"
<block> ::= "{" <statement>* "}"
<expression> ::= <null>
| <boolean>
| <number>
| <string>
| <vector>
| <map>
| <set>
| <function>
| <identifier>
| "(" <expression> ")"
| "+" <expression>
| "-" <expression>
| "not" <expression>
| <expression> "and" <expression>
| <expression> "or" <expression>
| <expression> "==" <expression>
| <expression> "!=" <expression>
| <expression> "<=" <expression>
| <expression> ">=" <expression>
| <expression> "<" <expression>
| <expression> ">" <expression>
| <expression> "+" <expression>
| <expression> "-" <expression>
| <expression> "*" <expression>
| <expression> "/" <expression>
| <expression> "%" <expression>
| <expression> "(" (<expression> ("," <expression>)+ ","?) ")"
| <expression> "[" <expression> "]"
| <expression> "." <identifier>
| <expression> "::" <identifier>
| <expression> ".&"
| <expression> ".*"
<identifier> ::= /[a-zA-Z_]\w*/
<function> ::= "function" "(" (<identifier> ("," <identifier>)+ ",")? ")" <block>
<set> ::= "{" <expression> ("," <expression>)+ ","? "}"
| "set" "{" "}"
<map> ::= "{" <expression> ":" <expression> ("," <expression> ":" <expression>)+ ","? "}"
| "map" "{" "}"
<vector> ::= "[" (<expression> ("," <expression>)+ ","?)* "]"
<string> ::= '"' <character>* '"'
| "`" <printable>* "`"
| "```" <line-feed> <printable> "```"
<character> ::= "\t"
| "\n"
| '\"'
| "\\"
| (<printable> - ('"' | "\"))
<printable> ::= ? printable Unicode character ?
<line-feed> ::= ? Unicode character U+000A ?
<number> ::= /0x[0-9a-fA-F]+/
| /\d+(\.\d+)?/
<boolean> ::= "true"
| "false"
<null> ::= "null"