def new_regexp val
node = val[1] || s(:str, '')
options = val[2]
o, k = 0, nil
options.split(//).uniq.each do |c|
v = {
'x' => Regexp::EXTENDED,
'i' => Regexp::IGNORECASE,
'm' => Regexp::MULTILINE,
'o' => Regexp::ONCE,
'n' => Regexp::ENC_NONE,
'e' => Regexp::ENC_EUC,
's' => Regexp::ENC_SJIS,
'u' => Regexp::ENC_UTF8,
}[c]
raise "unknown regexp option: #{c}" unless v
o += v
k = c if c =~ /[esu]/
end
case node[0]
when :str then
node[0] = :lit
node[1] = if k then
Regexp.new(node[1], o, k)
else
begin
Regexp.new(node[1], o)
rescue RegexpError => e
warn "Ignoring: #{e.message}"
Regexp.new(node[1], Regexp::ENC_NONE)
end
end
when :dstr then
if options =~ /o/ then
node[0] = :dregx_once
else
node[0] = :dregx
end
node << o if o and o != 0
else
node = s(:dregx, '', node);
node[0] = :dregx_once if options =~ /o/
node << o if o and o != 0
end
node
end