module Temple::Mixins::GrammarDSL

def Rule(rule)

def Rule(rule)
  case rule
  when Rule
    rule
  when Symbol, Class, true, false, nil
    Value(rule)
  when Array
    start = Or.new(self)
    curr = [start]
    rule.each do |elem|
      if elem =~ /^(.*)(\*|\?|\+)$/
        elem = Element.new(self, const_get($1))
        curr.each {|c| c << elem }
        elem << elem if $2 != '?'
        curr = $2 == '+' ? [elem] : (curr << elem)
      else
        elem = Element.new(self, elem)
        curr.each {|c| c << elem }
        curr = [elem]
      end
    end
    elem = Value([])
    curr.each {|c| c << elem }
    start
  else
    raise ArgumentError, "Invalid grammar rule '#{rule.inspect}'"
  end
end