code: def parse(cls, line, ns={}):
          
          parses  = [p for p in cls.opts_spec.scanString(line)]
          if len(parses) != 1:
              raise SyntaxError("Invalid specification syntax.")
          else:
              e = parses[0][2]
              processed = line[:e]
              if (processed.strip() != line.strip()):
                  raise SyntaxError("Failed to parse remainder of string: %r" % line[e:])
  
          grouped_paths = cls._group_paths_without_options(cls.opts_spec.parseString(line))
          parse = {}
          for pathspecs, group in grouped_paths:
              options = {}
  
              normalization = cls.process_normalization(group)
              if normalization is not None:
                  options['norm'] = normalization
  
              if 'plot_options' in group:
                  plotopts =  group['plot_options'][0]
                  opts = cls.todict(plotopts, 'brackets', ns=ns)
                  options['plot'] = {cls.aliases.get(k,k):v for k,v in opts.items()}
  
              if 'style_options' in group:
                  styleopts = group['style_options'][0]
                  opts = cls.todict(styleopts, 'parens', ns=ns)
                  options['style'] = {cls.aliases.get(k,k):v for k,v in opts.items()}
  
              for pathspec in pathspecs:
                  parse[pathspec] = merge_option_dicts(parse.get(pathspec, {}), options)
  
          return {
              cls.apply_deprecations(path): {
                  option_type: Options(**option_pairs)
                  for option_type, option_pairs in options.items()
              }
              for path, options in parse.items()
          }
docs: Parse an options specification, returning a dictionary with
          path keys and {'plot':<options>, 'style':<options>} values.