# File lib/kwartz/parser.rb, line 231
    def scan
      ## skip whitespaces
      c = @ch
      while is_whitespace(c)
        c = getch()
      end

      ## return nil when EOF
      if c == nil
        @value = nil
        return @token = nil
      end

      ## scan hook
      ret = scan_hook()    # scan_hook() is overrided in subclass
      return ret if ret != false

      ## keyword or identifer
      if is_identchar(c)
        scan_ident()
        @token = keywords(@value) || PLOGIC_KEYWORDS[@value] || :ident
        return @token
      end

      ## "string"
      if c == ?"
        return scan_string_dquoted()
      end

      ## 'string'
      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