def self.parse(source)
case
when source =~ /^(.*)(\*|\*\?|\+|\+\?|\?)$/ && balanced?($1, $2)
parse_quantified($1, $2.to_sym)
when source =~ /^(.*)\{(\d+)\,(\d+)\}$/ && balanced?($1, $2)
parse_quantified($1, ($2.to_i)..($3.to_i))
when source =~ /^(.*)\{(\d+)\}$/ && balanced?($1, $2)
parse_quantified($1, $2.to_i)
when source =~ /^\((.*)\)\((.*)\)$/ && balanced?($1, $2)
union(parse($1), parse($2))
when source =~ /^(\(.*\))\|(\(.*\))$/ && balanced?($1, $2)
intersection(parse($1), parse($2))
when source =~ /^(.*)\|(.*)$/ && balanced?($1, $2)
intersection(parse($1), parse($2))
when source =~ /^(.*)\|\((\(.*\))\)$/ && balanced?($1, $2)
intersection(parse($1), parse($2))
when source =~ /^(.+)(\(.*\))$/ && balanced?($1, $2)
union(parse($1), parse($2))
when source =~ /^\((.*)\)$/ && balanced?($1)
union(parse($1))
when source =~ /^([^()]*)(\(.*\))$/ && balanced?($1, $2)
union(parse($1), parse($2))
when source =~ /^(.*)\[\:(.*)\:\]$/
union(parse($1), random($2))
when source =~ /^(.*)\\([wsdc])$/
union(parse($1), random($2))
when source =~ /^(.*)\\(.)$/ || source =~ /(.*)(.|\s)$/
union(parse($1), literal($2))
else
nil
end
end