-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheevee-grammar.bnf
62 lines (56 loc) · 2.43 KB
/
eevee-grammar.bnf
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
expression → literal
| unary
| binary
| grouping
;
literal → NUMBER | STRING | "true" | "false" | "nil" ;
grouping → "(" expression ")" ;
unary → ( "-" | "!" ) expression ;
postfix → (expression ( "++" | "--" )) ;
conditional → expression "?" expression ":" expression ;
binary → expression operator expression ;
operator → "==" | "!=" | "<" | "<=" | ">" | ">="
| "+" | "+=" | "++" | "-" | "-=" | "--" | "*"
| "*=" | "/" | "/=" | "%" | "%=" | "?" | ":"
;
program → declaration* EOF ;
declaration → varDecl
| statement
;
statement → exprStmt
| ifStmt
| whileStmt
| forStmt
| printStmt
| varDecl
| block
;
block → "{" declaration* "}" ;
exprStmt → expression ";" ;
varDecl → "let" IDENTIFIER ( "=" expression )? ";" ;
printStmt → "print" expression ";" ;
ifStmt → "if" expression "then" statement ( "else" statement )? "end" ;
whileStmt → "while" expression statement ;
forStmt → "for" ( varDecl | exprStmt | "," )
expression? ","
expression? statement ;
expression → assignment ;
assignment → IDENTIFIER "=" assignment
| conditional ;
conditional → logic_or ( "?" expression ":" conditional)? ;
logic_or → logic_and ( "or" logic_and )* ;
logic_and → equality ( "and" equality )* ;
equality → comparison ( ( "!=" | "==" ) comparison )* ;
comparison → term ( ( ">" | ">=" | "<" | "<=" ) term )* ;
term → factor ( ( "-" | "+" ) factor )* ;
factor → unary ( ( "/" | "*" ) unary )* ;
unary → ( "!" | "-" | "--" | "++" ) unary
| postfix ;
postfix → primary ( "--" | ++" )* ;
primary → NUMBER | STRING | "true" | "false" | "nil"
| "(" expression ")"
// Error productions...
| ( "!=" | "==" ) equality
| ( ">" | ">=" | "<" | "<=" ) comparison
| ( "+" ) term
| ( "/" | "*" ) factor ;