! Copyright (C) 2010 John Benediktsson ! See http://factorcode.org/license.txt for BSD license USING: fry kernel lexer macros math math.parser peg.ebnf random sequences strings ; IN: dice EBNF: parse-roll number = ([0-9])+ => [[ >string string>number ]] dice = "d" number => [[ second '[ _ random ] ]] roll = number dice => [[ first2 '[ 0 _ [ @ + 1 + ] times ] ]] added = "+" number => [[ second '[ _ + ] ]] total = roll added? => [[ first2 [ append ] when* ]] error = .* => [[ "unknown dice" throw ]] rolls = total | error ;EBNF MACRO: roll ( string -- ) parse-roll ; SYNTAX: ROLL: scan-token parse-roll append ;