def step
case
when scan(/\s+/)
start_group :normal, matched
when scan(/\\u[0-9a-f]{4}/i)
start_group :unicode, matched
when scan(/0[xX][0-9A-Fa-f]+/)
start_group :hex, matched
when scan(/(?:0[0-7]+)(?![89.eEfF])/)
start_group :oct, matched
when scan(/(?:\d+)(?![.eEfF])/)
start_group :integer, matched
when scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/)
start_group :float, matched
when (scan(/"(?:[^"\\]|\\.)*"/) or scan(/'(?:[^'\\]|\\.)*'/) )
start_group :string, matched
when scan(/[a-z_$][a-z_\d]*/i)
if JAVASCRIPT_KEYWORDS.include?( matched )
start_group :keyword, matched
elsif JAVASCRIPT_PREDEFINED_TYPES.include?( matched )
start_group :predefined_types, matched
else
start_group :ident, matched
end
when scan(%r! // [^\n\\]* (?: \\. [^\n\\]* )* | /\* (?: .*? \*/ | .* ) !mx)
start_group :comment, matched
else
start_group :other, scan(/./x)
end
end