def scan_hook
c = @ch
if c == ?/
c = getch()
if c == ?/
scan_line()
getch()
return scan()
elsif c == ?*
start_linenum = @linenum
while true
c = getch() while c != ?*
break if c == nil
c = getch()
break if c == ?/
end
if c == nil
@error = :comment_unclosed
@value = start_linenum
return @token == :error
end
getch()
return scan()
else
@value = '/'
return @token = ?/
end
end
if @mode == :selector
if c == ?# || c == ?.
start_char = c
name = ''
while is_identchar(c = getch()) || c == ?-
name << c
end
if name.empty?
@error = :invalid_char
@value = start_char.chr
return @token = :error
end
@value = start_char.chr + name
return @token = :selector
end
if is_identchar(c) || c == ?-
name = c.chr
while is_identchar(c = getch()) || c == ?- || c == ?:
name << c
end
@value = name
return @token = :selector
end
if c == ?@
name = ''
while is_identchar(c = getch())
name << c
end
if name.empty?
@error = :invalid_char
@value = '@'
return @token = :error
end
@value = '@' + name
return @token = :command
end
end
return false
end