grammar Sentence rule phrase token* { def to_s(env = {}) elements.collect { |x| x.to_s(env) }.join end } end rule token literal / variable end rule literal space / word / punctuation end rule variable "(" word ")" { def to_s(env = {}) arr = env[word.text_value] arr[rand(arr.length)] end } end rule space ' '+ { def to_s(env = {}) text_value end } end rule word [a-zA-Z0-9]+ { def to_s(env = {}) text_value end } end rule punctuation [,.!?] { def to_s(env = {}) text_value end } end end