-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGrammer.ebnf
More file actions
41 lines (36 loc) · 1.65 KB
/
Grammer.ebnf
File metadata and controls
41 lines (36 loc) · 1.65 KB
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
letter ::= upper_case | lower_case
lower_case ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" |
"k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" |
"u" | "v" | "w" | "x" | "y" | "z"
upper_case ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" |
"K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" |
"U" | "V" | "W" | "X" | "Y" | "Z"
digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
identifier ::= ( letter | "_" ) { letter | digit | "_" }
number ::= digit { digit } ['.' { digit }]
none ::= "NONE"
exprs ::= expr { "," expr }
expr ::= logical_or
logical_or ::= logical_and { "||" logical_and }
logical_and ::= equality { "&&" equality }
equality ::= comparison { ( "==" | "!=" ) comparison }
comparison ::= term { ( "<" | "<=" | ">" | ">=" ) term }
term ::= factor { ( "+" | "-" ) factor }
factor ::= unary { ( "*" | "/" ) unary }
unary ::= ( "-" | "!" ) unary | primary
grouping ::= "(" expr ")"
primary ::= number
| identifier
| call
| grouping
| block
| function
| none
call ::= identifier "(" [ exprs ] ")"
return ::= "return" [ exprs ]
variable ::= "@" identifier [ "=" ( exprs | block ) ]
function ::= "$" "(" [identifier [{',' identifier}]] ")" block
if ::= "if" grouping block { "else" "if" grouping block } [ "else" block ]
while ::= "while" grouping block
statement ::= ( expr | return | variable | if ) ";"
block ::= "{" { statement } "}"