Below are a series of production rules defining the formal grammar for the roll formula language. Note that there are a number of semantic issues that aren't defined in the grammar, but some of them are covered with footnotes. The grammar is also not completely unambiguous, though operator precedence resolves most of those ambiguities.
| roll | ::= | condition [(,|.) condtion] * |
| condition | ::= | assignment |
| | | if expr then expr [elif expr then expr]* else expr end | |
| | | expr | |
| assignment | ::= | @(number | ident) ← expr |
| | | parameter ← expr1 | |
| expr | ::= | expr ∧ expr |
| | | expr ∨ expr | |
| | | expr < expr | |
| | | expr ≤ expr | |
| | | expr = expr | |
| | | expr ≠ expr | |
| | | expr ≥ expr | |
| | | expr > expr | |
| | | expr in expr | |
| | | expr … expr | |
| | | expr + expr | |
| | | expr - expr | |
| | | expr × expr | |
| | | expr % expr | |
| | | expr / expr | |
| | | expr ÷ expr | |
| | | expr /+ expr | |
| | | expr [roll] | |
| | | function-call | |
| | | string | |
| | | variable | |
| | | die-spec | |
| | | (roll) | |
| function-call | ::= | function-name[number](( roll [, roll]*)) |
| variable | ::= | @(number | ident) |
| | | parameter | |
| | | special-constant | |
| parameter | ::= | #number |
| die-spec | ::= | die-count [color] (d|z) die-sides [ open ][ roll-macro ][ reducer ] |
| | | die-count [color] ttext-die-name | |
| die-count | ::= | number [½] |
| | | ½ | |
| | | parameter | |
| | | ε2 | |
| color | ::= | R|G|B|C|M|Y|K|W|A|O|N |
| die-sides | ::= | number |
| | | %|‰|‱ | |
| | | 0000|000|00|0 | |
| | | 6a|F | |
| | | custom-die-name | |
| | | parameter | |
| | | ε3 | |
| open | ::= | .±|.+|.-|±|+|-|* |
| roll-macro | ::= | macro-name [ number | parameter ] |
| reducer | ::= | vs [ number | parameter ] |
| | | (high|hi|h) [ number | parameter ] | |
| | | (low|lo|l) [ number | parameter ] | |
| | | # [ number | parameter ] | |
| | | ≥ [ number | parameter ] | |
| | | > [ number | parameter ] | |
| | | = [ number | parameter ] | |
| | | ≠ [ number | parameter ] | |
| | | ≤ [ number | parameter ] | |
| | | < [ number | parameter ] | |
| | | @ | |
Footnotes:
| Operator Precedence |
|---|
| ∧, ∨ |
| <, ≤, =, ≠, ≥, >, in |
| … |
| +, - |
| ×, %, /, ÷, /+ |
Note that die-spec binds tighter than operators such as <, so: