# File lib/kwartz/parser.rb, line 613
    def parse(input, filename='')
      reset(input, filename)
      scan()
      rulesets = []
      while @token == :command     # '@import'
        command = @value
        case command
        when '@import'
          imported_rulesets = parse_import_command()
          rulesets += imported_rulesets
        when '@from'
          # TODO
        when '@import_pdata'
          # TODO
        else
          raise parse_error("#{command}: unsupported command.")
        end
      end
      while @token == :selector
        selectors = parse_selectors()
        unless @token == '{''{'
          raise parse_error("'#{@value}': '{' is expected.")  #'
        end
        @mode = :declaration
        _linenum, _column = @linenum, @column
        ruleset = Ruleset.new(selectors)
        parse_declaration(ruleset)
        unless @token
          raise parse_error("'#{selectors.first}': is not closed by '}'.", _linenum, _column)
        end
        @mode = :selector
        rulesets << ruleset
        scan()
      end
      unless @token == nil
        raise parse_error("'#{@value}': selector is expected.")
      end
      return rulesets
    end