blob: e5ce6671d90749d200fe27163d900563844dc4e6 (
plain) (
blame)
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
|
WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
number = @{ "-"? ~ ("0" | ('1'..'9' ~ ('0'..'9')*)) }
comment = { "#" ~ (!"\n" ~ ANY)* }
dice_expr = { dice_term ~ (op ~ dice_term)* ~ comment? }
dice_term = {
dice_roll
| paren_expr
| number
}
paren_expr = { "(" ~ dice_expr ~ ")" }
dice_roll = {
number ~ "d" ~ dice_sides ~ modifiers?
}
dice_sides = @{ number }
modifiers = { modifier+ }
modifier = {
explode
| explode_alias
| explode_keep_high
| reroll
| reroll_once
| reroll_until
| reroll_add
| keep_alias
| keep_high
| keep_low
| drop_high
| drop_low
| unique
| sort
| count
}
explode = { "!" }
explode_alias = { "e" }
explode_keep_high = { "K" ~ number }
reroll = { "r" ~ number }
reroll_once = { "ro" ~ number }
reroll_until = { "R" ~ number }
reroll_add = { "a" ~ number }
keep_alias = { "k" ~ number }
keep_high = { "kh" ~ number }
keep_low = { "kl" ~ number }
drop_high = { "dh" ~ number }
drop_low = { "dl" ~ number }
unique = { "u" }
sort = { "s" }
count = { "c" ~ number }
op = { "+" | "-" | "*" | "/" | "^" }
main = { SOI ~ dice_expr ~ EOI }
|