Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'parslet'
- require 'ap'
- module Dice
- class Bag < Parslet::Parser
- rule(:count) { match('[0-9]').repeat(1).as(:count) }
- rule(:sides) { str('d') >> match('[0-9]').repeat(1).as(:sides) }
- rule(:explode) { str('e') >> match('[0-9]').repeat(1).as(:explode) }
- rule(:reroll) { str('r') >> match('[0-9]').repeat(1).as(:reroll) }
- rule(:modifier_operator) { match('[+|-]').as(:modifier_operator) }
- rule(:modifier) { modifier_operator >> match('[0-9]').repeat(1).as(:modifier) }
- rule(:die) { (count >> sides >> ( reroll | explode ).maybe >> ( reroll | explode ).maybe >> modifier.maybe).as(:die) }
- root(:die)
- end
- end
- class Trans < Parslet::Transform
- rule(:count => simple(:c)) { Integer(c) }
- end
- parser = Dice::Bag.new.parse('1d20')
- ap parser
- # {
- # :die => {
- # :count => "1",
- # :sides => "20"
- # }
- # }
- ap Trans.new.apply(parser)
- #{
- # :die => {
- # :count => "1",
- # :sides => "20"
- # }
- #}
Add Comment
Please, Sign In to add comment