Guest User

Untitled

a guest
Jul 22nd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.01 KB | None | 0 0
  1. require 'parslet'
  2. require 'ap'
  3.  
  4. module Dice
  5. class Bag < Parslet::Parser
  6. rule(:count) { match('[0-9]').repeat(1).as(:count) }
  7. rule(:sides) { str('d') >> match('[0-9]').repeat(1).as(:sides) }
  8. rule(:explode) { str('e') >> match('[0-9]').repeat(1).as(:explode) }
  9. rule(:reroll) { str('r') >> match('[0-9]').repeat(1).as(:reroll) }
  10. rule(:modifier_operator) { match('[+|-]').as(:modifier_operator) }
  11. rule(:modifier) { modifier_operator >> match('[0-9]').repeat(1).as(:modifier) }
  12. rule(:die) { (count >> sides >> ( reroll | explode ).maybe >> ( reroll | explode ).maybe >> modifier.maybe).as(:die) }
  13. root(:die)
  14. end
  15. end
  16.  
  17. class Trans < Parslet::Transform
  18. rule(:count => simple(:c)) { Integer(c) }
  19. end
  20.  
  21. parser = Dice::Bag.new.parse('1d20')
  22. ap parser
  23. # {
  24. # :die => {
  25. # :count => "1",
  26. # :sides => "20"
  27. # }
  28. # }
  29.  
  30. ap Trans.new.apply(parser)
  31. #{
  32. # :die => {
  33. # :count => "1",
  34. # :sides => "20"
  35. # }
  36. #}
Add Comment
Please, Sign In to add comment