def scan
c = @ch
while is_whitespace(c)
c = getch()
end
if c == nil
@value = nil
return @token = nil
end
ret = scan_hook()
return ret if ret != false
if is_identchar(c)
scan_ident()
@token = keywords(@value) || PLOGIC_KEYWORDS[@value] || :ident
return @token
end
if c == ?"
return scan_string_dquoted()
end
if c == ?'
return scan_string_quoted()
end
if c == ?{
@value = "{"
getch()
return @token = '{''{'
end
if c == ?}
@value = "}"
getch()
return @token = '}''}'
end
if c == ?,
@value = ","
getch()
return @token = ','','
end
@value = c.chr
@error = :invalid_char
return @token = :error
end