aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/oneroll/grammar.pest
diff options
context:
space:
mode:
author简律纯 <i@jyunko.cn>2025-09-12 04:02:02 +0800
committer简律纯 <i@jyunko.cn>2025-09-12 04:02:02 +0800
commit0288d0956330d5ac8db48b752240f723e8703929 (patch)
tree0297dee9f8166af0a856dd3a1057ad5f25f14c6a /src/oneroll/grammar.pest
parent5135876b5e2a6c40232414ea0b7eb875fa225cf0 (diff)
downloadOneRoll-0288d0956330d5ac8db48b752240f723e8703929.tar.gz
OneRoll-0288d0956330d5ac8db48b752240f723e8703929.zip
feat: initial basic roll features
Diffstat (limited to 'src/oneroll/grammar.pest')
-rw-r--r--src/oneroll/grammar.pest43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/oneroll/grammar.pest b/src/oneroll/grammar.pest
new file mode 100644
index 0000000..01b97e9
--- /dev/null
+++ b/src/oneroll/grammar.pest
@@ -0,0 +1,43 @@
+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
+ | reroll
+ | reroll_once
+ | keep_high
+ | keep_low
+ | drop_high
+ | drop_low
+}
+
+explode = { "!" }
+reroll = { "r" ~ number }
+reroll_once = { "ro" ~ number }
+keep_high = { "kh" ~ number }
+keep_low = { "kl" ~ number }
+drop_high = { "dh" ~ number }
+drop_low = { "dl" ~ number }
+
+op = { "+" | "-" | "*" | "/" | "^" }
+
+main = { SOI ~ dice_expr ~ EOI } \ No newline at end of file