-
Notifications
You must be signed in to change notification settings - Fork 0
/
grammar.bnf
90 lines (70 loc) · 3.08 KB
/
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
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
program -> declaration* EOF ;
# Declarations ===============================================================
declaration -> varDecl
| constDecl
| function
| enumDecl
| statement ;
varDecl -> "let" IDENTIFIER ( "," IDENTIFIER )* ( "=" expression )? ";" ;
constDecl -> "const" IDENTIFIER ( "," IDENTIFIER )* "=" expression ";" ;
enumDecl -> "enum" IDENTIFIER "{" ( IDENTIFIER ("," IDENTIFIER)* )? "}" ;
function -> "func" IDENTIFIER "(" parameters? ")" block ;
parameters -> param ( "," param )* ;
param -> IDENTIFIER ( "?" | "=" expression )?
# Statements ================================================================
statement -> exprStmt
| ifStmt
| whileStmt
| forStmt
| breakStmt
| continueStmt
| returnStmt
| importStmt
| block ;
whileStmt -> "while" "(" expression ")" statement ;
forStmt -> "for" "(" ( varDecl | exprStmt | ";" ) expression? ";" expression? ")" statement ;
ifStmt -> "if" "(" expression ")" statement ( "else" statement )? ;
breakStmt -> "break" ";"? ;
continueStmt -> "continue" ";"? ;
returnStmt -> "return" expression? ";"? ;
block -> "{" declaration* "}" ;
importStmt -> "import" STRING ";"? ;
exprStmt -> expression ";"? ;
# Expressions ================================================================
expression -> assignment ;
assignment -> ( (call | indexing | memberAccess) "." )? IDENTIFIER "=" assignment
| logic_or ;
logic_or -> logic_and (("||" | "or") logic_and)* ;
logic_and -> equality (("&&" | "and") equality)* ;
equality -> comparison ( ( "!=" | "==" ) comparison )* ;
comparison -> range ( ( ">" | ">=" | "<" | "<=" ) range )* ;
range -> term ( ".." term )?
term -> factor ( ( "-" | "+" ) factor )* ;
factor -> expo ( ( "/" | "*" | "%" ) expo )* ;
expo -> unary ("**" unary)* ;
unary -> ( "!" | "-" ) unary
| deIn_crement
| indexing
| lambda
| memberAccess
| call ;
primary -> INTEGER | REAL | STRING
| "true" | "false" | "null"
| "(" expression ")"
| array
| dictionary
| IDENTIFIER ;
# Other Unary Expressions
deIn_crement -> ("++" | "--") unary | unary ("++" | "--") ;
indexing -> primary ( "[" expression "]" )* ;
lambda -> "fn" "(" parameters? ")" "->" block ;
memberAccess -> primary ("." IDENTIFIER)* ;
call -> primary ( "(" arguments? ")" )* ;
# Call Arguments
arguments -> arg ( "," arg )* ;
arg -> expression ("=" expression)? ;
# Array Expressions
array -> "[" (expression ("," expression)*)? "]" ;
# Dictionary Expressions
dictionary -> "{" ( keyValPair ("," keyValPair)* )? "}" ;
keyValPair -> IDENTIFIER ":" expression ;