-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplanout.pest
99 lines (68 loc) · 2.02 KB
/
planout.pest
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
program = _{ SOI ~ stmt* ~ EOI }
stmt = _{ ret | expr }
expr = {
assignment | conditional | monadic_expr | dyadic_expr | terms
}
assignment = { ident ~ op_assign ~ expr ~ semi}
op_assign = { "=" }
terms = { term+ }
term = _{ string | boolean | ident | number | array | "(" ~ expr ~ ")" }
array_start = { "[" }
array_end = { "]" }
array = { array_start ~ (array_end | (expr ~ array_end) | ((expr ~ ",")* ~ expr ~ array_end)) }
op_bool_or = { "||" }
op_bool_and = { "&&" }
op_eq = { "==" }
op_ne = { "!=" }
op_ge = { ">=" }
op_le = { "<=" }
op_gt = { ">" }
op_lt = { "<" }
bool_not = _{ op_bool_not ~ expr }
op_bool_not = { "!" }
ret = { "return" ~ terms ~ semi }
product = { expr ~ "*" ~ expr }
addition = { expr ~ "+" ~ expr }
subtraction = { expr ~ "-" ~ expr }
sum = { addition | subtraction }
monadic_expr = { verb ~ expr }
dyadic_expr = { (monadic_expr | terms) ~ verb ~ expr }
verb = {
"+" | "*"
// ">" | "*:" | "-" | "%" | "#" | ">."
// | "+" | "*" | "<" | "=" | "^" | "|"
// | ">" | "$"
}
conditional = {
op_if ~ "(" ~ terms ~ ")" ~ block ~
(op_else_if ~ "(" ~ terms ~ ")" ~ block)*
~ (op_else ~ block)?
}
op_if = { "if" }
op_else_if = { "else if" }
op_else = { "else" }
block = _{ block_start ~ expr* ~ block_end }
block_start = { "{" }
block_end = { "}" }
field_access = { ident ~ op_access ~ ident }
op_access = { "." }
boolean = @{ "true" | "false" }
ident = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }
number = { decimal | integer }
decimal = @{ "_"? ~ ASCII_DIGIT+ ~ "." ~ ASCII_DIGIT* }
integer = @{ "0" | (nonzero ~ digit*) }
// Allow "_" in numbers for grouping: 1_000_000 == 1000000
digit = _{ "0" | nonzero | "_" }
nonzero = _{ '1'..'9' }
string = ${ "\"" ~ string_inner ~ "\"" }
string_inner = @{ char* }
char = {
!("\"" | "\\") ~ ANY
| "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
keyword = @{
"else" | "false" | "if" | "return" | "switch" | "return"
}
semi = { ";" }
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }