-
Notifications
You must be signed in to change notification settings - Fork 0
/
Speka.spk
59 lines (32 loc) · 1.42 KB
/
Speka.spk
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
//syntax of Speka
/*
Speka is a minimal OO language
*/
// full syntax, some of which are only sugar and maynot be implemented
identifier = (letter | '_') { letter | digit}
program ::=
class_def ::= "class" identifier ["=" identifier ]"{" class_block "}"
class_block ::= {method_def}
method_def ::= "def" identifier "(" arg_list ")" "{" block "}"
block ::= "{" {stmt} "}" | stmt
stmt ::= cond_stmt | while_stmt | for_stmt | ret_stmt | expr
cond_stmt ::= "if" or_expr block ["else" block]
while_stmt ::= "while" or_expr block
for_stmt ::= "for" identifier "in" or_expr block
ret_stmt ::= "return" or_expr "\n"
expr ::= postfix { assign_op or_expr } "\n"
op ::= "=" | "+=" | "-=" | "*=" | "/=" | "%=" | :=
or_expr ::= logic_term { "|"logic_term } | cond_expr
logic_term ::= and_term { "&" and_term }
and_term ::= add_expr { ">" | "<" | "<=" | ">=" | "==" | "!=" add_expr } //| "(" or_expr ")"
add_expr ::= [ "+"|"-"] term { ("+"|"-") term}.
term ::= factor {("*"|"/") factor}.
factor ::= "(" or_expr ")" | number | post_fix | "!" prim_expr
prim_expr ::= identifier | literal | "(" or_expr ")"
post_fix ::= prim_expr { idx_expr | call_expr }
idx_expr ::= "[" or_expr "]" | "." identifier
call_expr ::= "(" { call_arg } ")"
call_arg ::= or_expr {"," or_expr }
/*
the execution starts from the 'main' method of a class which has the same name of the file
*/