aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/oneroll/grammar.pest
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 }