Documentation
# Grammar

1. _expression__simple_expression_ | **fcount** **(** **die** **,** _condition_list_ **)**
2. _simple_expression__term_ _simple_expression'_
3. _simple_expression'_**addop** _term_ _simple_expression'_ | ε
4. _term__factor_ _term'_
5. _term'_**mulop** _factor_ _term'_ | ε
6. _factor_**num** _factor'_ | **[** **num** **d** **num** **addop** **extrema** **]** |**(** _simple_expression_ **)** | _min_ | _max_
7. _factor'_**d** **num** | ε
8. _min_**fmin** **(** _simple_expression_ **,** _simple_expression_ **)**
9. _max_**fmax** **(** _simple_expression_ **,** _simple_expression_ **)**
10. _condition_list__condition_ _condition_list'_
11. _condition_list'_**,** _condition_ _condition_list'_ | ε
12. _condition_**relop** **num**
---

### tokens
1. **num**\[1-9\]\[0-9\]*
2. **d** → d|D
3. **addop** → + | -
4. **mulop** → * | /
5. **relop** → > | < | >= | <= | =
6. **extrema** → MIN | MAX
7. **min** → min
8. **max** → max
9. **count** → count
---

### machines
1. whitespace
2. num
3. d
4. relop
5. extrema
6. min
7. max
8. count
9. catchall
---
### example valid strings

```
1d20 + 4 + min([2d4-MAX], 3)

max(10, 1d20 + 4) # evaluate 2 simple_expressions, return max value
min(2d20, 15)

max(10, max(1d10, 1d20))

[4d6 - MIN] # roll 4 six-sided dice, subtract the lowest value
[4d6 - MAX] # roll 4 six-sided dice, subtract the highest value

count(4d6, >4)
count(10d6, >=5, =1, =6, <=4)
```